Python爬虫(3)

一:模拟登录与Post请求

1.Cookie的介绍使用

Cookie的介绍
在使用爬虫采集数据的过程中,如果遇到一些网站需要用户登录后才允许查看相关内容,遇到这种类型的网站,就可以使用 Cookie 模拟登录技术成功地解决问题。

Cookie 是一个记录了用户登录状态以及用户属性的加密字符串。当你第一次登陆网站时,服务端会
在返回的 Response Headers 中添加 Cookie, 浏览器接收到响应信息后,会将 Cookie 保存至浏览器本地存储中,当你再次向该网站发送请求时,请求头中就会携带 Cookie,这样服务器通过读取 Cookie 就能识别登陆用户了。

Cookie 和 User-Agent 用户代理一样,是一个键值对数据。它的主要作用是保持用户登录的会话状态,从而避免用户使用时重复登录的操作。利用这一特性,我们可以用 Cookie 来解决反爬或者爬取登录用户的数据信息。

定义Cookie信息
从浏览器中将登录账号后的Cookie复制下来,然后将cookie字符串放在请求头headers中

headers = {
# 定义用户代理
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36',
# 定义Cookie信息
'Cookie': 'Pycharm-26c2d973=dbb9b300-2483-478f-9f5a-16ca4580177e;
Hm_lvt_98b9d8c2fd6608d564bf2ac2ae642948=1512607763; Pycharm-26c2d974=f645329f-
338e-486c-82c2-29e2a0205c74;
_xsrf=2|d1a3d8ea|c5b07851cbce048bd5453846445de19d|1522379036'
}

Cookie的结构解析:
由于headers中对cookie仅仅使用它的name和value,所以在代码中我们仅仅需要cookie的name和value即可
使用分号;作为分隔符
每个分号代表一条cookie信息
每条cookie信息中的等号=左右的数据表示键与值
等号左边的是键(key),等号右边的是值(value)

实现代码

import requests    #导入requests库
# 定义请求头信息
headers = {
# 定义用户代理
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36',
# 定义Cookie信息
'Cookie': 'BIDUPSID=B713D6D955B1ACCB8470036DAD4FD9F2; PSTM=1676031627;
BD_UPN=12314753; sug=3; sugstore=0;
BAIDUID=B713D6D955B1ACCBFD91A91BF83BE8D4:SL=0:NR=10:FG=1; ORIGIN=0; bdime=0;
BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; H_PS_PSSID=;
BAIDUID_BFESS=B713D6D955B1ACCBFD91A91BF83BE8D4:SL=0:NR=10:FG=1; B64_BOT=1;
BDUSS=zhDczdFeldHMGloTEtmZFZQbHBkd2lVYXJVSGd3YWg3QzZ3fklNdFR2ZWh4UlprSUFBQUFBJCQ
AAAAAAQAAAAEAAABgT0cWemhlbGxvd29yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAKE472OhOO9jY; '
}
# 定义百度个人首页的URL地址
url = 'https://www.baidu.com/my/index'
# 指定请求头数据,发送网络请求并获取响应
response = requests.get(url, headers=headers)
# 指定编码格式并输出
response.encoding = 'utf-8'
print(response.text)
# 将获取到的个人首页数据写入到html文件中
with open('MyIndex.html', 'wb') as file:
file.write(response.content)

Cookie的字典定义
定义cookie字典,然后在请求方法的cookies参数接收

使用cookies参数接收字典形式的cookie
cookies的形式:字典

cookies = {"cookie的键":"cookie的值"}

使用方法:

requests.get(url,headers=headers,cookies=cookies)

实现代码

import requests
headers = {
# 定义用户代理
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36'
}

cookies = {
# 定义Cookie
'Cookie': 'BIDUPSID=B713D6D955B1ACCB8470036DAD4FD9F2; PSTM=1676031627;
BD_UPN=12314753; BAIDUID=B713D6D955B1ACCBFD91A91BF83BE8D4:SL=0:NR=10:FG=1;
BAIDUID_BFESS=B713D6D955B1ACCBFD91A91BF83BE8D4:SL=0:NR=10:FG=1; B64_BOT=1; sug=3;
sugstore=0; ORIGIN=0; bdime=0; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598;
BAIDU_WISE_UID=wapp_1676871639494_152; __bid_n=1866d56a583bc146bb4207;
FPTOKEN=thG0Ys3QDtaUrjKKEBq8WKpZ8o7lA+AURHap7Gy79r4edQO52JfmS31EAc2qA9QCm7mr986W
mRdOCb2cmtRp6G6JZnKJ9B6scyVu5yNGTjPdg/JSycFvgDf56VN03/tDPpylEw5wl5c8AdZhPUn1rBqk
46cFydcorvS7Yf3DnTOEI2jMB5fb7ChApPh0mMxhDrcaJ44PLcmqnS0de3OysX1XXs+8JttJMHD921gv
PAg/PfLQBO7TGPbUaIFO6RBr+wqaBaQ70AKnruABIiVBv5OT9mKZJlU1my3pn8Ssn46RS0LSnoAXg+vw
R9dseTAexlgODGGphqOwXc+xwM/OoISIED9p3vUSjnDSZNmVbpoDe6Zz6ioxw76NFupmSyTOcWLmjYwT
OXg9fiHHpFUevA==|SFT+HcGv2UcaIPgXKxrxrAdcgMGyvPINSleaneewKZg=|10|823ba2285bd37f9
b8ccca1bbcff2f3f3; baikeVisitId=6c008fca-42eb-45d3-9f2d-10364ca84784;'
}

