原文地址
分类目录——爬虫
Request Header(请求头)是在http协议中封装的内容,在在很多网站中,会对请求头中的信息有所要求,或者是因为用作验证来反爬虫,或者是获得浏览器的信息以提供针对性的反馈等等,当缺少这些请求头信息时,有些网站可能会对请求不予反馈,或者返回错误信息。
这就需要在通过代码访问的时候追加这些信息
下面以一个例子来说明
以 https://dig.chouti.com/ 这个网站为例,在浏览器中访问这个网站,在网页中右击 =》查看源代码
在通过代码访问时,当只传入url=‘https://dig.chouti.com/’
时,是无法获取网络的反馈的
r1 = requests.get(
url='https://dig.chouti.com/',
)
print(r1.text)
# 在这里只提供其中几行
#
#
# 网站防火墙
#
显然,只通过这个开头就可以发现这并不是我想要的网页,我的访问请求被它拒绝了
这是因为缺少请求头,是什么样的请求头呢。
在网页中可以通过F12 、 Ctrl+Shift+I 、 网页上右击 =》检查 (我用的谷歌浏览器)三种方式打开网页检查工具,进入Network选项卡下
首次进入下方应该是空白的,如果有内容,为了方便观察新请求,点击左上角部分的clear清空一下,然后刷新一下网页,这里就更新出很多请求与相应包,点击其中一个name
有变就会弹出改包的信息其中包括Request Method(请求方式)、Response Headers(相应头,这是服务器封装了反馈过来的)、Request Headers(请求头,这就是你请求这个网页时封装在请求包里发向服务器的,不过这些都是浏览器在后台做的事,我们是不会看到的),如果请求方式为post,可能还会有formdata之类的请求体,此处先不提
这里主要说的是Request Headers(请求头)
可以看到请求头包含了很多信息,但也并非所有的信息都是必须的,还有就是请求不同的网站,封装的请求头属性也是不尽相同的,还有些属性的属性值是动态的,可能来自Response Headers,可能是猫在网页中
这个网站对于User-Agent这个属性是必需的,下面就演示如何将请求头信息封装进request请求代码中
import requests
from bs4 import BeautifulSoup
# 有些网站会做限制,需要获得浏览器的一些信息,无这些信息将不会响应访问
r1 = requests.get(
url='https://dig.chouti.com/',
# 通过headers属性以字典形式传递请求头信息
headers={
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.100 Safari/537.36',
# 这里还可以以字典形式给出别的请求头属性
}
)
soup = BeautifulSoup(r1.text,'html.parser')
# 标签对象
content_body = soup.find(name='div', attrs={'class':'link-con'})
# print(content_list)
# [标签对象,标签对象]
title_list = content_body.find_all(name='div',attrs={'class':'link-detail'})
for title in title_list:
a = title.find(name='a',attrs={'class':'link-title link-statistics'})
print(a.text) # 获得a便签中的标题文字
# 这里只给出几个以供示例
# 三个男朋友,该如何取舍?
# 设计师自制概念视频:如果用苹果风格来设计 Windows 10(YouTube Avdan)
# 日本bauhutte公司设计的gaming bed“肥宅快乐床”,可以躺一辈子了
不同的网站根据开发者的设定对请求头有不同的需求,有时通过尝试不同的请求头属性可以解决一些通过代码无法访问的网站,但是应该明白防爬虫的机制远不止请求头一项