开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 6 天,点击查看活动详情
有时候编写的爬虫没有问题,但是就是请求不到内容,这是因为服务器应用了反爬技术,针对这些可以使用某些伪装技术来突破,本文就来介绍如何把爬虫伪装成一个浏览器请求。
此前我们接触过简单的反反爬技术,比如设置Headers中的User-Agent字段,可以应付一些网站,但有时候就不够看了,在了解爬虫的伪装技术之前先来介绍一下网站的反爬技术。
网站常见的反爬机制
- 通过检测Headers信息的反爬。
- 通过检测用户行为的反爬(例如某个Ip频繁访问,可以通过代理池反反爬)
- 通过设置动态网页反爬
常见爬虫伪装技术
第一种是比较常见的反爬技术,例如前面提到的UA检测,通过设置Header的某些字段来判断是否是爬虫,除了UA还可以是Referer字段,针对这些的反反爬也很简单,在爬虫中设置好UA和referer字段即可;第二种可以通过代理池切换IP来解决;第三种可以通过一些分析或者是selenium+phantomJS来解决,总结如下:
- 完善请求头信息,referer字段一般可以设置为目标网站域名地址或者对应网站的主页网址。
- 将Fiddler设置成代理服务器以此来伪装成浏览器。
将Fiddler设置为代理服务器有时候过于麻烦,则可以使用下面代码来实现高度相似地模拟浏览器:
import urllib.request
import http.cookiejar
url="http://www.baidu.com"
headers={"Accept":text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Encoding":"gb2312,utf-8",
"Accept-Language":zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",
"Connection":"keep-alive",
"regerer":baidu.com"}
cjar=http.cookiejar.CookieJar()
opener=urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cjar))
headall=[]
for key,value in headers.items();
item={key,value)
headall.append(item)
urllib.request.install_opener(opener)
data=urllib.request.urlopen(url).read()
fhandle=open("D:/Python35/myweb/part8/3.html","wb")
fhandle.write(data)
fhandle.close()