网络编程
位置:首页>> 网络编程>> Python编程>> 详解爬虫被封的问题

详解爬虫被封的问题

作者:一只写程序的猿  发布时间:2021-01-29 15:21:16 

标签:爬虫,被封

如果你在爬虫过程中有遇到“您的请求太过频繁,请稍后再试”,或者说代码完全正确,可是爬虫过程中突然就访问不了,那么恭喜你,你的爬虫被对方识破了,轻则给予友好提示警告,严重的可能会对你的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)

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

以上所述是小编给大家介绍的爬虫被封的问题详解整合网站的支持!

来源:https://juejin.im/post/5cbe71c9f265da03a54c1d29

0
投稿

猜你喜欢

  • PIL:Python Imaging Library,已经是Python平台事实上的图像处理标准库了。PIL功能非常强大,但API却非常简单
  • 一,PHP脚本与动态页面。 PHP脚本是一种服务器端脚本程序,可通过嵌入等方法与HTML文件混合,也可以类,函数封装等形式,以模板的方式对用
  • IE 5.5 中的 JScript 版本是 5.5 版,它比以前版本的 JScript 中多了如数组的 push、pop、shift、uns
  • 继续练手,根据之前获取汽油价格的方式获取了金价,暂时没钱投资,看看而已#!/usr/bin/env python# -*- coding:
  • 本文以一段简单的监听鼠标、键盘事件的程序,实现获取用户的输入(比如登录某些网站的账号、密码)的功能。经测试,对于一台“裸奔”的电脑,完全能获
  • 背景简介ImageAI是一个面向计算机视觉编程的Python库,支持最先进的机器学习算法。主要图像预测,物体检测,视频对象检测与跟踪等多个应
  • ⭐️网页解析利器parsel实战我们以实际的案例,来具体了解学习其功能。我们在这里重点讲解其两种方式。一个是XPATH,一个是CSS。我们以
  • 在程序中,变量就是一个名称,让我们更加方便记忆。cars = 100 space_in_a_car = 4.0 drivers = 30 p
  • 1.现在有一个需求:我想在monitor应用中导入data文件夹下的apolos.py中的tes()函数并执行。打开monitor应用的视图
  • 前言加密技术在数据安全存储,数据传输中发挥着重要作用,能够保护用户隐私数据安全,防止信息窃取。RSA是一种非对称加密技术,在软件、网页中已得
  • 目录1. 理解进程2. 进程的语法3. join自定义进程类4. 守护进程总结1. 理解进程进程的概念:(process)进程就是正在运行的
  • 前言这次,我们要用Pygame写一个Pong游戏先看看效果:需要的模块:Pygame在python文件同目录下新建resources文件夹,
  • 前端开发部门在壮大,人员在增加,技术在进步。CSSer虽然不能代表前端开发团队,但CSSer是前端开发中非常重要的组成部分。一、文档写程序的
  • 给浏览器绑定事件有时候是非常痛苦的事情,不同的浏览器提供不尽相同的功能的同时,也提供了不同的事件。例如,IE 系列的浏览器支持 mousee
  • 对一个列表list而言,进行排序是很简单的。正序排序(从小到大)用list.sort() 倒序排序(从大到小)用list.sort
  • this指针是面向对象程序设计中的一项重要概念,它表示当前运行的对象。在实现对象的方法时,可以使用this指针来获得该对象自身的引用。和其他
  • 本文实例讲述了Python自动登录126邮箱的方法。分享给大家供大家参考。具体实现方法如下:import sys, urllib2, url
  • 我就废话不多说了,大家还是直接看代码吧!### 以下链接里面的codeimport numpy as npfrom keras.callba
  • 最近对H1的讨论很多(在文章内容页中),大致有以下两种情况:H1应该用于文章的标题上H1应该用于站点的标题上相信大多数人都偏向第一种方式:用
  • 如果是报名培训班的话,学习的速度可能会更快一些,毕竟是自己花钱了。自学python爬虫方法:首先要掌握一些有关爬虫的基础知识,基本的要知道什
手机版 网络编程 asp之家 www.aspxhome.com