请求模块requests;代理服务

本文涉及的产品
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 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

相关文章
|
3月前
|
JSON 数据格式
请求模块requests(二)
请求模块requests(二)
73 12
|
3月前
|
网络安全 Python
请求模块requests:请求方式
请求模块requests(一)
54 9
|
3月前
|
数据采集 Web App开发 开发工具
|
4月前
|
JSON API 数据格式
Python网络编程:HTTP请求(requests模块)
在现代编程中,HTTP请求几乎无处不在。无论是数据抓取、API调用还是与远程服务器进行交互,HTTP请求都是不可或缺的一部分。在Python中,requests模块被广泛认为是发送HTTP请求的最简便和强大的工具之一。本文将详细介绍requests模块的功能,并通过一个综合示例展示其应用。
109 11
|
4月前
|
Web App开发 缓存 JSON
在打开网站时,HTTP请求流程是如何处理的
【8月更文挑战第20天】流程包括:构建请求(如`GET /index.html HTTP/1.1`)、检查本地缓存、获取服务器IP及端口、等待TCP连接队列、建立TCP连接、发送HTTP请求。服务器处理后返回数据与响应头,可选择保持连接开启以便后续请求重用,最后断开TCP连接。
|
4月前
|
数据采集 存储 监控
Haskell爬虫中日志记录:监控HTTP请求与响应
Haskell爬虫中日志记录:监控HTTP请求与响应
|
5月前
|
Shell Python
`pytest-httpserver`是一个pytest插件,它允许你在测试期间启动一个轻量级的HTTP服务器,并模拟HTTP请求和响应。
`pytest-httpserver`是一个pytest插件,它允许你在测试期间启动一个轻量级的HTTP服务器,并模拟HTTP请求和响应。
|
7月前
|
数据采集 网络协议 Python
requests和aiohttp中代理IP的使用
requests和aiohttp中代理IP的使用
554 3
|
7月前
|
网络协议 网络安全 API
Qt 网络编程之美:探索 URL、HTTP、服务发现与请求响应
Qt 网络编程之美:探索 URL、HTTP、服务发现与请求响应
752 1
|
7月前
|
数据挖掘 API 数据安全/隐私保护
python请求模块requests如何添加代理ip
python请求模块requests如何添加代理ip
478 0