Python爬虫要经历爬虫,爬虫被限制,爬虫反限制的过程。当然后续还要网页爬虫限制优化,爬虫再反限制的一系列道高一尺魔高一丈的过程。爬虫的初级阶段,添加标题和ip代理可以解决很多问题。
本人自己在爬取豆瓣读书的时候,就以为爬取次数过多,直接被封了IP。后来就研究了代理IP的问题。
(当时不知道什么情况,差点心态就崩了…),下面给大家介绍一下我自己代理IP爬取数据的问题,请大家指出不足之处。
这是我的IP被封了,一开始好好的,我还以为是我的代码问题了
从网上查找了一些关于爬虫代理IP的资料,得到下面的思路
-
<李>爬取一些IP,过滤掉不可用。李>
<李>在请求的请求的代理参数加入对应的IP。李>
<李>继续爬取。李>
<李>收工李>
<李>好吧,都是废话,理论大家都懂,上面直接上代码…李>
思路有了,动手起来。
Python 3.7, Pycharm
这些需要大家直接去搭建好环境……
-
<李>爬取IP地址的网站(国内高匿代理)李>
<李>校验IP地址的网站李>
<李>你之前被封IP的py爬虫脚本…李>
上面的网址看个人的情况来选取
PS:简单的使用bs4获取IP和端口号,没有啥难度,里面增加了一个过滤不可用IP的逻辑
关键地方都有注释了
# !/usr/bin/env python3 # - * -编码:utf - 8 - * # @Time: 2018/11/22 # @Author: liangk # @Site: # @File: auto_archive_ios.py # @Software: PyCharm 进口的要求 从bs4进口BeautifulSoup 进口json 类GetIp(对象): ””“抓取代理IP”“” def __init__(自我): ”““初始化变量”“” 自我。url=' http://www.xicidaili.com/nn/' 自我。check_url=' https://www.ip.cn/' 自我。ip_list=[] @staticmethod def get_html (url): ”“请求html页面信息”“ 头={ “用户代理”:“Mozilla/5.0 (Windows NT 10.0;Win64;AppleWebKit x64)/537.36 (KHTML,像壁虎)Chrome/70.0.3538.77 Safari/537.36” } 试一试: 请求=请求。得到(url=url,标题=头) 请求。utf - 8编码=' ' html=request.text 返回的html 除了例外e: 回报” def get_available_ip(自我、ip_address ip_port): ”““检测IP地址是否可用“”“ 头={ “用户代理”:“Mozilla/5.0 (Windows NT 10.0;Win64;AppleWebKit x64)/537.36 (KHTML,像壁虎)Chrome/70.0.3538.77 Safari/537.36” } ip_url_next='://+ ip_address +‘:’+ ip_port 代理={“http”:“http”+ ip_url_next,“https”:“https”+ ip_url_next} 试一试: r=requests.get(自我。check_url header=头,=3=代理,代理超时) html=r.text 除了: 打印('失败——% s ' % ip_address) 其他: 打印('成功——% s ' % ip_address) 汤=BeautifulSoup (html、lxml的) div=soup.find (class_='好') 如果div: 打印(div.text) ip_info={“地址”:ip_address,“港”:ip_port} self.ip_list.append (ip_info) def主要(自我): ””“主方法”“” web_html=self.get_html (self.url) 汤=BeautifulSoup (web_html lxml的) ip_list=soup.find (id=癷p_list”) .find_all (tr) 在ip_list ip_info: td_list=ip_info.find_all (td) 如果len (td_list)比;0: ip_address=td_list [1]。text ip_port=td_list [2]。text #检测IP地址是否有效 自我。get_available_ip (ip_address ip_port) #写入有效文件 张开(“ip。txt”、“w”)文件: json.dump(自我。ip_list、文件) 打印(self.ip_list) #程序主入口 if __name__==癬_main__”: get_ip=GetIp () get_ip.main ()
PS:主要是通过使用随机的IP来爬取,根据request_status来判断这个IP是否可以用。
<强>为什么要这样判断& # 63;强>
主要是虽然上面经过了过滤,但是不代表在你爬取的时候是可以用的,所以还是得多做一个判断。