代理服务
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
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']
总 结: