详解爬虫被封的问题


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判断、获取一张图片主色调的2个实例
Apr 10 Python
Python挑选文件夹里宽大于300图片的方法
Mar 05 Python
Python编程之属性和方法实例详解
May 19 Python
100行Python代码实现自动抢火车票(附源码)
Jan 11 Python
python实现求最长回文子串长度
Jan 22 Python
pycharm下查看python的变量类型和变量内容的方法
Jun 26 Python
分享vim python缩进等一些配置
Jul 02 Python
python高阶爬虫实战分析
Jul 29 Python
django连接oracle时setting 配置方法
Aug 29 Python
Python定时发送天气预报邮件代码实例
Sep 09 Python
python创建ArcGIS shape文件的实现
Dec 06 Python
Python调用OpenCV实现图像平滑代码实例
Jun 19 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里的中文变量说明
2011/07/23 PHP
laravel容器延迟加载以及auth扩展详解
2015/03/02 PHP
PHP判断浏览器、判断语言代码分享
2015/03/05 PHP
PHP实现登录搜狐广告获取广告联盟数据的方法【附demo源码】
2016/10/14 PHP
php curl常用的5个经典例子
2017/01/20 PHP
实例讲解PHP表单处理
2019/02/15 PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
2020/04/04 PHP
常见的5个PHP编码小陋习以及优化实例讲解
2021/02/27 PHP
jBox 2.3基于jquery的最新多功能对话框插件 常见使用问题解答
2011/11/10 Javascript
js实现日历可获得指定日期周数及星期几示例分享(js获取星期几)
2014/03/14 Javascript
JS实现图片的不间断连续滚动的简单实例
2016/06/03 Javascript
jQuery中的ready函数与window.onload谁先执行
2016/06/21 Javascript
为Jquery EasyUI 组件加上清除功能的方法(详解)
2017/04/13 jQuery
Vue axios 中提交表单数据(含上传文件)
2017/07/06 Javascript
Three.js入门之hello world以及如何绘制线
2017/09/25 Javascript
Vue 动态设置路由参数的案例分析
2018/04/24 Javascript
js中null与空字符串&quot;&quot;的区别讲解
2019/01/17 Javascript
详解javascript对数组和json数组的操作
2019/04/15 Javascript
使用Angular9和TypeScript开发RPG游戏的方法
2020/03/25 Javascript
Vue实现浏览器打印功能的代码
2020/04/17 Javascript
JS实现电脑虚拟键盘打字测试
2020/06/24 Javascript
Vue项目打包部署到apache服务器的方法步骤
2021/02/01 Vue.js
Python获取SQLite查询结果表列名的方法
2017/06/21 Python
详解python string类型 bytes类型 bytearray类型
2017/12/16 Python
python方法生成txt标签文件的实例代码
2018/05/10 Python
python range()函数取反序遍历sequence的方法
2018/06/25 Python
python判断一个数是否能被另一个整数整除的实例
2018/12/12 Python
python3中确保枚举值代码分析
2020/12/02 Python
俄罗斯苹果优质经销商商店:iPort
2020/05/27 全球购物
大学应届生求职简历的自我评价
2013/10/08 职场文书
营销专业应届生求职信
2013/11/26 职场文书
国际经济与贸易专业大学生职业规划书
2014/03/01 职场文书
HR求职自荐信范文
2014/06/21 职场文书
pycharm2021激活码使用教程(永久激活亲测可用)
2021/03/30 Python
JavaScript文档对象模型DOM
2021/11/20 Javascript
Python机器学习应用之基于线性判别模型的分类篇详解
2022/01/18 Python