python3获取cookie(python默认用什么浏览器爬取)

http://blog.csdn.net/pipisorry/article/details/47980653爬虫爬网站不免遇到需要登录的问题.登录的时候可能还会碰到需要填验证码的问题,有的验证码甚至是拖动拼图来完成的.虽然现在这些都有开源解决方案,但是假设现在主要的精力想要放在如何解析html,或者验证抓取算法上,而不是通过登录验证上,那么开源解决方案并不是最好的解决方案.更好

大家好,又见面了,我是你们的朋友全栈君。

http://blog.csdn.net/pipisorry/article/details/47980653

爬虫爬网站不免遇到需要登录的问题. 登录的时候可能还会碰到需要填验证码的问题, 有的验证码甚至是拖动拼图来完成的. 虽然现在这些都有开源解决方案, 但是假设现在主要的精力想要放在如何解析html, 或者验证抓取算法上, 而不是通过登录验证上, 那么开源解决方案并不是最好的解决方案.更好的方案是获取浏览器的 Cookies, 然后让 requests 这个库来直接使用登录好的 Cookies. 

获取 Chrome 浏览器的 Cookies 信息的函数
程序在 Windows 下调试通过, 因为 C 盘需要特殊权限来读写文件, 因此程序先将 Cookies 数据库文件拷贝到当前目录. 

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
__author__ = 'pi'
__email__ = 'pipisorry@126.com'
"""
import subprocess
import sqlite3
import win32crypt

import requests

SOUR_COOKIE_FILENAME = r'C:\Users\pi\AppData\Local\Google\Chrome\User Data\Default\Cookies'
DIST_COOKIE_FILENAME = '.\python-chrome-cookies'


def get_chrome_cookies(url):
    subprocess.call(['copy', SOUR_COOKIE_FILENAME, DIST_COOKIE_FILENAME], shell=True)
    conn = sqlite3.connect(".\python-chrome-cookies")
    ret_dict = {}
    for row in conn.execute("SELECT host_key, name, path, value, encrypted_value FROM cookies"):
        # if row[0] not in url:
        if row[0] != url:
            continue  print(row[0])
        ret = win32crypt.CryptUnprotectData(row[4], None, None, None, 0)
        ret_dict[row[1]] = ret[1].decode()
    conn.close()
    subprocess.call(['del', '.\python-chrome-cookies'], shell=True)
    return ret_dict

使用requests

DOMAIN_NAME = '.jobbole.com'
get_url = r'http://www.jobbole.com/'
response = requests.get(get_url, cookies=get_chrome_cookies(DOMAIN_NAME))
print(response.text)

Note: 要安装requests库,安装及使用blog[python爬虫 – python requests网络请求简洁之道]

使用urllib

import urllib.request

DOMAIN_NAME = '.jobbole.com'
get_url = r'http://www.jobbole.com/'
headers = {
 
 'Cookie': ['='.join((i, j)) for i, j in get_chrome_cookies(DOMAIN_NAME).items()][0]}
request = urllib.request.Request(get_url, headers=headers)
response = urllib.request.urlopen(request)
print(response.read().decode())

Note:

1. chrome浏览器加密后的密钥存储于%APPDATA%\..\Local\Google\Chrome\User Data\Default\Login Data”下的一个SQLite数据库中,可以通过Sqlite浏览器来查看一下登陆文件中的数据。密码是调用Windows API函数CryptProtectData来加密的。这意味着,只有用加密时使用的登陆证书,密码才能被恢复。而这根本不是问题,在用户登陆环境下执行解密就OK。SQLite数据库中password_value(是二进制数据,所以SQLite浏览器不能显示)。而破解密码,只需要调用Windows API中的CryptUnprotectData函数。[谷歌Chrome浏览器是如何存储密码的][浏览器是如何存储密码的]

2. Python为调用Windows API准备了一个完美的叫做pywin32的库。只有安装了pywin32才能调用win32crypt。安装教程见[linux和windows下安装python拓展包]


当你的输出中存在“个人主页”“退出登录”字样,就说明登录成功了,否则只会有“登录”“注册”之类的字符串。

此方法同样可以应用于知乎等等网站的登录。

皮皮Blog

获取 Chrome 浏览器的 Cookies 信息的的另一种方法

chrome > 更多工具 > javascript控制台 > 对应当前页面输入document.cookie。就可以得到当前网页的cookie相关内容,复制到代码中就可以使用了。

或者使用fiddler2,headers中找到Cookie: wordpress_logged_in_0efdf49af511fd88681529ef8c2e5fbf=*************************[cookie登录实战 – 也可以下载软件Fiddler部分]

wordpress_logged_in_0efdf49af511fd88681529ef8c2e5fbf=pipiyn%7C1440989529%7C45ec5e30a3b24a68208815cc5c572c14

get_url = r'http://www.jobbole.com/'
cookies = {
 
 'wordpress_logged_in_0efdf49af511fd88681529ef8c2e5fbf': '***username****%*******%**********'}
response = requests.get(get_url, cookies=cookies)
print(response.text)

Note:

1. domain.com 是一级域名,www.domain.com 是域名 domain.com 的一个比较特殊的二级域名。他的特殊就在于现在的实践中,人们在解析域名的的时候,在惯例和默认的情况下,是把 www.domain.com 这个二级域名指向它的一级域名 domain.com。因此,现在的大部分情况下,domain.com 和 www.domain.com,都是一样的。 但是如果在解析域名的时候,没有做这样的设定,也可能就会有区别。

2. 不过可能document.cookie 获取到 www.domain.com 的 cookies, 而不是 .domain.com 的。

from:http://blog.csdn.net/pipisorry/article/details/47980653

ref:Python 爬虫解决登录问题的另类方法

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/127384.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • 常用渗透测试工具及应用范围_渗透测试入门

    常用渗透测试工具及应用范围_渗透测试入门全网最全合集建议收藏~

    2022年8月12日
  • centos7部署k8s_怎么在自己电脑上搭建网站

    centos7部署k8s_怎么在自己电脑上搭建网站学习K8S时,常常需要自己搭建环境,本人将centOS-7上搭建K8S的过程进行做如下的记录,以方便自己后续环境的搭建和指导其他人搭建环境作为参考资料,本章节主要介绍如何搭建kubernetes的集群环境集群环境搭建集群类型kubernetes集群大体上分为两类:一主多从和多主多从。一主多从:一台Master节点和多台Node节点,搭建简单,但是有单机故障风险,适合用于测试环境多主多从:多台Master节点和多台Node节点,搭建麻烦,安全性高,适合用于生产环境说明:为了测试简单,本次搭建

    2022年8月12日
  • 解决进入vi 显示E325

    解决进入vi 显示E325在网上找了大量的帖子,有的有用,有的无用,今天自己摸索了一个办法,在命令端输入rm空格-rf空格图片中的箭头位置,这个位置是你创建的例如vim1.c回车后出现如图就一直回车回到vim页面进入命令模式输入:q!回车回到终端输入rm-rf.1.c.swp回车再重新进入…

    2022年5月19日
  • mysql数据库SQL查询语句SELECT详细查询(超详细)「建议收藏」

    mysql数据库SQL查询语句SELECT详细查询(超详细)「建议收藏」常规查询查询所有字段:select*from表名;查询指定字段:select列1,列2,…from表名;使用as给字段起别名:select字段as名字….from表名;查询某个表的某个字段:select表名.字段….from表名;可以通过as给表起别名:select别名.字段….from表名as别名;消除重复行:distinct字段条件查询㈠比较运算符:>,<,>=,<=,=,!=,

    2022年5月18日
  • day08(异常处理,创建异常,finally,throws和throw的区别)

    day08(异常处理,创建异常,finally,throws和throw的区别)

    2022年3月6日
  • C++ 序列化和反序列化

    C++ 序列化和反序列化序列化序列化1、背景2、定义3、序列化评价指标4、序列化实例参考序列化1、背景1、在TCP的连接上,它传输数据的基本形式就是二进制流,也就是一段一段的1和0。2、在一般编程语言或者网络框架提供的API中,传输数据的基本形式是字节,也就是Byte。一个字节就是8个二进制位,8个Bit。二进制流和字节流本质上是一样的。对于我们编写的程序来说,它需要通过网络传输的数据是结构化的数据,比如,一条命令、一段文本或者一条消息。对应代码中,这些结构化的数据都可以用一个类或者一个结构体来表示。序

    2022年6月17日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号