浏览器抓取网页(第14.5节利用浏览器获取的http信息构造Python网页访问的请求头)
优采云 发布时间: 2021-11-15 10:00浏览器抓取网页(第14.5节利用浏览器获取的http信息构造Python网页访问的请求头)
Python访问网页并读取网页内容非常简单。在《第一节4.5 使用浏览器获取的HTTP信息构造Python网页访问的HTTP请求头》的方法中,构造了请求http报文的方法。在请求头的情况下,使用 urllib 包的请求模块使这项工作变得非常容易。具体声明如下:
header = mkhead()
req = urllib.request.Request(url=site,headers=header)
sitetext = urllib.request.urlopen(req).read().decode()
urllib.request.Request 和 urllib.request.urlopen 两句也可以合二为一。我不会在这里详细介绍它们。相关说明请参考:
阐明:
1、 国内的decode的参数一般都是默认值,UTF-8、GBK,如果是默认值就是UTF-8;
2、站点是访问网站的网站;
3、headers 参数为http消息头的内容,请参考《第一节4.1 学习通过Python爬取网页的步骤》或《第一节4.3使用谷歌》浏览网站访问的http信息>中介绍的http消息头的知识,在实际设置中,header的内容可多可少,根据爬虫访问网站的要求而定:
1)headers 参数不能传实参,也可以是空字典实参。如果不传递实参,系统默认使用空字典。在这种情况下,Python 会自动添加一些内容让 web 服务器正确处理,这些值具有很强的 Pythonic 风味,可以让服务器很容易知道它们是由 Python 生成填充的。您可以使用抓包程序查看具体的填充值。这对爬虫来说不是什么好事,因为爬虫更能伪装成普通浏览器来访问;
2)headers 填写一些参数,老袁建议填写以下参数:
User-Agent:表示正在使用的浏览器。关于它的历史,请参考《Re: 为什么浏览器的user-agent字符串以“Mozilla”开头?》,具体值可以网上查,最好的方法是直接抓取真实浏览器的数据并填写比如老猿直接使用本地浏览器的信息:
用户代理:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.@ >0.3809.100 Safari/537.36
请参考“第一节4.3使用谷歌浏览器获取网站访问的http信息”和“第一节4.4使用IE浏览器获取网站”章节访问了 http 信息”。
接受:表示本机作为客户端浏览器可以接受的MIME类型(互联网媒体类型)是本机可以识别和处理的互联网信息类型。最好是从本机或其他真机上抓取和填写。比如老猴子抓取本地浏览器发送的请求信息中,填写的值为:'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp ,image/ apng,/;q=0.8,application/signed-exchange;v=b3'
Accept-Encoding:浏览器可以支持的压缩编码方式,如gzip、deflate、br等。服务器的消息体的压缩格式记录在响应消息头部的Content-Encodin字段中. 在http请求中,Accept-Encoding用于告知服务器客户端可以识别的压缩格式,服务器根据字段和服务器的情况使用相应的方法对http消息体进行压缩。注意,如果应用程序不考虑服务器端http消息体的解压,则不应设置该值,否则应用程序将无法识别接收到的响应消息体。有关 HTTP 响应头的信息,请参阅“传输:
Accept-Language:客户端浏览器需要的语言类型,当服务端可以提供一种以上的语言版本时使用,如zh-CN,zh;q=0.9等;
Connection:表示是否需要长连接,keep-alive表示长连接;
cookie:会话cookie信息,如果想复用已有的浏览器会话而不实现登录管理,可以直接复制已有浏览器会话的cookie,否则要么应用自行实现登录网站,否则将是匿名访问。具体可以根据自己的爬虫应用的要求确定处理方式。
以上信息建议根据爬虫功能的需要进行设置,但必须设置User-Agent,让应用看起来像普通浏览器。
案例:以下是老袁访问其博客文章的代码:
<p>>>> import urllib.request
>>> def mkhead():
header = {\'Accept\':\'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3\',
\'Accept-Language\':\'zh-CN,zh;q=0.9\',
\'Connection\':\'keep-alive\',
\'Cookie\':\'uuid_tt_dd=10_35489889920-1563497330616-876822; ...... \',
\'User-Agent\':\'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36\'}
return header
>>> url= r\'https://blog.csdn.net/LaoYuanPython\'
>>> header=mkhead()
>>> req = urllib.request.Request(url=url,headers=header)
>>> text = urllib.request.urlopen(req).read().decode()
>>> text[0:100]
\'\n\n\n \n