详解爬虫被封的问题


Posted in Python onApril 23, 2019

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

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

1.目标采集

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

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

详解爬虫被封的问题

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

 详解爬虫被封的问题

 定义匹配规则

import re

ip_compile = re.compile(r'<td>(\d+\.\d+\.\d+\.\d+)</td>') # 匹配IP
port_compile = re.compile(r'<td>(\d+)</td>') # 匹配端口

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

2.1、关于淘宝IP地址库

目前提供的服务包括:

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

我们的优势:

  1. 1. 提供国家、省、市、县、运营商全方位信息,信息维度广,格式规范。
  2. 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 requests

check_api = "http://ip.taobao.com/service/getIpInfo2.php?ip="
api = check_api + ip
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))

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

import requests
import re
import random

from bs4 import BeautifulSoup

ua_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 requests

url = '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)

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

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

Python 相关文章推荐
Python中Collection的使用小技巧
Aug 18 Python
Python操作CouchDB数据库简单示例
Mar 10 Python
pygame学习笔记(1):矩形、圆型画图实例
Apr 15 Python
Python求解任意闭区间的所有素数
Jun 10 Python
python面向对象入门教程之从代码复用开始(一)
Dec 11 Python
python从子线程中获得返回值的方法
Jan 30 Python
python遍历文件目录、批量处理同类文件
Aug 31 Python
关于numpy数组轴的使用详解
Dec 05 Python
python orm 框架中sqlalchemy用法实例详解
Feb 02 Python
Python爬虫爬取有道实现翻译功能
Nov 27 Python
Python批量将csv文件转化成xml文件的实例
May 10 Python
详解PyTorch模型保存与加载
Apr 28 Python
Python3.5 Pandas模块缺失值处理和层次索引实例详解
Apr 23 #Python
Python3.5 Pandas模块之DataFrame用法实例分析
Apr 23 #Python
Python3.5 Pandas模块之Series用法实例分析
Apr 23 #Python
使用Python控制摄像头拍照并发邮件
Apr 23 #Python
详解Python静态网页爬取获取高清壁纸
Apr 23 #Python
Python matplotlib画图与中文设置操作实例分析
Apr 23 #Python
Python实现的删除重复文件或图片功能示例【去重】
Apr 23 #Python
You might like
php 实现一个字符串加密解密的函数实例代码
2016/11/01 PHP
用函数式编程技术编写优美的 JavaScript_ibm
2008/05/16 Javascript
javascript dom 操作详解 js加强
2009/07/13 Javascript
被jQuery折腾得半死,揭秘为何jQuery为何在IE/Firefox下均无法使用
2010/01/22 Javascript
js弹窗返回值详解(window.open方式)
2014/01/11 Javascript
node.js中的fs.fchown方法使用说明
2014/12/16 Javascript
兼容Firefox的Javascript XSLT 处理XML文件
2014/12/31 Javascript
实例剖析AngularJS框架中数据的双向绑定运用
2016/03/04 Javascript
React.js入门学习第一篇
2016/03/30 Javascript
ionic 上拉菜单(ActionSheet)实例代码
2016/06/06 Javascript
微信小程序 获取微信OpenId详解及实例代码
2016/10/31 Javascript
Angular.JS实现无限级的联动菜单(使用demo)
2017/02/08 Javascript
js实现tab切换效果
2017/02/16 Javascript
基于AGS JS开发自定义贴图图层
2017/03/31 Javascript
NodeJS实现微信公众号关注后自动回复功能
2017/05/31 NodeJs
vue2.0实现分页组件的实例代码
2017/06/22 Javascript
详解vuejs之v-for列表渲染
2017/06/22 Javascript
[js高手之路]设计模式系列课程-发布者,订阅者重构购物车的实例
2017/08/29 Javascript
jQury Ajax使用Token验证身份实例代码
2017/09/22 Javascript
利用CDN加速react webpack打包后的文件详解
2018/02/22 Javascript
原生JavaScript创建不可变对象的方法简单示例
2020/05/07 Javascript
Python中有趣在__call__函数
2015/06/21 Python
python列表的常用操作方法小结
2016/05/21 Python
利用Python脚本生成sitemap.xml的实现方法
2017/01/31 Python
Python基于pygame模块播放MP3的方法示例
2017/09/30 Python
Python反射用法实例简析
2017/12/22 Python
安装python时MySQLdb报错的问题描述及解决方法
2018/03/20 Python
英国最大的在线运动补充剂商店:Discount Supplements
2017/06/03 全球购物
台湾租车首选品牌:IWS艾维士租车
2019/05/03 全球购物
解决python 输出到csv 出现多空行的情况
2021/03/24 Python
劲霸男装广告词改编版
2014/03/21 职场文书
小学教师自我剖析材料
2014/09/29 职场文书
学习三严三实心得体会
2014/10/13 职场文书
关于运动会广播稿50字
2014/10/18 职场文书
项目备案申请报告
2015/05/15 职场文书
超详细Python解释器新手安装教程
2021/05/10 Python