如果你在爬虫过程中有遇到“您的请求太过频繁,请稍后再试”,或者说代码完全正确,可是爬虫过程中突然就访问不了,那么恭喜你,你的爬虫被对方识破了,轻则给予友好提示警告,严重的可能会对你的ip进行封禁,所以代理ip那就尤为重要了。今天我们就来谈一下代理ip,去解决爬虫被封的问题。
网上有许多代理ip,免费的,付费的。大多数公司爬虫会买这些专业版,对于普通人来说,免费的基本满足我们需要了,不过免费有一个弊端,时效性不强,不稳定,所以我们就需要对采集的ip进行一个简单的验证。
本文主要针对西刺代理,这个网站很早之前用过,不过那个时候它还提供免费的api,现在api暂不提供了,我们就写个简单的爬虫去采集。
打开西刺代理,有几个页面,果断选择高匿代理。
铬浏览器右键检查查看网络,不难发现,每个ip地址都在td标签中,对于我们来说就简单许多了,初步的想法就是获取所有的ip,然后校验可用性,不可用就剔除。
,
,定义匹配规则
进口再保险 ip_compile=re.compile (r & lt; td> (\ d + \ \ d + \ \ d + \ \ d +) & lt;/td>”) #匹配IP port_compile=re.compile (r & lt; td> (\ d +) & lt;/td>”) #匹配端口 >之前
2.1,关于淘宝IP地址库
目前提供的服务包括:
<李> 1。根据用户提供的IP地址,快速查询出该IP地址所在的地理信息和地理相关的信息,包括国家,省,市和运营商。李> <李> 2。用户可以根据自己所在的位置和使用的IP地址更新我们的服务内容。李>
我们的优势:
<李> 1。提供国家,省,市,县,运营商全方位信息,信息维度广,格式规范。李> <李> 2。提供完善的统计分析报表,省准确度超过99.8%,市准确度超过96.8%,数据质量有保障。李>
2.2,接口说明
请求接口(得到):
ip.taobao.com/service/get…
例:http://ip.taobao.com/service/getIpInfo2.php& # 63; ip=111.177.181.44
响应信息:
(json格式的)国家,省(自治区或直辖市)、市(县),运营商
返回数据格式:{“代码”:0,“数据”:{“ip”:“210.75.225.254”,“国家”:“\ u4e2d \ u56fd”、“区域”:“\ u534e \ u5317”, “地区”:“\ u5317 \ u4eac \ u5e02”、“城市”:“\ u5317 \ u4eac \ u5e02”、“县”:“”,“isp”:“\ u7535 \ u4fe1”, “country_id”:“86”,“area_id”:“100000”,“region_id”:“110000”,“city_id”:“110000”, “county_id”:“1”,“isp_id”: " 100017 "}} >之前其中代码的值的含义为,0:成功,1:失败。
注意:为了保障服务正常运行,每个用户的访问频率需小于10每秒。
我们先通过浏览器测试一下输入地址http://ip.taobao.com/service/getIpInfo2.php& # 63; ip=111.177.181.44
再次输入一个地址http://ip.taobao.com/service/getIpInfo2.php& # 63; ip=112.85.168.98
代码操作
进口的要求 check_api=" http://ip.taobao.com/service/getIpInfo2.php& # 63; ip=" api=check_api + ip 试一试:=响应请求。get (url=api,标题=api_headers超时=2) 打印(“ip: % s可用“% ip) 除了例外e: 打印(“此ip % s已失效:% s“% (ip, e)) >之前
代码中加入了异常处理,其实自己手写的演示写不写异常处理都可以,但是为了方便其他人调试,建议在可能出现异常的地方加入异常处理。进口的要求 进口再保险 进口随机 从bs4进口BeautifulSoup ua_list=[ “Mozilla/5.0 (Windows NT 10.0;Win64;x64) AppleWebKit/537.36 (KHTML,像壁虎)Chrome/72.0.3626.109 Safari 537.36”, “Mozilla/5.0 (X11;Linux x86_64) AppleWebKit/537.36 (KHTML,像壁虎)Chrome/62.0.3202.75 Safari 537.36”, “Mozilla/5.0(麦金塔电脑;Intel Mac OS X 10 _13_6) AppleWebKit/537.36 (KHTML,像壁虎)Chrome/72.0.3626.119 Safari 537.36”, “Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, likeGecko)铬/45.0.2454.101Safari/537.36” ] def ip_parse_xici(页面): ”“” :param页面:采集的页数 返回: ”“” ip_list=[] pg的范围(1,int(页面): url=' http://www.xicidaili.com/nn/' + str (pg) user_agent=random.choice (ua_list) my_headers={ “接受”:“text/html、application/xhtml + xml应用程序/xml;”, “接受编码”:“gzip、缩小,sdch”, “接收语言”:应用,zh型;q=0.8, “推荐人”:“www.xicidaili.com/nn' http://坝没Т怼?user_agent } 试一试: r=请求。get (url,标题=my_headers) 汤=BeautifulSoup (r。文本,“html.parser”) 除了requests.exceptions.ConnectionError: 打印(“ConnectionError”) 其他: data=https://www.yisu.com/zixun/soup.find_all (td) #定义IP和端口模式规则 ip_compile=re.compile (r & lt; td> (\ d + \ \ d + \ \ d + \ \ d +) & lt;/td>”) #匹配IP port_compile=re.compile (r & lt; td> (\ d +) & lt;/td>”) #匹配端口 ips=re.findall (ip_compile str(数据))#获取所有IP 港口=re.findall (port_compile str(数据))#获取所有端口 check_api=" http://ip.taobao.com/service/getIpInfo2.php& # 63; ip=" 因为我在范围(len (ips)): 如果我& lt;len (ips): ip=ips(我) api=check_api + ip api_headers={ “用户代理”:user_agent } 试一试:=响应请求。get (url=api,标题=api_headers超时=2) 打印(“ip: % s可用“% ip) 除了例外e: 打印(“此ip % s已失效:% s“% (ip, e)) 德尔ips(我) 德尔港口[我] ips_usable=坝盏级嗄苄浴? ip_list +=[': ' n . join (n)的zip (ips_usable、港口)]#列表生成式 打印(“第{}页ip采集完成“.format (pg)) 打印(ip_list) if __name__==癬_main__”: xici_pg=输入(“请输入需要采集的页数:") ip_parse_xici (=xici_pg页)详解爬虫被封的问题