详解爬虫被封的问题


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实现发送和获取手机短信验证码
Jan 15 Python
详解python3中socket套接字的编码问题解决
Jul 01 Python
python虚拟环境virtualenv的安装与使用
Sep 21 Python
python人民币小写转大写辅助工具
Jun 20 Python
linux安装Python3.4.2的操作方法
Sep 28 Python
python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)
Apr 18 Python
PYTHON绘制雷达图代码实例
Oct 15 Python
Pandas 缺失数据处理的实现
Nov 04 Python
python ubplot使用方法解析
Jan 10 Python
Python3连接Mysql8.0遇到的问题及处理步骤
Feb 17 Python
python使用Word2Vec进行情感分析解析
Jul 31 Python
python开发一个解析protobuf文件的简单编译器
Nov 17 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如何得到当前页和上一页的地址?
2006/11/27 PHP
PHP之uniqid()函数用法
2014/11/03 PHP
php编写的抽奖程序中奖概率算法
2015/05/14 PHP
PHP通过API获取手机号码归属地
2015/05/28 PHP
为Plesk PHP7启用Oracle OCI8扩展方法总结
2019/03/29 PHP
Smarty模板配置实例简析
2019/07/20 PHP
javascript 字符串连接的性能问题(多浏览器)
2008/11/18 Javascript
JQuery动态添加和删除表格行的方法
2015/03/09 Javascript
JavaScript 匿名函数和闭包介绍
2015/04/13 Javascript
JavaScript通过代码调用Flash显示的方法
2016/02/02 Javascript
jquery对dom节点的操作【推荐】
2016/04/15 Javascript
Bootstrap每天必学之折叠(Collapse)插件
2016/04/25 Javascript
JavaScript实现设计模式中的单例模式的一些技巧总结
2016/05/17 Javascript
谈谈target=_new和_blank的不同之处
2016/10/25 Javascript
微信小程序实战之自定义toast(6)
2017/04/18 Javascript
详解Vue-cli代理解决跨域问题
2017/09/27 Javascript
vue中的mescroll搜索运用及各种填坑处理
2019/10/30 Javascript
jquery轮播图插件使用方法详解
2020/07/31 jQuery
vue相同路由跳转强制刷新该路由组件操作
2020/08/05 Javascript
Vue项目开发常见问题和解决方案总结
2020/09/11 Javascript
Vue与React的区别和优势对比
2020/12/18 Vue.js
Python使用matplotlib绘制正弦和余弦曲线的方法示例
2018/01/06 Python
Python 解析简单的XML数据
2020/07/24 Python
REISS英国官网:伦敦High Street最受欢迎品牌
2016/12/21 全球购物
澳大利亚领先的运动鞋商店:Hype DC
2018/03/31 全球购物
医学专业毕业生推荐信
2013/11/14 职场文书
文明寄语大全
2014/04/11 职场文书
《蝙蝠和雷达》教学反思
2014/04/23 职场文书
慈善晚会策划方案
2014/05/14 职场文书
新闻学专业求职信
2014/07/28 职场文书
《一面五星红旗》教学反思
2016/02/23 职场文书
学校2016年九九重阳节活动总结
2016/04/01 职场文书
python实现腾讯滑块验证码识别
2021/04/27 Python
python3实现无权最短路径的方法
2021/05/12 Python
Python中字符串对象语法分享
2022/02/24 Python
Golang 实现WebSockets
2022/04/24 Golang