虽然比较初级,但非常常见的反爬手段,还是记录一下。 示例网站:“https://www.baidu.com” 所需工具:Postman、Chrome浏览器
1、Chrome浏览器打开网站,观察源代码(Ctrl+U)。 2、Postman打开目标网站,观察源代码。如图: 3、python编写代码(不带User_Agent的代码)
import urllib.request response = urllib.request.urlopen("https://www.baidu.com") print(response.status) print(response.read().decode("utf-8"))观察得到的响应结果。 4、我们发现Chrome和Postman拿到的源代码差不多,都可以正常显示网页,而python得到的结果虽然状态标识是200,但是得到的源代码明显跟前两个不一样,少了很多内容。肯定遇到反爬虫了。 那么他究竟是如何识别爬虫的呢? 3种不同的方式访问,只有python的被拒绝了,而且是第一次就被拒绝了。3种不同的客户端,意味着可能有3种不同的客户端身份标识,而在HTTP中只有User_Agent是最接近身份标识这个答案的。 尝试一下 修改我们的代码验证一下。
import urllib.request url = "https://www.baidu.com" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) " "Chrome/83.0.4103.116 Safari/537.36 " } req = urllib.request.Request(url=url, headers=headers, method="GET") response = urllib.request.urlopen(req, timeout=5) print(response.status) print(response.read().decode("utf8")) # 带上ua伪装显示的html结果跟浏览器查看源码得到的结果基本一致。观察得到的网页源代码,可以发现我们通过给发送的请求加上User_Agent已经成功绕过反爬虫措施,拿到的网页源码跟浏览器拿到的一样了。 实际上来说,这样去找原因比较低效,遇到返回结果不对的时候,我们直接在代码上带上User_Agent在去访问一次。
浏览器实际上是一种用于检索并展示万维网信息资源的应用程序。可以访问各种服务器,并把内容展示给我们看。 但是除了浏览器,Android应用程序、网络请求应用软件和编程语言都可以实现这样的功能。而服务器就是通过User_Agent标识来识别对方客户端是什么程序的。 浏览器User_Agent头域值得格式为:
浏览器标识(操作系统标识;加密等级标识;浏览器语言)渲染引擎标识 版本信息
例如: User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36 浏览器通过标识知道我们是Chrome浏览器访问的。 当我们使用python中的requests库向服务器发送请求时,服务器可以读取到User_Agent值为:
python-requests/2.21.0
使用java和php等其他语言编写时也常设置有默认标识,但并不是全都有,取决于开发者。
而服务器在接收请求时会对User_Agent进行校验,那么服务器如果把“python、java”等关键字预先添加进了黑名单,在检测到这些关键字的时候,就可以实现User_Agent反爬,返回不一样的结果。
由于User_Agent头域的存在,服务器可以利用黑名单机制,实现User_Agent反爬。常见的用于反爬的头域还有Host、Referer。编写程序的时候养成习惯加上User_Agent。拜拜