反爬虫

反爬虫 是网站限制爬虫的一种策略。它并不是禁止爬虫(完全禁止爬虫几乎不可能,也可能误伤正常用户),而是限制爬虫,让爬虫在网站可接受的范围内爬取数据,不至于导致网站瘫痪无法运行。而且只要是爬虫获取的数据基本上都是用户可以看到的数据,所以理论上公网上的数据都可以通过爬虫来获取到,但是很多网站爬取的数据不可用来商用!

常见的反爬虫方式有判别身份IP限制两种

判别身份

有些网站在识别出爬虫后,会拒绝爬虫的访问,比如豆瓣。我们以豆瓣图书 Top250 为例,如果用爬虫直接爬取它

import requests
res = requests.get('https://book.douban.com/top250')
print(res.text)

输出结果为空,什么都没有。这是因为豆瓣将我们的爬虫识别了出来并拒绝提供内容。
不管是浏览器还是爬虫,访问网站时都会带上一些信息用于身份识别。而这些信息都被存储在一个叫 请求头(request headers)的地方。
服务器会通过请求头里的信息来判别访问者的身份。请求头里的字段有很多,我们只需了解 user-agent(用户代理)即可。user-agent 里包含了操作系统、浏览器类型、版本等信息,通过修改它我们就能成功地伪装成浏览器。

我们首先打开浏览器的开发者工具,然后按照图中的步骤,先点击 Network 标签(里面记录了所有网络请求),然后在左边的列表中找到第一个请求(如果请求太多需要往上翻),点击第一个请求后,在右边的详情中找到 Request Headers 里的 user-agent 字段即可。

因此我们需要修改请求头里的 user-agent 字段内容,将爬虫伪装成浏览器。我们只需定义一个 字典(请求头字段作为键,字段内容作为值)传递给 headers 参数即可。我们将刚刚找到的浏览器的 user-agent 复制粘贴到代码里:

import requests# 从浏览器中复制粘贴的请求头
headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'
}
res = requests.get('https://book.douban.com/top250', headers=headers)
print(res.text)

判别身份是最简单的一种反爬虫方式,我们也能通过一行代码,将爬虫伪装成浏览器轻易地绕过这个限制。所以,大部分网站还会进行 IP 限制 防止过于频繁的访问。

IP限制

当我们爬取大量数据时,如果我们不加以节制地访问目标网站,会使网站超负荷运转,一些个人小网站没什么反爬虫措施可能因此瘫痪。而大网站一般会限制你的访问频率,因为正常人是不会在 1s 内访问几十次甚至上百次网站的。

所以,如果访问过于频繁,即使改了 user-agent 伪装成浏览器了,也还是会被识别为爬虫,并限制你的 IP 访问该网站。

因此,我们常常使用 time.sleep() 来降低访问的频率,比如上一节中的爬取整个网站的代码,我们每爬取一个网页就暂停一秒。这样,对网站服务器的压力不会太大虽然速度较慢,但也能获取到我们想要的数据了。
除了降低访问频率之外,我们也可以使用代理来解决 IP 限制的问题。代理的意思是通过别的 IP 访问网站。这样,在 IP 被封后我们可以换一个 IP 继续爬取数据,或者每次爬取数据时都换不同的 IP,避免同一个 IP 访问的频率过高,这样就能快速地大规模爬取数据了。


和 headers 一样,也是定义一个字典,但传递给的是 proxies 参数。我们需要将 http 和 https 这两种协议作为键,对应的 IP 代理作为值,最后将整个字典作为 proxies 参数传递给 requests.get() 方法即可。
官方文档中给了代理的基本用法,但在爬取大量数据时我们需要很多的 IP 用于切换。因此,我们需要建立一个 IP 代理池(列表),每次从中随机选择一个传给 proxies 参数。

import requests
import random
from bs4 import BeautifulSoupdef get_douban_books(url, proxies):headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'}# 使用代理爬取数据res = requests.get(url, proxies=proxies, headers=headers)soup = BeautifulSoup(res.text, 'html.parser')items = soup.find_all('div', class_='pl2')for i in items:tag = i.find('a')name = tag['title']link = tag['href']print(name, link)url = 'https://book.douban.com/top250?start={}'
urls = [url.format(num * 25) for num in range(10)]
# IP 代理池(瞎写的并没有用)
proxies_list = [{"http": "http://10.10.1.10:3128","https": "http://10.10.1.10:1080",},{"http": "http://10.10.1.11:3128","https": "http://10.10.1.11:1080",},{"http": "http://10.10.1.12:3128","https": "http://10.10.1.12:1080",}
]
for i in urls:# 从 IP 代理池中随机选择一个proxies = random.choice(proxies_list)get_douban_books(i, proxies)

robots.txt

robots.txt 是一种存放于网站根目录下的文本文件,用于告诉爬虫此网站中的哪些内容是不应被爬取的,哪些是可以被爬取的。

