请求模块requests(五)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 请求模块requests(五)

代理服务
1、代理的应用
爬取网页过程中,之前能爬取的网友现在不能爬取了,这是因为您的IP被爬取网站的服务器屏蔽了。此时,代理服务器可以为您解决这一麻烦,设置代理时,首先需要找到代理地址,如:117.34.25.11:55443。代码如下:

#_*_coding:utf-8_*_
# 作者      :liuxiaowei
# 创建时间   :1/28/22 11:27 PM
# 文件      :通过代理服务发送请求.py
# IDE      :PyCharm

import requests      # 导入网络请求模块
# 头部信息
headers = {
   'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36'}
proxy = {
   'http': 'http://117.34.25.11:55443',
         'https': 'https://117.34.25.11:55443'}  # 设置代理ip与对应的端口号
try:
    # 对需要爬取的网页发送请求
    response = requests.get('http://202020.ip138.com', headers= headers,proxies=proxy,verify=False,timeout=30)
    print(response.status_code)  # 打印响应状态码
except Exception as e:
    print('错误异常信息为:',e)    # 打印异常信息

程序运行结果如下:

错误异常信息为: HTTPConnectionPool(host='117.34.25.11', port=55443): Max retries exceeded with url: http://202020.ip138.com/ (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x7fe394ba1580>, 'Connection to 121.232.148.230 timed out. (connect timeout=30)'))

说 明:

由于代理IP是免费的,所以使用的时间不固定,地址失效或者地址错误时,会报错。

2、获取免费的代理IP
为了避免爬取目标网页的后台服务器,对我们实施封锁IP的操作。我们可以没发送一次网络请求更换一个IP,从而降低被发现风险。就地取材,通过爬取免费代理IP的网页提取大量代理IP并保存至文件中。示例代码如下:

#_*_coding:utf-8_*_
# 作者      :liuxiaowei
# 创建时间   :1/29/22 6:04 PM
# 文件      :获取免费代理IP-kuaidaili.com.py
# IDE      :PyCharm

import requests  # 导入网络请求模块
from lxml import etree  # 导入HTML解析模块
import pandas as pd  # 导入pandas模块

import ssl

ssl._create_default_https_context = ssl._create_unverified_context
ip_list = []  # 创建保存ip地址的列表


def get_ip(url, headers):
    # 发送网络请求
    response = requests.get(url, headers=headers, verify=False)
    response.encoding = 'utf-8'  # 设置编码方式
    if response.status_code == 200:  # 判断请求是否成功
        html = etree.HTML(response.text)  # 解析HTML
        # 获取所有带有IP的td标签
        td_all = html.xpath("//tr/td[@data-title='IP']/text()")
        # 获取所有端口
        td_port = html.xpath("//tr/td[@data-title='PORT']/text()")
        for i in range(len(td_all)):  # 遍历每行内容
            ip = td_all[i]
            port = td_port[i]
            ip_list.append(ip + ':' + port)  # 将ip与端口组合并添加至列表当中
            print('代理ip为:', ip, '对应端口为:', port)

    return ip_list # 返回一个ip+por的列表

# 请求头
headers = {
   'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36'}

# 定义一个空IP列表
ip_s = []
if __name__ == '__main__':
    ip_table = pd.DataFrame(columns=['ip'])  # 创建临时表格数据
    for i in range(1, 5):
        # 请求地址
        url = f'https://www.kuaidaili.com/free/inha/{i}/'
        # https://www.kuaidaili.com/free/inha/3/
        ip_s += get_ip(url, headers)
    ip_table['ip'] = ip_s  # 将提取的ip保存至excel文件中的ip列
    # 生成xlsx文件
    ip_table.to_excel('ip.xlsx', sheet_name='data')

运行结果如下:

