python爬虫ip封禁应对办法
目录
一、背景现象
二、准备工作
三、代码实现
一、背景现象
最近在做爬虫项目时,爬取的网站,如果发送请求太频繁的话,对方网站会先是响应缓慢,最后是封禁一段时间。一直是拒绝连接,导致程序无法正常预期的爬取数据。针对这种情况,可以使用代理ip请求来规避,同时增加一些随机等待时间(如果性能要求不高)。
二、准备工作
若要用代理ip去请求,那首先要有一个或多个代理ip。代理ip的获取可以寻找专门搜集提供代理ip的网站(如果有私人或公用的代理ip就更好了),直接使用即可。
这里注意一般提供的代理ip会有匿名程度,有透明、普匿、高匿等。如果你使用了匿名程度为透明的ip去请求,那么代理ip方会看到你用人家的ip干了什么,就是说你的行为透明化对于代理ip提供方。相反高匿,你的行为不会对代理ip提供方公开。
三、代码实现
基本思路就是使用代理ip进行请求,获取请求响应返回。使用request库,配置请求代理ip即可。
import requests
import random
from retrying import retry# 代理ip
proxy_list = ['http://ip:port','http://ip:port'
]reqSession = requests.Session()
# # 也可以直接设置全局
# reqSession.proxies = {
# 'http': 'http://121.37.195.205:80',
# 'https': 'http://121.37.195.205:80',
# }@retry(stop_max_attempt_number=10, wait_random_min=10000, wait_random_max=50000)
def get_detail_data(page_url):# 随机选取一个ip使用,避免一直使用一个ip,导致被封禁。one_proxy = random.choice(proxy_list)proxy = {'http': one_proxy,'https:': one_proxy}resPage = reqSession.get(page_url, headers=headers, proxies=proxy, timeout=100)if resPage.status_code != 200:raisereturn resPage.text
四、总结
虽然现在可以解决ip封禁的问题,但是代码还是有一些隐形问题的。后续如果你使用的代理ip若失效了,但你不知道或没有及时更换的情况。解决办法是将代理ip存储到数据库,另外写一个爬虫程序去收集代理ip,更换数据库里的代理ip。业务爬虫程序读取数据库里的代理ip去进行请求。同时可以设置程序异常发送邮件,这样也可以及时定位问题。