我们只要在网站域名后加上 /robots.txt 即可查看,比如豆瓣读书的 robots.txt 地址是:https://book.douban.com/robots.txt。打开它后的内容如下:

  1. User-agent: * 表示针对所有爬虫(* 是通配符),接下来是符合该 user-agent 的爬虫要遵守的规则。比如Disallow: /search 表示禁止爬取 /search 这个页面,其他同理。
  2. robots.txt 也能针对某一个爬虫限制,比如最后的 User-agent: Wandoujia Spider 表示针对Wandoujia Spider 这个爬虫,Disallow: / 表示禁止整个网站的爬取。
  3. 但是robots.txt只是一个君子协议,网站只是告诉大家哪些页面禁止爬取数据,并不能阻止你去爬取。即便如此,我们还是应该遵守规则,下次在爬取网站时,记得先打开该网站的robots.txt 查看哪些页面可以爬取数据,哪些页面禁止爬取数据。

转载自网络部黄铮同学

反爬虫的常见应对方法相关推荐

  1. Python爬虫编程常见问题解决方法

    Python爬虫编程常见问题解决方法 参考文章: (1)Python爬虫编程常见问题解决方法 (2)https://www.cnblogs.com/xpwi/p/9604015.html (3)htt ...

  2. 反爬虫机制和破解方法汇总

    https://cloud.tencent.com/developer/article/1032918 什么是爬虫和反爬虫? 爬虫:使用任何技术手段,批量获取网站信息的一种方式. 反爬虫:使用任何技术 ...

  3. 爬虫中的那些反爬虫措施以及解决方法

     在爬虫中遇到反爬虫真的是家常便饭了,这篇博客我想结合我自己的经验将遇到过的那些问题给出来,并给出一些解决方案. 1.UserAgent   UserAgent的设置能使服务器能够识别客户使用的操作系 ...

  4. python反爬虫技术及其应对

    通常见到的反爬虫技术大致可以分为如下几类: 1.请求头headers 2.用户操作的网站行为 3.网站目录数据加载方式 4.数据加密 5.验证码识别 最为头疼的就是验证码识别,暂时没有完美的解决方案. ...

  5. 微软10月20日反盗版行动的应对方法

    1.消极型应对:关闭系统的自动更新,用360的"修复系统漏洞"功能,选择性地下载安装补丁,切记,kb892130和kb905474是正版验证补丁,千万别装. 2.亡羊补牢型:对已经 ...

  6. 爬虫原理及反爬虫机制以及反爬虫方法的应对策略

    爬虫原理及反爬虫机制 关于爬虫 爬虫原理 反爬虫机制 1.检验数据头User-Agent反爬虫机制解析: 2.访问频率限制或检验 3.蜜罐技术 反爬虫机制的应对方法 1.设定Request Heade ...

  7. 爬虫,反爬虫和反反爬虫

    转自:https://blog.csdn.net/yixuandong9010/article/details/75861233 随之大数据的火热,网络上各种网页抓取/爬虫工具蜂拥而来,因而,网页数据 ...

  8. python网络爬虫系列(八)——常见的反爬手段和解决方法

    常见的反爬手段和解决思路 学习目标 了解 服务器反爬的原因 了解 服务器常反什么样的爬虫 了解 反爬虫领域常见的一些概念 了解 反爬的三个方向 了解 常见基于身份识别进行反爬 了解 常见基于爬虫行为进 ...

  9. 【爬虫进阶】常见的反爬手段和解决方法(建议收藏)

    爬虫进阶:常见的反爬手段和解决思路 1 服务器反爬的原因 2 服务器常反什么样的爬虫 3 反爬虫领域常见的一些概念 4 反爬的三个方向 5 常见基于身份识别进行反爬 5.1 通过headers字段来反 ...

最新文章

  1. ios Standard Framework和Umbrella Framework
  2. 【原】NSMutableArray的alloc、init方法与array的区别疑问
  3. Python 正则表达式 匹配任意字符
  4. 按钮添加边框和边框色
  5. javaweb学习总结(四十四)——监听器(Listener)学习
  6. 一张图带你了解 Insider Dev Tour 2019中国技术大会
  7. php数组遍历相同的元素覆盖_php获取数组中重复数据的两种方法
  8. 【注】【精】【火】博主考研去了,现在的博文都是以前的笔记或者算法。
  9. 2018北科大计算机学院复试方案,2018年北京交通大学考研复试及录取办法
  10. php redis 集群 长连接池,php如何实现redis连接池
  11. app中的h5游戏分享到微信等第三方
  12. [Xcode]XcodeGhost问题的检查和验证
  13. C# PDF操作之-PDF转WORD
  14. 无法启动此程序 因为计算机中丢失msvcr71.dll,win7系统弹出对话框提示“msvcr71.dll丢失”如何解决...
  15. mysql binlog 查看pos点_查看MySQL日志数据binlog文件
  16. 两张ID卡,完美消除互相干扰合二为一,实现“一卡”正反两用。
  17. android hidl简单实例1
  18. android list嵌套list,Android开发日常-listVIiew嵌套webView回显阅读位置
  19. springboot发送邮件-163邮箱
  20. 密歇根安娜堡大学计算机科学教授,密歇根大学安娜堡分校计算机专业排名 美国计算机专业大学TOP10...

热门文章

  1. c语言课程设计台球厅系统,Monstarrr
  2. Unity中物体碰撞后去掉相互之间的反弹力
  3. imap收件服务器无响应,imap设置收件服务器
  4. golang range函数
  5. Apache-Trace method服务问题
  6. python测试试岗内容
  7. 行为驱动:Cucumber + Selenium + Java(一) - 环境搭建
  8. python龙旋风图形代码_python – 龙卷风momoko不处理连接
  9. git socks5 代理
  10. element-ui 使用时遇到的一些坑