代理ip为: 101.34.214.152 对应端口为: 8001
代理ip为: 14.215.212.37 对应端口为: 9168
代理ip为: 14.215.212.37 对应端口为: 9168
代理ip为: 61.216.156.222 对应端口为: 60808
代理ip为: 106.15.197.250 对应端口为: 8001
代理ip为: 60.170.204.30 对应端口为: 8060
代理ip为: 120.24.76.81 对应端口为: 8123
代理ip为: 152.136.62.181 对应端口为: 9999
代理ip为: 14.215.212.37 对应端口为: 9168
代理ip为: 111.59.199.58 对应端口为: 8118
代理ip为: 222.74.73.202 对应端口为: 42055
代理ip为: 183.195.106.118 对应端口为: 8118
代理ip为: 111.59.199.58 对应端口为: 8118
代理ip为: 106.15.197.250 对应端口为: 8001
代理ip为: 111.59.199.58 对应端口为: 8118

image.png

3、检测代理IP是否有效
根据免费代理IP的网页有很多,但是经过测试会发现并不是所有的免费代理IP都是有效的。所以要使用我们爬下来的免费代理IP,就需要对这个IP进行检测。

实现检测免费代理IP是否可用,首先需要读取保存免费代理IP的文件,然后对代理IP进行遍历并使用免费的代理IP发送网络请求,而请求地址可以使用查询IP位置的网页。如果网络请求成功说明免费的代理IP可以使用,并且还会返回当前免费代理IP的匿名地址。代码如下:

#_*_coding:utf-8_*_
# 作者      :liuxiaowei
# 创建时间   :1/29/22 1:48 PM
# 文件      :检测代理IP是否有效.py
# IDE      :PyCharm


# import requests  # 导入网络请求模块
# import pandas    # 导入pandas模块
# from lxml import etree  # 导入HTML解析模块
#
# ip_table = pandas.read_excel('ip.xlsx')  # 读取代理IP文件内容
# ip = ip_table['ip']                      # 获取代理ip列信息
# # 头部信息
# headers = {
   'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7),' \
#                                         'AppleWebKit/537.36 (KHTML, like Gecko) ,'\
#                                         'Chrome/97.0.4692.99 Safari/537.36'}
# # 循环遍历代理IP并通过代理发送网络请求
# for i in ip:
#     proxies = {
   'http': 'http://{ip}'.format(ip=i),
#                'https': 'https://{ip}'.format(ip=i)}
#     try:
#         response = requests.get('https://httpbin.org/',
#                                 headers=headers,proxies=proxies,timeout=2, verify=False)
#         if response.status_code==200:   # 判断请求是否成功,请求成功说明代理IP可用
#             response.encoding='utf-8'     # 进行编码
#             html = etree.HTML(response.text)  # 解析HTML
#             info = html.xpath('/html/body/p[1]//text()')
#             print(info)                 # 输出当前ip匿名信息
#     except Exception as e:
#         pass
#         #print('错误异常信息为:',e)    # 打印异常信息

import requests  # 导入网络请求模块
import pandas    # 导入pandas模块
from lxml import etree  # 导入HTML解析模块

ip_table = pandas.read_excel('ip.xlsx')  # 读取代理IP文件内容
ip = ip_table['ip']                      # 获取代理ip列信息
# 头部信息
headers = {
   'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36'}
# 循环遍历代理IP并通过代理发送网络请求
for i in ip:
    proxies = {
   'http': 'http://{ip}'.format(ip=i),
               'https': 'https://{ip}'.format(ip=i)}
    try:
        response = requests.get('http://2021.ip138.com/',         # ip138.com域名查询网
                                headers=headers,proxies=proxies,timeout=2, verify=False)
        if response.status_code==200:   # 判断请求是否成功,请求成功说明代理IP可用
            response.encoding='utf-8'     # 进行编码
            html = etree.HTML(response.text)  # 解析HTML
            info = html.xpath('/html/body/p[1]//text()')
            print(info)                 # 输出当前ip匿名信息
    except Exception as e:
        pass
        # print('错误异常信息为:',e)    # 打印异常信息

运行结果如下:

['\n您的iP地址是:[', '14.215.212.37', '] 来自:中国广东东莞 电信\n']
['\n您的iP地址是:[', '222.74.73.202', '] 来自:中国内蒙古赤峰 电信\n']
['\n您的iP地址是:[', '14.215.212.37', '] 来自:中国广东东莞 电信\n']
['\n您的iP地址是:[', '183.195.106.118', '] 来自:中国上海上海 移动\n']
['\n您的iP地址是:[', '14.215.212.37', '] 来自:中国广东东莞 电信\n']
['\n您的iP地址是:[', '60.170.204.30', '] 来自:中国安徽蚌埠淮上区 电信\n']
['\n您的iP地址是:[', '111.3.118.247', '] 来自:中国浙江台州仙居县 移动\n']
['\n您的iP地址是:[', '60.170.204.30', '] 来自:中国安徽蚌埠淮上区 电信\n']
['\n您的iP地址是:[', '111.3.118.247', '] 来自:中国浙江台州仙居县 移动\n']
['\n您的iP地址是:[', '60.170.204.30', '] 来自:中国安徽蚌埠淮上区 电信\n']
['\n您的iP地址是:[', '61.216.185.88', '] 来自:中国台湾屏东 中華電信\n']
['\n您的iP地址是:[', '111.3.118.247', '] 来自:中国浙江台州仙居县 移动\n']
['\n您的iP地址是:[', '101.200.123.105', '] 来自:中国北京北京 阿里云\n']
['\n您的iP地址是:[', '14.215.212.37', '] 来自:中国广东东莞 电信\n']
['\n您的iP地址是:[', '60.170.204.30', '] 来自:中国安徽蚌埠淮上区 电信\n']
['\n您的iP地址是:[', '14.215.212.37', '] 来自:中国广东东莞 电信\n']
['\n您的iP地址是:[', '222.74.73.202', '] 来自:中国内蒙古赤峰 电信\n']
['\n您的iP地址是:[', '111.3.118.247', '] 来自:中国浙江台州仙居县 移动\n']
['\n您的iP地址是:[', '60.170.204.30', '] 来自:中国安徽蚌埠淮上区 电信\n']
['\n您的iP地址是:[', '14.215.212.37', '] 来自:中国广东东莞 电信\n']
['\n您的iP地址是:[', '60.170.204.30', '] 来自:中国安徽蚌埠淮上区 电信\n']
['\n您的iP地址是:[', '14.215.212.37', '] 来自:中国广东东莞 电信\n']

总 结:

image.png

相关文章
|
10天前
|
JSON 数据格式
请求模块requests(二)
请求模块requests(二)
37 12
|
10天前
|
数据采集 Web App开发 开发工具
请求模块requests(三)
请求模块requests(三)
32 9
|
10天前
|
数据安全/隐私保护
请求模块requests(四)
请求模块requests(四)
30 9
|
10天前
|
网络安全 Python
请求模块requests(一)
请求模块requests(一)
32 9
|
15天前
|
数据采集 Python
Flask获取post,get参数,以及 爬虫 requests的get,post参数详解
Flask获取post,get参数,以及 爬虫 requests的get,post参数详解
|
2月前
|
JSON API 数据格式
Python网络编程:HTTP请求(requests模块)
在现代编程中,HTTP请求几乎无处不在。无论是数据抓取、API调用还是与远程服务器进行交互,HTTP请求都是不可或缺的一部分。在Python中,requests模块被广泛认为是发送HTTP请求的最简便和强大的工具之一。本文将详细介绍requests模块的功能,并通过一个综合示例展示其应用。
|
3月前
|
存储 运维 Java
函数计算产品使用问题之如何使用Python的requests库向HTTP服务器发送GET请求
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
101 8
|
4月前
|
JSON API 数据格式
Requests库:轻松实现Python中的HTTP请求
Requests是Python的第三方HTTP库,简化了HTTP请求的发送,支持GET、POST等方法。要安装,使用`pip install requests`。Requests以其简洁API和强大功能成为网络编程首选工具,为开发者提供高效稳定的网络交互体验。
124 5
|
5月前
|
数据采集 网络协议 Python
requests和aiohttp中代理IP的使用
requests和aiohttp中代理IP的使用
416 3
|
5月前
|
JSON API 数据格式
使用Python的`requests`库进行HTTP请求
【4月更文挑战第12天】在Python中,`requests`库是发送HTTP请求的一个非常流行的工具。它提供了简单且强大的API,使得开发者能够轻松地与RESTful API或其他网络服务进行交互。本文将介绍如何使用`requests`库进行基本的HTTP请求,包括GET、POST等请求方法,以及如何处理响应和异常。