[ ’ 西安回民街有什么好吃的?’ , ’ 西安有哪些值得逛的宝藏店铺?’ , ’ 西安哪些商圈承载着你的青春?’ , ’ 你有哪些好的驾驶习惯可以分享?’ , ’ 有哪些只有经验丰富的司机才知道的驾驶技巧?’ , ’ 有车的注意了,这些开车知识每个人都要掌握,关键时刻能救命 ’ , ’ 欢迎着陆!知乎宇宙成员招募通告’ , ’ 星球登陆问题:给你十块钱穿越到未来,怎样才能混得风生水起?’ , ’ 星球登陆问题:知乎宇宙中的「超能量」你最希望拥有哪一种?你会如何使用它?’ , ’ 挪威三文鱼,原产地至关重要 ’ , ’ 挪威最吸引人的地方有哪些?’ , ’ 生活在挪威是一种 什么体验?’ , ’ 如何看待京东方 AMOLED 柔性屏量产?未来前景如何?’ , ’ 柔性屏能不能给手机行业带来革命性的影响?’ , ’ 什么是超薄可弯曲柔性电池?会对智能手机的续航产生重大影响吗?’ , ’ 美术零基础怎样才能学好美术,在艺考中取得高分?’ , ’ 清华美院被鄙视吗 ?’ , ’ 艺术生真的很差吗?’ , ’ 人应该怎样过这一生?’ , ’ 人的一生到底该追求什么?’ , ’ 人类知道世界的终极真理后会疯掉吗?’ , ’ 焦虑是因为自己能力不够吗?’ , ’ 社交恐惧症是怎样的一种体验?’ , ’ “忙起来你就没时间抑郁了”这句话有理么?’ ]
这里我们加入了 headers 信息,其中包含了 User-Agent 字段信息,也就是浏览器标识信息。如果不加这个,知乎会禁止抓取。
抓取二进制数据在上面的例子中,我们抓取的是知乎的一个页面,实际上它返回的是一个 HTML 文档。
如果想抓去图片、音频、视频等文件,应该怎么办呢?图片、音频、视频这些文件本质上都是由二进制码组成的,由于有特定的保存格式和对应的解析方式,我们才可以看到这些形形色色的多媒体。
所以,想要抓取它们,就要拿到它们的二进制码。下面以 GitHub的站点图标为例来看一下:
import requests
response = requests.get("https://github.com/favicon.ico")
with
open(’github.ico’, ’wb’) as f:
f.write(response.content)
Response对象的两个属性,一个是 text, 另一个是 content. 其中前者表示字符串类型文本,后者表示 bytes 类型数据 , 同样地,音频和视频文件也可以用这种方法获取。
2.4 在Headers参数中携带cookie
网站经常利用请求头中的 Cookie 字段来做用户访问状态的保持,那么我们可以在 headers 参数中添加 Cookie ,模拟普通用户的请求。
2.4.1 Cookies 的获取
为了能够通过爬虫获取到登录后的页面,或者是解决通过 cookie 的反爬,需要使用 request 来处理 cookie 相关的请求:
import requests
url = ’https://www.baidu.com’
req = requests.get(url)
print(req.cookies)
# 响应的cookies
for key, value in req.cookies.items():
print(f"{key} = {value}")
<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
BDORZ = 27315
这里我们首先调用 cookies 属性即可成功得到 Cookies ,可以发现它是 RequestCookieJar 类型。然后用 items() 方法将其转化为元组组成的列表,遍历输出每一个 Cookie 的名称和值,实现 Cookie 的遍历解析。
2.4.2 携带 Cookies 登录
带上 cookie 、 session 的好处 :能够请求到登录之后的页面。
带上 cookie 、 session 的弊端:一套 cookie 和 session 往往和一个用户对应请求太快,请求次数太多,容易被服务器识别为爬虫。
不需要 cookie 的时候尽量不去使用 cookie 但是为了获取登录之后的页面, 我们必须发送带有 cookies 的请求 我们可以直接用 Cookie 来维持登录状态 , 下面以知乎为例来说明。首先登录知乎,将 Headers 中的 Cookie 内容复制下来。
➢ 从浏览器中复制 User-Agent 和 Cookie
➢ 浏览器中的请求头字段和值与 headers 参数中必须一致
➢ headers 请求参数字典中的 Cookie 键对应的值是字符串
import requests
import re
# 构造请求头字典
headers = {
# 从浏览器中复制过来的User-Agent
"user-agent": ’Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (
KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36’,
# 从浏览器中复制过来的Cookie
"cookie": ’xxx这里是复制过来的cookie字符串’}
# 请求头参数字典中携带cookie字符串
response = requests.get(’https://www.zhihu.com/creator’, headers=headers)
data = re.findall(’CreatorHomeAnalyticsDataItem-title.\*?>(.\*?)</div>’,response.text)
print(response.status_code)
print(data)
当我们不携带 Cookies 进行请求时:
import requests
import re
headers = {"user-agent": ’Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit
/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36’}
response = requests.get(’https://www.zhihu.com/creator’, headers=headers)
data = re.findall(’CreatorHomeAnalyticsDataItem-title.\*?>(.\*?)</div>’,response.text)
print(response.status_code)
print(data)
200
[]
在打印的输出结果中为空 , 两者对比 , 则成功利用 headers 参数携带 cookie ,获取登陆后才能访问的页面!
2.4.3 cookies 参数的使用
上一小节我们在headers参数中携带cookie ,也可以使用专门的cookies参数。
❖ 1. cookies 参数的形式:字典
cookies = “cookie 的 name”:“cookie 的 value”
➢ 该字典对应请求头中 Cookie 字符串,以分号、空格分割每一对字典键值对
➢ 等号左边的是一个 cookie 的 name ,对应 cookies 字典的 key
➢ 等号右边对应 cookies 字典的 value
❖ 2.cookies 参数的使用方法
response = requests.get(url, cookies)
❖ 3. 将 cookie 字符串转换为 cookies 参数所需的字典:
cookies_dict = { cookie . split ( ’=’ ) [ 0 ]: cookie . split ( ’=’ ) [- 1 ] for cookie in
cookies_str . split ( ’; ’ ) }
❖ 4. 注意:cookie 一般是有过期时间的,一旦过期需要重新获取
response = requests.get(url, cookies)
import requests
import re
url = ’https://www.zhihu.com/creator’
cookies_str = ’复制的cookies’
headers = {"user-agent": ’Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit
/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36’}
cookies_dict = {cookie.split(’=’, 1)[0]:cookie.split(’=’, 1)[-1] for cookie in
cookies_str.split(’; ’)}
# 请求头参数字典中携带cookie字符串
resp = requests.get(url, headers=headers, cookies=cookies_dict)
data = re.findall(’CreatorHomeAnalyticsDataItem-title.\*?>(.\*?)</div>’,resp.t