持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情
requests请求模块3
写在前面
一个学生,请多多关照,希望能在掘金记录自己的学习历程!❤️ 这一篇是接着上一篇的基础写的,也就是Python爬虫基础-requests模块-2这一篇,没有看过的请先去康康
添加请求头headers
有时候在请求一个网页内容时,会发现无论通过GET,POST还是其他任何请求方法,都会出现403错误。这种现象多数为服务器拒绝了您的访问,为了拒绝恶意采集信息,所采用的反爬出设置,此时可以通过模拟浏览器的头部信息进行访问,下面介绍requests添加请求头的方式,实例代码如下:
import requests # 导入网络请求模块requests
url = 'https://www.baidu.com/' # 创建需要爬取网页的地址
# 创建头部信息
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0'}
response = requests.get(url, headers=headers) # 发送网络请求
print(response.status_code) # 打印响应状态码
运行结果为 200
验证Cookies
在爬去默写网页时,需要登录才能进行数据的抓取,Cookies登录就想很多网页中的自动登陆功能,让用户在第二次登录时无需密码,所以我们需要获取登陆后的cookies,下面以豆瓣(www.douban.com) 为例:
进入豆瓣官网www.douban.com 没有账号的先注册,F12打开开发者工具,点击network(网络),点击www.douban.com 如下图:
Cookie在这里:
这时可以先看一眼未登录时的Cookie,然后点击登陆,再查看cookie,仔细比对会发现不一样:
这个是我未登录和登陆时的cookie,上图时未登陆的
实现网页模拟登录请求示例如下:
import requests # 导入网络请求模块
from lxml import etree # 导入lxml模块
cookies = 'll="108296"; bid=XmF5qPmFi4U; _pk_ses.100001.8cb4=*; __utma=30149280.585002292.1645926882.1645926882.1645926882.1; __utmc=30149280; __utmz=30149280.1645926882.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; ap_v=0,6.0; push_noty_num=0; push_doumail_num=0; __utmv=30149280.25449; _pk_id.100001.8cb4=8b4186929ca7b866.1645926881.1.1645926994.1645926881.; __utmb=30149280.8.10.1645926882; dbcl2="254491851:nkZy56+vDAY"'
headers = {'Host': 'www.douban.com',
'Referer': 'https://www.hao123.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
'AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/72.0.3626.121 Safari/537.36'}
# 创建RequestsCookieJar对象,用于设置cookies信息
cookies_jar = requests.cookies.RequestsCookieJar()
for cookie in cookies.split(';'):
key, value = cookie.split('=', 1)
cookies_jar.set(key, value) # 将cookies保存RequestsCookieJar当中
# 发送网络请求
response = requests.get('https://www.douban.com/',
headers=headers, cookies=cookies_jar)
if response.status_code == 200: # 请求成功时
html = etree.HTML(response.text) # 解析html代码
# 获取用户名
name = html.xpath('//*[@id="db-global-nav"]/div/div[1]/ul/li[2]/a/span[1]/text()')
print(name[0]) # 打印用户名