User-Agent 反爬虫绕过实战
User-Agent爬虫指的是服务器通过校验请求头中的User-Agent值来区分正常用户和爬虫程序的手段,这是一种较为初级的反爬虫手段。
"""
User-Agent 反爬虫绕过实战
实例1.校园新闻网列表页User-Agent反爬虫
任务:爬取校园新闻网站页面右侧“本周热点”列表中的新闻标题
URL:http://www.porters.vip/verify/uas/index.html
"""
import requests
from parsel import Selector
url = 'http://www.porters.vip/verify/uas/index.html'
#向目标网站发起请求
resp = requests.get(url=url)
#打印输出状态码
print(resp.status_code)
#如果本次请求的状态码为200,则继续,否则提示失败
if resp.status_code == 200:
sel = Selector(resp.text)
#根据HTML标签和属性从响应正文中提取新闻标题
res = sel.css('.list-group-item::text').extract()
print(res)
else:
print('This request is Fial !')
请求并没有成功,但是浏览器可以正常打开,这是为什么呢?难道是网站出了什么问题,我们可以用Postman试一试,Postman请求结果如下
浏览器和工具都可以正常访问,偏偏爬虫程序不行,肯定是遇到反爬虫了。但是他究竟是如何识别爬虫的呢?3种不同的客户端,意味着3种不同的客户端身份标识,而在HTTP中只有User-Agent是最接近标识这个答案的,我们不妨试一下,在爬虫程序中使用浏览器或者Postman的身份标识。Requests库允许使用自定义的请求头,我们将代码改为:
import requests
from parsel import Selector
url = 'http://www.porters.vip/verify/uas/index.html'
headers = {"User-Agent":"Postman"}
#向目标网站发起请求
resp = requests.get(url=url,headers=headers)
#打印输出状态码
print(resp.status_code)
#如果本次请求的状态码为200,则继续,否则提示失败
if resp.status_code == 200:
sel = Selector(resp.text)
#根据HTML标签和属性从响应正文中提取新闻标题
res = sel.css('.list-group-item::text').extract()
print(res)
else:
print('This request is Fial !')
运行结果如下:
状态码为200,说明这次的请求得到了正常响应。运行结果中的标题列表说明我们已经绕过了目标服务器的反爬虫手段,爬取到了目标数据。
User-Agent 反爬虫原理与实现
浏览器是一种用于检索并展示万维网信息资源的应用程序,这些信息资源可以是网页、图片、影音、其他内容,他们由统一资源标识符标识。信息资源中的超链接可使用户方便地浏览相关信息。使用浏览器在各个网页之间跳转其实就是访问不同的信息资源。
能向服务器发起请求的客户端不仅有浏览器,还有Android应用程序、网络请求应用软件和变成语言等。服务器会根据客服端传递的信息以及身份信息返回客服端所希望收到的内容,那么服务器如何得知客户端到底是什么程序呢?
User-Agent就是请求头域之一,服务器能够从Usere-Aget对应的值中识别客户端使用的操作系统,CPU类型、浏览器、浏览器引擎、操作系统语言等。
在网络请求中,User-Agent是客户端表明身份的一种标识,服务器通常通过该头域的值来判断客户端的类型。要注意User-Agent头域并非不可或缺,而且它的值可以改变。
之所以选择Usesr-Agent头域作为校验对象,是因为很多编程语言你和软件有默认的标识。在发起网络请求的时候,这个标识会作为请求头参数中的User-Agent被发送到服务器。比如Python中的Requests库向服务器发起HTTP请求时,服务器读取的User-Agent值为:
python-requests/2.21.0
既然客户端发起请求会将User-Agent发送给服务器,那么我们只需要在服务器端对User-Agent头域值进行校验即可,通过则返回200,不通过则返回403.
小结
由于User-Agent 头域的存在,服务器可以使用黑名单结合条件判断实现针对性较强的反爬虫。除了User-Agent之外,常见的用于反爬虫的头域还有Host和Referer。这种验证请求头信息中特定头域的方式即可以有效地屏蔽长期无人维护地爬虫,也可以将一些爬虫初学者发起地网络请求拒之门外,但是对于一些经验丰富地爬虫工程师,或许需要更巧妙地反爬虫手段。