香港云主机最佳企业级服务商!

ADSL拨号VPS包含了中国大陆(联通,移动,电信,)

中国香港,国外拨号VPS。

当前位置:云主机 > python >

电信ADSL拨号VPS
联通ADSL拨号VPS
移动ADSL拨号VPS

详解爬虫被封的问题


时间:2022-04-02 10:30 作者:admin610456


如果你在爬虫过程中有遇到“您的请求太过频繁,请稍后再试”,或者说代码完全正确,可是爬虫过程中突然就访问不了,那么恭喜你,你的爬虫被对方识破了,轻则给予友好提示警告,严重的可能会对你的ip进行封禁,所以代理ip那就尤为重要了。今天我们就来谈一下代理IP,去解决爬虫被封的问题。

网上有许多代理ip,免费的、付费的。大多数公司爬虫会买这些专业版,对于普通人来说,免费的基本满足我们需要了,不过免费有一个弊端,时效性不强,不稳定,所以我们就需要对采集的ip进行一个简单的验证。

1.目标采集

本文主要针对西刺代理,这个网站很早之前用过,不过那个时候它还提供免费的api,现在api暂不提供了,我们就写个简单的爬虫去采集。

打开西刺代理,有几个页面,果断选择高匿代理。

Chrome浏览器右键检查查看network,不难发现,每个ip地址都在td标签中,对于我们来说就简单许多了,初步的想法就是获取所有的ip,然后校验可用性,不可用就剔除。

定义匹配规则

import reip_compile = re.compile(r'<td>(\d+\.\d+\.\d+\.\d+)</td>') # 匹配IPport_compile = re.compile(r'<td>(\d+)</td>') # 匹配端口

2.校验 这里我使用淘宝ip地址库检验可用性

2.1、关于淘宝IP地址库

目前提供的服务包括:

    1. 根据用户提供的IP地址,快速查询出该IP地址所在的地理信息和地理相关的信息,包括国家、省、市和运营商。 2. 用户可以根据自己所在的位置和使用的IP地址更新我们的服务内容。

我们的优势:

    1. 提供国家、省、市、县、运营商全方位信息,信息维度广,格式规范。 2. 提供完善的统计分析报表,省准确度超过99.8%,市准确度超过96.8%,数据质量有保障。

2.2、接口说明

请求接口(GET):
ip.taobao.com/service/get…
例:http://ip.taobao.com/service/getIpInfo2.php?ip=111.177.181.44
响应信息:
(json格式的)国家 、省(自治区或直辖市)、市(县)、运营商
返回数据格式:

{"code":0,"data":{"ip":"210.75.225.254","country":"\u4e2d\u56fd","area":"\u534e\u5317","region":"\u5317\u4eac\u5e02","city":"\u5317\u4eac\u5e02","county":"","isp":"\u7535\u4fe1","country_id":"86","area_id":"100000","region_id":"110000","city_id":"110000","county_id":"-1","isp_id":"100017"}}

其中code的值的含义为,0:成功,1:失败。
注意:为了保障服务正常运行,每个用户的访问频率需小于10qps。
我们先通过浏览器测试一下

输入地址http://ip.taobao.com/service/getIpInfo2.php?ip=111.177.181.44

再次输入一个地址http://ip.taobao.com/service/getIpInfo2.php?ip=112.85.168.98

代码操作

import requestscheck_api = "http://ip.taobao.com/service/getIpInfo2.php?ip="api = check_api + iptry:  response = requests.get(url=api, headers=api_headers, timeout=2)  print("ip:%s 可用" % ip)except Exception as e:  print("此ip %s 已失效:%s" % (ip, e))

3.代码
代码中加入了异常处理,其实自己手写的demo写不写异常处理都可以,但是为了方便其他人调试,建议在可能出现异常的地方加入异常处理。

import requestsimport reimport randomfrom bs4 import BeautifulSoupua_list = [  "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36",  "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36",  "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36",  "Mozilla / 5.0(Windows NT 6.1;WOW64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 45.0.2454.101Safari / 537.36"  ]def ip_parse_xici(page):  """  :param page: 采集的页数  :return:  """  ip_list = []  for pg in range(1, int(page)):    url = 'http://www.xicidaili.com/nn/' + str(pg)    user_agent = random.choice(ua_list)    my_headers = {      'Accept': 'text/html, application/xhtml+xml, application/xml;',      'Accept-Encoding': 'gzip, deflate, sdch',      'Accept-Language': 'zh-CN,zh;q=0.8',      'Referer': 'http: // www.xicidaili.com/nn',      'User-Agent': user_agent    }    try:      r = requests.get(url, headers=my_headers)      soup = BeautifulSoup(r.text, 'html.parser')    except requests.exceptions.ConnectionError:      print('ConnectionError')    else:      data = soup.find_all('td')      # 定义IP和端口Pattern规则      ip_compile = re.compile(r'<td>(\d+\.\d+\.\d+\.\d+)</td>') # 匹配IP      port_compile = re.compile(r'<td>(\d+)</td>') # 匹配端口      ips = re.findall(ip_compile, str(data)) # 获取所有IP      ports = re.findall(port_compile, str(data)) # 获取所有端口      check_api = "http://ip.taobao.com/service/getIpInfo2.php?ip="      for i in range(len(ips)):        if i < len(ips):          ip = ips[i]          api = check_api + ip          api_headers = {            'User-Agent': user_agent          }          try:            response = requests.get(url=api, headers=api_headers, timeout=2)            print("ip:%s 可用" % ip)          except Exception as e:            print("此ip %s 已失效:%s" % (ip, e))            del ips[i]            del ports[i]      ips_usable = ips      ip_list += [':'.join(n) for n in zip(ips_usable, ports)] # 列表生成式      print('第{}页ip采集完成'.format(pg))  print(ip_list)if __name__ == '__main__':  xici_pg = input("请输入需要采集的页数:")  ip_parse_xici(page=xici_pg)

运行代码:

4.为你的爬虫加入代理ip

建议大家可以把采集的ip存入数据库,这样每次爬虫的时候直接调用即可,顺便提一下代码中怎么加入代理ip。

import requestsurl = 'www.baidu.com'headers = {  "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36",}proxies = {  "http": "http://111.177.181.44:9999",  # "https": "https://111.177.181.44:9999",}res = requests.get(url=url, headers=headers, proxies=proxies)

好了,妈妈再也不担心我爬虫被封了

以上所述是小编给大家介绍的爬虫被封的问题详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

(责任编辑:admin)






帮助中心
会员注册
找回密码
新闻中心
快捷通道
域名登录面板
虚机登录面板
云主机登录面板
关于我们
关于我们
联系我们
联系方式

售前咨询:17830004266(重庆移动)

企业QQ:383546523

《中华人民共和国工业和信息化部》 编号:ICP备00012341号

Copyright © 2002 -2018 香港云主机 版权所有
声明:香港云主机品牌标志、品牌吉祥物均已注册商标,版权所有,窃用必究

云官方微信

在线客服

  • 企业QQ: 点击这里给我发消息
  • 技术支持:383546523

  • 公司总台电话:17830004266(重庆移动)
  • 售前咨询热线:17830004266(重庆移动)