任务描述
本关任务:使用 session
编写爬取网页的小程序。
相关知识
为了完成本关任务,你需要掌握:cookie
与 session
的使用。
cookie 的使用
当你浏览某网站时,Web
服务器会修改修改你电脑上的 Cookies
文件,它是一个非常小的文本文件,可以记录你的用户 ID
、密码、浏览过的网页、停留的时间等信息。 当你再次来到该网站时,网站通过读取 Cookies
文件,得知你的相关信息,从而做出相应的动作,如在页面显示欢迎你的标语,或者让你不用输入 ID
、密码就直接登录等等。
下面演示如何在 requests
中使用 Cookies
, 以百度搜索为例,在开发者工具
查看请求头信息如下:
方法一: 将得到的 Cookies
信息写入请求头,模拟 GET
请求:
header = {
'User-Agent': 'Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/'
'537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Mobile Safari/537.36',
"Cookie": "BAIDUID=53B7CC4BFCDC39D2EF625C13D285429D:FG=1; BIDUPSID=53B7CC4BFCDC39D2EF625C13D285429D; "
"PSTM=1591665716; BD_UPN=12314753; BDUSS=2N2ajRYZnI2cVlZN1FRemlWNU9FV1lSZFM3SnZBS0dvRW44WFRCUTRWck1mUVpmR"
"VFBQUFBJCQAAAAAAAAAAAEAAAAoKJzNMTIyMzM4ODQ1uNW41QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAMzw3l7M8N5eS; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; sug=3; sugstore=1; ORIGIN=0; bdime=0; "
"H_PS_PSSID=1456_31672_32139_31253_32046_32230_31708_32295_26350_22160; delPer=0; BD_CK_SAM=1; PSINO=6; "
"H_PS_645EC=3b86vFCd303Aw0wmqvkcAGpfxU4oXfwYcs6jRd1RnxihTsvhfqaVB%2BIoeBs; BDSVRTM=0"
}
response = requests.get(url=url, headers=header)
方法二 :(不推荐)
也可将 cookie
写成字典的形式,传入请求方法中:
cookies = {"BAIDUID": "53B7CC4BFCDC39D2EF625C13D285429D:FG=1", "BIDUPSID": "53B7CC4BFCDC39D2EF625C13D285429D",
"PSTM": "1591665716", "BD_UPN": "12314753", "sug": "3", "sugstore": "1", "ORIGIN": "0", "bdime": "0",
"H_PS_PSSID": "1456_31672_32139_31253_32046_32230_31708_32295_26350_22160", "delPer": "0", " BD_CK_SAM": "1",
"PSINO": "6", "H_PS_645EC": "3b86vFCd303Aw0wmqvkcAGpfxU4oXfwYcs6jRd1RnxihTsvhfqaVB%2BIoeBs", "BDSVRTM": "0",
"BDUSS": "2N2ajRYZnI2cVlZN1FRemlWNU9FV1lSZFM3SnZBS0dvRW44WFRCUTRWck1mUVpmRVFBQUFBJCQ"
"AAAAAAAAAAAEAAAAoKJzNMTIyMzM4ODQ1uNW41QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMzw3l7M8N5eS; BDORZ=B490B5EBF6F3CD402E515D"
"22BCDA1598",
}
response = requests.get(url=url, headers=header, cookies=cookies)
session 的使用
http
协议是无状态的,也就是每个请求都是独立的。那么登录后的一系列动作,都需要用 cookie
来验证身份是否是登录状态,为了高效的管理会话,保持会话,于是就有了 session
。 session
是一种管理用户状态和信息的机制,与 cookies
的不同的是,session
的数据是保存在服务器端。说的明白点就是 session
相当于一个虚拟的浏览器,在这个浏览器上处于一种保持登录的状态。
下面演示如何在 requests
中使用 session
。
创建会话的代码如下:
sess = requests.session()
使用会话发出请求提交表单的代码如下:
data = {
"name": "XXXXX",
"password": "XXXXX",
}
header = {
'User-Agent': 'Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/'
'537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Mobile Safari/537.36'
}
response = sess.post(url, headers=header, data=data)
登录成功后,会话会生成 cookie
以及请求头,再次访问网站,直接发出请求即可,代码如下:
response_home = sess.get(url=url)
编程要求
根据提示,在右侧编辑器 Begin-End
区间补充代码,完善函数 get_html()
,使用 requests
创建 session
对指定网址发出请求。
测试说明
平台会对你编写的代码进行测试,当评测出现 Django 启动失败时,重新评测即可。
代码:
import requests
def get_html(url):
'''
两个参数
:param url:统一资源定位符,请求网址
:param headers:请求头
:return html 网页的源码
:return sess 创建的会话
'''
# ***************** Begin ******************** #
# 补充请求头
headers={ 'User-Agent': 'Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/'
'537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Mobile Safari/537.36',
"Cookie": "BAIDUID=53B7CC4BFCDC39D2EF625C13D285429D:FG=1; BIDUPSID=53B7CC4BFCDC39D2EF625C13D285429D; "
"PSTM=1591665716; BD_UPN=12314753; BDUSS=2N2ajRYZnI2cVlZN1FRemlWNU9FV1lSZFM3SnZBS0dvRW44WFRCUTRWck1mUVpmR"
"VFBQUFBJCQAAAAAAAAAAAEAAAAoKJzNMTIyMzM4ODQ1uNW41QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAMzw3l7M8N5eS; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; sug=3; sugstore=1; ORIGIN=0; bdime=0; "
"H_PS_PSSID=1456_31672_32139_31253_32046_32230_31708_32295_26350_22160; delPer=0; BD_CK_SAM=1; PSINO=6; "
"H_PS_645EC=3b86vFCd303Aw0wmqvkcAGpfxU4oXfwYcs6jRd1RnxihTsvhfqaVB%2BIoeBs; BDSVRTM=0"
}
# 创建Session, 并使用Session的get请求网页
sess = requests.session()
# 获取网页信息文本
response = sess.get(url,headers=headers)
response_home = sess.get(url=url)
html=response.text
# ****************** End ********************* #
return html, sess