客至汲泉烹茶, 抚琴听者知音

【爬虫】一个简单方便的获取cookie的python库

前言

很久之前学过一点点爬虫,前几天需要爬一点资料所以又捡起来了。算是小需求所以也没用太复杂的框架,就 Requests+正则 就 ok 了。遗憾的是,需要爬的目标站是那种登录才可以见全文的那种网站,所以我得想办法获取 cookie。网上搜了一下,比较简单的方法有两种,一种是直接查看登录后网站存储的 cookie,然后解析使用。另一种是构造一个登录函数,登录后再获取 cookie。前者最为方便,但由于 cookie 会失效,所以需要及时获取新的 cookie,不适合自动化工作。后者不用担心时效性,但是构造一个合适的请求并成功登录还是有点难度的(至少我从来没有成功过),而且面对手机号 + 验证码登录的网站就抓瞎了。本文在将会介绍一个 python 库 browser_cookie3,只要在 Chrome 或者 Firefox 上成功登录,这个库就会自动抓取已经存储到本地的 cookie,尝试了一下还是挺好用的。

当然,我们之前还介绍过 webscraper 这个 Chrome 插件,同样不用考虑 cookie 的问题,但是因为不太灵活,所以我也很少再用了。

在文章开始前,我要提醒一下读者,本人对爬虫相关知识并不是非常了解,可能对 cookie 的解释有错误之处,仅供参考,如有不同意见可以在评论区交流。

首先登录目标网站,然后按下 F12 打开开发者工具,点开 Network,找到目标网站的链接,点开之后往下拉,就可以看到 cookie 了。

然后进行解析,格式化为字典形式,代码如下。

cookies = '复制过来的cookie'
cookie = {i.split("=")[0]:i.split("=")[1] for i in cookies.split(";")} 

然后就可以愉快 Requests 了

headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'
}
requests.get(url,headers=headers, cookies=cookie)

参考文章:https://blog.csdn.net/qlzy_5418/article/details/101056488

https://zhuanlan.zhihu.com/p/27867925

最简单的方案如下:

def get_cookie():
    url = 'https://www.xxx.com/signin' #登录网址
    data = {'username': 'xxx',
            'password': 'xxx'}
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', }
    session = requests.session()
    cookie_jar = session.get(url=url, data=data, headers=headers).cookies
    cookie_t = requests.utils.dict_from_cookiejar(cookie_jar)
    return cookie_t

但是一般而言是成功不了的,你还要考虑 data 的字段,post 还是 get 请求,以及动态变换的参数。

可能使用 selenium 进行模拟登录还更简单一些。

方法三:browser_cookie3

GitHub 网站:https://github.com/borisbabic/browser_cookie3

有 python2 版本,库名为 browser_cookie

使用方法很简单,首先安装:

pip install browser-cookie3

然后登录目标网站

最后获取 cookie:

import browser_cookie3
import requests
cj = browser_cookie3.chrome() # firefox可以替换为browser_cookie3.firefox()
r = requests.get(url, cookies=cj)

上面的代码是获取特定浏览器的 cookie,也可以获取所有浏览器的 cookie:

cj = browser_cookie3.load()

或者是获取指定网站的 cookie:

browser_cookie3.chrome(domain_name='www.bitbucket.com')

添加新评论