# 定义请求链接并发送请求
url = 'https://www.baidu.com/my/index'
response = requests.get(url, headers=headers, cookies=cookies)
# response.encoding = 'utf-8'
# print(response.text)

# 保存数据文件
with open('index.html', 'wb') as file:
file.write(response.content)

Cookie池的介绍
对于登录后的网页来说,一条 Cookie 数据往往对应的是一个账号的信息,如果使用这个 Cookie 进行频
繁的数据请求,就很容易被对方识别为爬虫

基于这种情况,可以通过如下两种方式解决:
1、注册多个账号,从而获取多个Cookie信息;
2、购买多个账号,也能获取多个Cookie信息;

2.Post请求模拟登录

Post 请求也是 Requests 库中的一种请求方式,较于 Get 请求来说 Post 请求能够传输更多的数据
信息,同时 Post 请求中使用的表单参数也比 Get 请求的传参更加安全可靠。

Post请求的使用

import requests
# 通过表单参数来定义账号密码
from_data = {
'username':'xinyu_teacher',
'password':'xinyu666'
}
# 通过携带表单参数来发送登录账号的请求
response = requests.post(url, headers=headers, data=from_data)

表单参数的获取
在 Chrome 浏览器的开发者模式中访问登录页面,然后在 Network 中打开登录文件,通过输入错误的账号密码来获取当前网站的账号密码的表单关键字,然后在表单信息中来定义账号密码的相关信息。

17K小说网的账号注册
https://www.17k.com/

17K小说网的表单参数
点击登录页面,输入账号密码,然后输入错误的密码来获取表单参数与登录的 URL 链接。其中需要重点注意的是 17K小说网登录的链接存在误导性,如果找错了登录的URL链接会导致登录失败。

测试案例

import requests
headers = {
# 定义用户代理
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36'
}
# 定义表单数据
form_data = {
'loginName': 'xinyu_teacher',
'password': 'xinyu666'
}
# 定义登录链接
login_url = 'https://passport.17k.com/ck/user/login'
# 发送请求登录账号
response = requests.post(login_url, headers=headers, data=form_data)
# response.encoding = 'utf-8'
# print(response.request.headers)
print(response.text)

3.Session的介绍使用

在使用 Cookie 时需要注意,Cookie 是存在有效期的,如果超过有效期那么 Cookie 就会失效了。
如果直接复制浏览器中的 Cookie 可能意味着下次再运行程序会出现数据抓取失败的情况。针对这种情况的出现,我们可以使用 Session 模块在请求时来自动获取最新的 Cookie 数据,从而避免失效的问题了。

requests 库中提供了一个 Session 类,它可以保持客户端和服务端的会话状态,从而实现客户端与服务端的长连接。而且其中还附带了一个功能, 就是保存最新的 Cookie 数据,在下次请求时直接携带这个 Cookie 信息。

使用方法

import requests
# 从requests库中获取session对象
session = requests.session()
# 使用session对象来发送网络请求,从而获取数据
response = session.get(url, headers=headers)

session 实例在请求了一个网站后,对方服务器设置在本地的 cookie 会保存在 session 中,下一次再使用 session 请求对方服务器的时候,会带上前一次的 cookie 。

实现代码

import requests
headers = {
# 定义用户代理
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36'
}
# 定义表单数据
form_data = {
'loginName': 'xinyu_teacher',
'password': 'xinyu666'
}
# 定义登录链接
login_url = 'https://passport.17k.com/ck/user/login'
session = requests.session()
# 发送请求登录账号
session.post(login_url, headers=headers, data=form_data)
# 定义请求连接
book_url = 'https://user.17k.com/www/bookshelf/'
response = session.get(book_url, headers=headers)
print(response)
# 保存数据文件
with open('mybook.txt', 'wb') as file:
file.write(response.content)

4.Session的采集案例

17K网站书架的信息并不是存储在HTML页面中,而是存储在一个单独的json文本数据里,所以需要先确
定好实际的请求链接。

代码实现

import requests
headers = {
# 定义用户代理
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36'
}
# 定义表单数据
form_data = {
'loginName': 'xinyu_teacher',
'password': 'xinyu666'
}
# 定义登录链接
login_url = 'https://passport.17k.com/ck/user/login'
session = requests.session()
# 发送请求登录账号
session.post(login_url, headers=headers, data=form_data)
# 定义请求连接
book_url = 'https://user.17k.com/ck/author/shelf?page=1&appKey=2406394919'
response = session.get(book_url, headers=headers)
print(response)
# 保存数据文件
with open('mybook.txt', 'wb') as file:
file.write(response.content)
  • 10
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值