一、参考资料
二、反爬虫与反反爬虫
1.user-agent
参考资料:Python爬虫入门教程:超级简单的Python爬虫教程
反爬虫:服务器通过检查连接的user-agent判断是用户还是代码。超过某阈值的时候就会发验证码,没有验证就封杀。
反反爬虫:
打开浏览器复制user-agent至代码中,模仿浏览器访问,但是要注意设置访问速度,过快也会被封;
headers={‘User-Agent’:’Mozilla/5.0 (Windows NT 10.0; Win64; x64) ………. Safari/537.36’}
response = request.get(url,headers=headers) 设置延时防止被封: import time
time.sleep(3)构建user-agent代理池,随机使用里面的代理。(此处介绍使用第三方模块的,也可自己找几个UA然后构成list)
安装第三方工具:pip install fake-useragent 代码: from fake_useragent import UserAgent
实例化一个对象
ua=UserAgent()
随机获取一个ie浏览器ua
print(ua.ie)
随机获取一个火狐浏览器ua
print(ua.firefox)
随机获取一个谷歌浏览器ua
print(ua.chrome) 运行结果:

随机获取一个ua
print(ua.random) 运行结果:

此处使用自己找的几个UA然后构成list headers={‘User-Agent’:random.choice(ua_list)}
2.代理IP池
参考资料:
代理IP-proxies参数
反爬虫:
针对 IP 地址设置的反爬虫。比如,访问网站超过规定次数导致流量异常,或者某个时间段内频繁地更换浏览器访问,存在上述行为的 IP 极有可能被网站封杀掉。
反反爬虫:
代理 IP :使用IP池中的第三方IP代替自己去访问网站。突破了 IP 地址的访问限制,隐藏了本地网络的真实IP。不过可通过端口探测等技术识辨别。
- 构建自己的代理IP池,作为参数传给requests
import requests url =’http://httpbin.org/get‘ headers ={‘User-Agent’:’Mozilla/5.0’}
网上找的免费代理ip
proxies ={ ‘http’:’http://191.231.62.142:8000‘, ‘https’:’https://191.231.62.142:8000‘ } html = requests.get(url,proxies=proxies,headers=headers,timeout=5).text print(html)
输出结果:
{
“args”: {},
“headers”: {
“Accept”: “/“,
“Accept-Encoding”: “gzip, deflate”,
“Cache-Control”: “max-age=259200”,
“Host”: “httpbin.org”,
“User-Agent”: “Mozilla/5.0”,
“X-Amzn-Trace-Id”: “Root=1-605073b0-4f54db1b2d2cfc0c074a1193” },注意此处显示两个IP,第一个是你自己的真实IP,另外一个是对外展示的IP “origin”: “121.17.25.194, 191.235.72.144”,
“url”: “http://httpbin.org/get“ }
使用网上收费的代理IP,具体见以前笔记:《使用代理访问网站》
三、 提高抓取效率
1.网页超时规则
参考资料:
提高抓取效率
为了提高网页信息的抓取质量,减小网络波动带来的响应,我们可以设置一个规则:
在超时时间内(3秒),在该时间内对于请求失败的页面尝试请求三次,如果均未成功,则抓取下一个页面。
requests.get() 方法提供了 timeout 参数可以用来设置超时时间,此方法还提供了其他实用性参数,比如 auth(用户认证)、veryify(证书认证)、proxies(设置代理 IP),这在后续内容中会做相应介绍。
随机取一个UA
def get_header(self):
实例化ua对象
ua=UserAgent() headers={‘User-Agent’:ua.random} return headers
发送请求
def get_html(self,url):
在超时间内,对于失败页面尝试请求三次
if self.blog<=3: try: res=requests.get(url=url,headers=self.get_header(),timeout=3) html=res.text return html except Exception as e: print(e) self.blog+=1 self.get_html(url)
2.设置休息时间
time.sleep(random.randint(1,3))
