第八章,反爬虫问题

来源:互联网 发布:淘宝大件物流怎么设置 编辑:程序博客网 时间:2024/06/05 05:50

8.1 为什么会被反爬虫

浪费网站网络资源
数据值钱


8.2反爬虫的方式有哪些

在实际的爬虫过程中会遇到各种问题,可以大致将其分成以下三类.
1. 不返回网页,如不返回内容和延迟网页返回时间
2. 返回数据非网页,如返回错误页,返回空白页和爬取多页时均返回同一页
3. 增加获取数据的难度,如登录才可以查看和登录时设置验证码

8.2.1不返回网页

发出请求后返回404页面

  1. 首先,网站会通过IP访问量反爬虫,所以通常网站会对访问进行统计,如果单个IP的访问量超过了某个阈值,就会进行封杀或要求输入验证码
  2. 其次,网站会通过session访问量反爬虫。session的意思”会话控制”,session对象存储特定用户会话所需的属性和配置信息。这样,当用户在应用程序的Web页跳转时,存储在session对象中的变量将不会丢失,而是在整个应用会话中一直存在下去。如果一个session的访问量过大,就会进程封杀或要求输入验证码。
  3. 此外,网站也会通过User-Agent的反爬虫。User-Agent表示浏览器在发送请求时,附带当前浏览器和当前环境的参数给服务器,我们可以在Chrome浏览器的审查元素中找到。

当我们使用requests库进行爬虫的时候,默认的User-Agent为python、2.8.1(后面的版本号可能不同)。当服务器判断这个不是真正的浏览器时会予以封锁,或者当单个User-Agent的访问超过阈值的时候予以封锁,但是这样会误伤正常用户。


8.2.3获取数据变难

一般登录才可以查看数据,而且会设置验证码。为了限制爬虫,无论你是否是真的用户,网站都可能会要求你登录并输入验证码才能访问。例如:12306
8.3如何“反反爬虫”
对于如何让爬虫顺利进行下去,中心思想是让爬虫程序看起来更像正常用户的浏览行为。

8.3.1修改请求头

import requestsr = requests.get(url)print(r.request.headers)import requestslink = "www.baidu.com"headers = {'User-Agent':'Mozilla/5.0(Windows;U;Windows NT6.1;en-US;rv:1.9.1.6)Gecko/20091201 Firfox/3.5.6'}r = requests.get(link,headers =headers)

此外,我们也可以做一个User-Agent的池,并且随机切换User-Agent。还可以在header中写上Host和Referer

8.3.2修改爬虫的间隔

爬虫太频密,对网站不好,页容易被反爬虫

import timet1 = time.time()time.sleep(2)t2 = time.time()total_time = t2-t1print(total_time)

如果使用一个固定的数字作为时间间隔,就可能使爬虫不太像正常用户的行为。所以可以用python的random库进行随机数设置

import timeimport randomsleep_time = random.randint(0,2)+random.random()print(sleep_time)time.sleep(sleep_time)

8.3.3使用代理

代理(Proxy)是一种特殊的网络服务,允许一个网络终端一般为(客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的链接。形象地说,代理就是网络的中转站。代理服务器就像一个大的缓冲,这样能够显著提高浏览速度和效率。
我们也可以维护一个代理IP池,从而让爬虫程序隐藏自己的真实IP。网上有很多免费的代理,良莠不齐,可以通过筛选找到能用的。但代理IP池维护起来非常麻烦,而且不稳定。以下是IP获取网页的办法

import requestslink = "http://santostang.com"proxies = {'http':'http://xxx.xxx.xxx.xxx:xxxx'}response = requests.get(link,proxies = proxies)
原创粉丝点击