爬虫为什么被封了(详解爬虫被封的问题)
爬虫为什么被封了
详解爬虫被封的问题如果你在爬虫过程中有遇到“您的请求太过频繁,请稍后再试”,或者说代码完全正确,可是爬虫过程中突然就访问不了,那么恭喜你,你的爬虫被对方识破了,轻则给予友好提示警告,严重的可能会对你的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. 根据用户提供的ip地址,快速查询出该ip地址所在的地理信息和地理相关的信息,包括国家、省、市和运营商。
- 2. 用户可以根据自己所在的位置和使用的ip地址更新我们的服务内容。
我们的优势:
- 1. 提供国家、省、市、县、运营商全方位信息,信息维度广,格式规范。
- 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
- python获取天气源(Python3爬虫之自动查询天气并实现语音播报)
- python 操作html(Python HTML解析模块HTMLParser用法分析爬虫工具)
- python爬虫request方法介绍(详解Python3网络爬虫二:利用urllib.urlopen向有道翻译发送数据获得翻译结果)
- python爬虫模块教程(Python爬虫之UserAgent的使用实例)
- python 常用爬虫库(Python常用爬虫代码总结方便查询)
- python3.8爬虫需要的包(python爬取基于m3u8协议的ts文件并合并)
- Python HTML解析器BeautifulSoup用法实例详解【爬虫解析器】(Python HTML解析器BeautifulSoup用法实例详解爬虫解析器)
- python爬虫爬取网页信息教程(python爬虫爬取微博评论案例详解)
- pycharm 爬虫的数据存在哪了(利用PyCharm Profile分析异步爬虫效率详解)
- python pyqt 教程(Python+PyQt5实现美剧爬虫可视工具的方法)
- nginx过滤器漏洞(Nginx反爬虫策略,防止UA抓取网站)
- python 爬虫图形验证码(Python爬虫实现验证码登录代码实例)
- python网页自动化selenium(python利用selenium进行浏览器爬虫)
- 如何查看python beautifulsoup(Python爬虫beautifulsoup4常用的解析方法总结)
- python爬虫开源代码(Python实现的文轩网爬虫完整示例)
- python爬虫10分钟教程(浅谈Python爬虫基本套路)
- 她救了被绑架的他,而这一切竟是一场阴谋...(她救了被绑架的他)
- 冬季养殖这6种阴生植物,方便又好养,你家有么(冬季养殖这6种阴生植物)
- 阴生植物为什么不怕照不到阳光(阴生植物为什么不怕照不到阳光)
- 阴生环境 耐阴地被植物,你知道哪些(阴生环境耐阴地被植物)
- 常见的喜阴植物有哪些 养室内盆栽就在这里选(常见的喜阴植物有哪些)
- 这8种耐阴植物,营造阴生植物花境,也是一个不错的选择(营造阴生植物花境)
热门推荐
- 阿里云对象存储oss收费吗(阿里云存储服务OSS基本概念)
- docker部署go项目(Gogs+Jenkins+Docker 自动化部署.NetCore的方法步骤)
- 微信小程序计数器代码(微信小程序实现计算器案例)
- python默认缩进设置(不归路系列:Python入门之旅-一定要注意缩进!!!推荐)
- python语言提供的3种基本数据类型(详解Python3 基本数据类型)
- drools动态执行规则(使用swoole 定时器变更超时未支付订单状态的解决方案)
- pythonlist列表讲解(Python中将两个或多个list合成一个list的方法小结)
- javascript检测内容改变了(JavaScript 检测文件的类型的方法)
- js字符串常用函数
- tensorflow卷积网络(TensorFlow卷积神经网络之使用训练好的模型识别猫狗图片)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9