爬虫cookie的使用

cookie是一种由网站创建并存储在用户计算机上的小型文本文件。访问该网站时由浏览器返回给服务器。cookie主要作用是帮助网站记住用户信息,包括但不限于:

  • 会话管理,网站使用cookie识别用户的会话,以便用户在浏览网站时不需要重复登录。
  • 个性化体验,通过存储用户的偏好设置,网站可以在用户下次访问时提供个性化的体验。
  • 追踪分析,网站使用cookie追踪用户行为,用于网站分析,改善用户体验或广告定位。

cookie分为持久性cookie和会话cookie,持久性cookie在用户的硬盘上设定一个过期日期,即使关闭浏览器,cookie也会在设定日期前一直有效。会话cookie仅在浏览器会话期间有效,当用户关闭浏览器,这些cookie会被删除。用户可以根据自己的隐私偏好设置浏览器以接受或拒绝cookie。

部分网站需要登录才能查看信息

爬虫使用cookie

爬取http://www.sudokufans.org.cn/index.php页面获得我的账号的当前积分,由于当前积分需要登录才能看到,所以在使用python请求时要加上cookie信息。

使用urllib添加cookie信息发送请求

from urllib.request import Request, urlopen
from fake_useragent import UserAgent
# 创建UserAgent实例
ua = UserAgent()
# 请求地址
url = 'http://www.sudokufans.org.cn/index.php'
# 封装请求头
headers = {'user-agent': ua.edge,
          'Cookie': 'PHPSESSID=psiobkeevlmndr5uditvbk9k25; Hm_lvt_50ddc2ed1dbffd1c3932e52d4ee20aaf=1726558072; HMACCOUNT=61ABCD75DE58F875; c_userid=45340; c_username=%B1%F9%D5%F2%CE%F7%B9%CF%D6%AD; ips4_IPSSessionFront=ehbdh8s6dq95cjvr3oglkhbr92; Hm_lpvt_50ddc2ed1dbffd1c3932e52d4ee20aaf=1726560351'}
# 创建Request对象
req = Request(url, headers=headers)
# 发送请求
resp = urlopen(req)
# 打印结果
print(resp.read().decode('gbk')[:1000])  # utf-8报错,换成gbk运行成功
运行结果
 <!DOCTYPE html>
<HTML>
<head>
<title>独·数之道 | 数独爱好者</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<meta http-equiv="Content-Language" content="zh-CN" />
<meta content="all" name="robots" />
<meta name="author" content="shimuqi" />
<meta name="Copyright" content="sudokufans.org.cn" />
<meta name="keywords" content="数独下载 数独PK 数独比赛 CSOC  随机题型 附加区域 四海归一 连体数独 四阶数独 六阶数独 3D数独3 3D数独4 骰子 大于号6阶 LED数独6 蜂巢数独 六角数独 五角球数独 推理数独 不三不四 数回5阶 数回10阶 数回15阶 数回20阶 数回25阶 数回40阶 数回60阶 数壹5阶 数壹9阶 数壹20阶 数箭2阶 数箭5阶 数回异形 仙人指路 摇啊摇 羊肠小道 五拼板标3 五格拼板 蛇 帐篷 三角扫雷 正反数回5 正反数回7 差1数回5 差1数回7 奇偶数回5 奇偶数回7 大帐篷 双帐篷 阴阳 空格(初) 空格(中) 空格(高) 标准入门级 标准初级 标准中级 标准高级 标准专家级 标准大师级 15宫数独 标准一刀流 一刀(宫摒) 17格数独 17格数独(易) 17格数独(难) 宇宙数独 限色数独 锯齿数独(7阶) 锯齿数独 锯齿数独(中级) 双胞锯齿数独 气球数独 对角线数独 金字塔 金字塔对角线 不连续数独 不连续(入门) 无10数独 连续数独 连续数独 定向连续数独 斜连续数独 斜连续数独6 缺一门 Killer(杀手数独) 杀手6阶 VX(全标) VX(部分标) VX(终级) 小九九数独 三八数独 黑白点(全标) 八九不离十 黑白块(全标) 扫雷(全标) GT9数独 GT 无缘数独 无马数独 马步不连续 质无缘 因何数独 平均数数独 不平均数独 移位数独 废墟 摩天楼 摩天楼6阶 同性边框和 连遮楼 小摩天 大摩天 对对5 无四数独 窗口数独 窗口对角数独

登录后保持cookie

除了手动登录,打开浏览器开发者工具获取cookie,还可以编写python自动登录并获取cookie:

目标网址http://www.tuili.com/ ,打开浏览器开发者工具查看有关登录的响应,请求方法为POST,指向的网址为http://www.tuili.com/bbs/bbslogincheck.asp,编码为GB2312

POST传递的参数如下

由于参数中有中文,http协议和url标准都只能识别ascii字符集中的字符。需要对中文字符按照GB2312编码转换为字节序列,然后将这些字节序列转化为ascii编码(每个字节转换为%后跟两位十六进制数的形式)

例如
 from urllib.parse import unquote
b'UserName=%CF%C4%C8%D5%B1%F9%BA%EC%B2%E8&Password=Icedtea112&fromurl=&Login=%B5%C7%C2%BC'
# 按照GB2312进行解码
print(unquote(b'%B5%C7%C2%BC', 'gb2312'))  # 登录
print(unquote(b'%CF%C4%C8%D5%B1%F9%BA%EC%B2%E8', 'gb2312'))  # 夏日冰红茶
# 表单传递的中文参数的含义如下
args = {
    'UserName': '夏日冰红茶',
    'Password': 'Icedtea112',
    'Login': '登录'
}

获取cookie后想查看的信息在http://www.tuili.com/bbs/bbsshowtopic.asp?aid=35&bid=119,由于urlopen不能保存cookie,所以需要自定义一个可以保持cookie的发送请求的对象opener,对opener扩展(向opener添加urllib.request.HTTPCookieProcessor控制器)。

运行代码

from urllib.request import Request, build_opener, HTTPCookieProcessor, urlopen
from fake_useragent import UserAgent
# 登录网页地址
url = 'http://www.tuili.com/bbs/bbslogincheck.asp'
# 创建UserAgent实例
ua = UserAgent()
# 封装请求头信息
data = b'userid=%CF%C4%C8%D5%B1%F9%BA%EC%B2%E8&userpwd=Icedtea112'
headers = {'user-agent': ua.chrome}
# 创建Request对象
req = Request(url, data=data, headers=headers)
# 创建一个可以保存Cookie的控制器对象
handler = HTTPCookieProcessor()
# 构建发送请求的对象
opener = build_opener(handler)
# 登录
resp = opener.open(req)
# 登录成功后获取目标网页html源代码
# 为保持cookie,多次请求使用同一个opener
index_url = 'http://www.tuili.com/bbs/bbsshowtopic.asp?aid=35&bid=119'
index_req = Request(index_url, headers=headers)
index_resp = opener.open(index_req)
print(index_resp.read().decode('gb2312'))

运行结果,检查确认为推理游戏板块的网页源代码:

 

posted @ 2024-09-17 16:18  松鼠q  阅读(5)  评论(0编辑  收藏  举报