详解爬虫被封的问题

  

如果你在爬虫过程中有遇到“您的请求太过频繁,请稍后再试”,或者说代码完全正确,可是爬虫过程中突然就访问不了,那么恭喜你,你的爬虫被对方识破了,轻则给予友好提示警告,严重的可能会对你的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页)      

详解爬虫被封的问题