详解爬虫被封的问题


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中处理异常的教程
May 24 Python
python实现实时监控文件的方法
Aug 26 Python
对pandas的dataframe绘图并保存的实现方法
Aug 05 Python
Python基础语言学习笔记总结(精华)
Nov 14 Python
python调用Delphi写的Dll代码示例
Dec 05 Python
python中的文件打开与关闭操作命令介绍
Apr 26 Python
python实现textrank关键词提取
Jun 22 Python
Pandas删除数据的几种情况(小结)
Jun 21 Python
Python实现UDP程序通信过程图解
May 15 Python
jupyter notebook的安装与使用详解
May 18 Python
Matplotlib中rcParams使用方法
Jan 05 Python
Elasticsearch 批量操作
Apr 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
虫族 Zerg 魔法科技
2020/03/14 星际争霸
PHP下几种删除目录的方法总结
2007/08/19 PHP
php动态绑定变量的用法
2015/06/16 PHP
PHP crypt()函数的用法讲解
2019/02/15 PHP
javascript返回顶部效果(自写代码)
2013/01/06 Javascript
Jquery封装tab自动切换效果的具体实现
2013/07/13 Javascript
基于JavaScript实现弹出框效果
2016/02/19 Javascript
vue.js全局API之nextTick全面解析
2017/07/07 Javascript
JavaScript反射与依赖注入实例详解
2018/05/29 Javascript
Vuex 单状态库与多模块状态库详解
2018/12/11 Javascript
Vue.js + Nuxt.js 项目中使用 Vee-validate 表单校验
2019/04/22 Javascript
详解如何在JS代码中消灭for循环
2019/12/11 Javascript
Python面向对象编程中的类和对象学习教程
2015/03/30 Python
Python MySQLdb模块连接操作mysql数据库实例
2015/04/08 Python
Python中index()和seek()的用法(详解)
2017/04/27 Python
详解Python下ftp上传文件linux服务器
2018/06/21 Python
django从请求到响应的过程深入讲解
2018/08/01 Python
Python爬虫之UserAgent的使用实例
2019/02/21 Python
python 循环数据赋值实例
2019/12/02 Python
python3中pip3安装出错,找不到SSL的解决方式
2019/12/12 Python
python实现UDP协议下的文件传输
2020/03/20 Python
tensorflow实现从.ckpt文件中读取任意变量
2020/05/26 Python
Python flask框架端口失效解决方案
2020/06/04 Python
详解numpy.ndarray.reshape()函数的参数问题
2020/10/13 Python
戴森比利时官方网站:Dyson BE
2020/10/03 全球购物
标准自荐信范文
2014/01/29 职场文书
幼儿园中秋节活动方案
2014/02/06 职场文书
有创意的广告词
2014/03/18 职场文书
综合实践活动报告
2015/02/05 职场文书
2015年综治维稳工作总结
2015/04/07 职场文书
创业计划书之甜品店
2019/09/18 职场文书
Win11怎么跳过联网验机 ?Win11跳过联网验机激活教程
2022/04/05 数码科技
vue中this.$http.post()跨域和请求参数丢失的解决
2022/04/08 Vue.js
java高级用法JNA强大的Memory和Pointer
2022/04/19 Java/Android
instantclient客户端 连接oracle数据库
2022/04/26 Oracle
阿里云国际版 使用Nginx作为HTTPS转发代理服务器
2022/05/11 Servers