python实现登录抓取_[Python]网络爬虫(五):利用POST方式登录账号抓取

2023-05-16

今天的工作很有意思, 我们用 Python 来登录网站, 用Cookies记录登录信息,

然后就可以抓取登录之后才能看到的信息. 今天我们拿知乎网来做示范. 为什么是知乎? 这个很难解释,

但是肯定的是知乎这么大这么成功的网站完全不用我来帮他打广告. 知乎网的登录比较简单, 传输的时候没有对用户名和密码加密,

却又不失代表性, 有一个必须从主页跳转登录的过程.

第一步: 使用 Fiddler 观察浏览器行为

在开着 Fiddler 的条件下运行浏览器, 输入知乎网的网址 http://www.zhihu.com 回车后到

Fiddler 中就能看到捕捉到的连接信息. 在左边选中一条 200 连接, 在右边打开 Inspactors 透视图,

上方是该条连接的请求报文信息, 下方是响应报文信息.

其中 Raw 标签是显示报文的原文. 下方的响应报文很有可能是没有经过解压或者解码的, 这种情况他会在中间部位有一个小提示,

点击一下就能解码显示出原文了.

以上这个截图是在未登录的时候进入 http://www.zhihu.com 得到的. 现在我们来输入用户名和密码登陆知乎网,

再看看浏览器和知乎服务器之间发生了什么.

点击登陆后, 回到 Fiddler 里查看新出现的一个 200 链接. 我们浏览器携带者我的帐号密码给知乎服务器发送了一个

POST, 内容如下:

POST http://www.zhihu.com/login HTTP/1.1

Content-Type: application/x-www-form-urlencoded;

charset=UTF-8

Accept: */*

X-Requested-With: XMLHttpRequest

Referer: http://www.zhihu.com/#signin

Accept-Language:

en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3

Accept-Encoding: gzip, deflate

User-Agent: Mozilla/5.0 (Windows NT 6.4; WOW64; Trident/7.0;

rv:11.0) like Gecko

Content-Length: 97

DNT: 1

Host: www.zhihu.com

Connection: Keep-Alive

Pragma: no-cache

Cookie:

__utma=51854390.1539896551.1412320246.1412320246.1412320246.1;

__utmb=51854390.6.10.1412320246; __utmc=51854390;

__utmz=51854390.1412320246.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none);

__utmv=51854390.000--|3=entry_date=20141003=1

_xsrf=4b41f6c7a9668187ccd8a610065b9718&email=此处涂黑@gmail.com&password=此处不可见&rememberme=y

我的浏览器给 http://www.zhihu.com/login 这个网址(多了一个/login) 发送了一个POST,

内容都已经在上面列出来了, 有用户名, 有密码, 有一个"记住我"的 yes, 其中这个 WebForms 标签下 Fiddler

能够比较井井有条的列出来 POST 的内容. 所以我们用 Python 也发送相同的内容就能登录了. 但是这里出现了一个 Name 为

_xsrf 的项, 他的值是 4b41f6c7a9668187ccd8a610065b9718. 我们要先获取这个值,

然后才能给他发.

浏览器是如何获取的呢, 我们刚刚是先访问了 http://www.zhihu.com/ 这个网址, 就是首页,

然后登录的时候他却给 http://www.zhihu.com/login 这个网址发信息. 所以用侦探一般的思维去思考这个问题,

就会发现肯定是首页把 _xsrf 生成发送给我们, 然后我们再把这个 _xsrf 发送给 /login 这个 url.

这样一会儿过后我们就要从第一个 GET 得到的响应报文里面去寻找 _xsrf

我们不仅登录成功了, 而且服务器还告诉我们的浏览器如何保存它给出的 Cookies 信息. 所以我们也要用 Python

把这些 Cookies 信息记录下来.这样 Fiddler 的工作就基本结束了!

第二步: 解压缩

简单的写一个 GET 程序, 把知乎首页 GET 下来, 然后 decode() 一下解码, 结果报错. 仔细一看,

发现知乎网传给我们的是经过 gzip 压缩之后的数据. 这样我们就需要先对数据解压. Python 进行 gzip 解压很方便,

因为内置有库可以用. 代码片段如下:

import gzip

def ungzip(data):

try: #

尝试解压

print('正在解压.....')

data = gzip.decompress(data)

print('解压完毕!')

except:

print('未经压缩, 无需解压')

return data

通过 opener.read() 读取回来的数据, 经过 ungzip 自动处理后, 再来一遍 decode()

就可以得到解码后的 str 了

第三步: 使用正则表达式获取沙漠之舟

_xsrf 这个键的值在茫茫无际的互联网沙漠之中指引我们用正确的姿势来登录知乎, 所以 _xsrf 可谓沙漠之舟. 如果没有

_xsrf, 我们或许有用户名和密码也无法登录知乎(我没试过, 不过我们学校的教务系统确实如此) 如上文所说, 我们在第一遍 GET

的时候可以从响应报文中的 HTML 代码里面得到这个沙漠之舟. 如下函数实现了这个功能, 返回的 str 就是 _xsrf

的值.

import re

def getXSRF(data):

cer =

re.compile('name="_xsrf" value="(.*)"', flags = 0)

strlist =

cer.findall(data)

return strlist[0]

第四步: 发射 POST !!

集齐 _xsrf, id, password 三大法宝, 我们可以发射 POST 了. 这个 POST 一旦发射过去,

我们就登陆上了服务器, 服务器就会发给我们 Cookies. 本来处理 Cookies 是个麻烦的事情, 不过 Python 的

http.cookiejar 库给了我们很方便的解决方案, 只要在创建 opener 的时候将一个

HTTPCookieProcessor 放进去, Cookies 的事情就不用我们管了. 下面的代码体现了这一点.

import http.cookiejar

import urllib.request

def getOpener(head):

# deal with the

Cookies

cj =

http.cookiejar.CookieJar()

pro =

urllib.request.HTTPCookieProcessor(cj)

opener =

urllib.request.build_opener(pro)

header = []

for key, value in

head.items():

elem = (key, value)

header.append(elem)

opener.addheaders =

header

return opener

getOpener 函数接收一个 head 参数, 这个参数是一个字典. 函数把字典转换成元组集合, 放进 opener.

这样我们建立的这个 opener 就有两大功能: 自动处理使用 opener 过程中遇到的

Cookies 自动在发出的 GET 或者 POST 请求中加上自定义的 Header

第五部: 正式运行

正式运行还差一点点, 我们要把要 POST 的数据弄成 opener.open() 支持的格式. 所以还要

urllib.parse 库里的 urlencode() 函数. 这个函数可以把 字典 或者

元组集合 类型的数据转换成 & 连接的 str.

str 还不行, 还要通过 encode() 来编码, 才能当作 opener.open() 或者 urlopen() 的

POST 数据参数来使用. 代码如下:

url = 'http://www.zhihu.com/'

opener = getOpener(header)

op = opener.open(url)

data = op.read()

data = ungzip(data) #

解压

_xsrf = getXSRF(data.decode())

url += 'login'

id = '这里填你的知乎帐号'

password = '这里填你的知乎密码'

postDict = {

'_xsrf':_xsrf,

'email': id,

'password': password,

'rememberme': 'y'

}

postData = urllib.parse.urlencode(postDict).encode()

op = opener.open(url, postData)

data = op.read()

data = ungzip(data)

print(data.decode()) #

你可以根据你的喜欢来处理抓取回来的数据了!

代码运行后, 我们发现自己关注的人的动态(显示在登陆后的知乎首页的那些), 都被抓取回来了. 下一步做一个统计分析器,

或者自动推送器, 或者内容分级自动分类器, 都可以.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python实现登录抓取_[Python]网络爬虫(五):利用POST方式登录账号抓取 的相关文章

  • idea 去绿色波浪线

    idea 去绿色波浪线 如图 如图
  • stop-writes-on-bgsave-error

    redis RDB持久化配置 RDB持久化 配置 stop writes on bgsave error 选项 如果 61 yes xff1a redis 会创建一个新的后台进程dump rdb 假设 xff1a 创建快照 xff08 硬盘
  • px4_simple_example和uorb机制

    px4 simple app PX4 Autopilot src exampes px4 simple app xff0c 这个程序是用c语言调用orb API和poll机制订阅和发布通讯数据 xff0c 但是这个例子并不是既有接收又有发送
  • 四旋翼无人机硬件基础

    四旋翼无人机硬件基础 材料分析无刷电机型号转速 电子调速器作用规格四轴专用电调 xff1f 电调编程 xff1f 螺旋桨机制 规格 飞行控制器原理作用四轴 字四轴十字 电池锂电池 xff1f 电池容量电池片数放电能力插头类型T插XT60JS
  • AndroidStudio NDK开发环境配置及示例

    AndroidStudio NDK开发环境配置及示例 版本说明 版本作者日期备注0 1loon2020 8 26初稿 目录 文章目录 AndroidStudio NDK开发环境配置及示例版本说明目录一 Android Studio NDK环
  • Onvif协议学习:10、获取音视频流

    Onvif协议学习 xff1a 10 获取音视频流 文章目录 Onvif协议学习 xff1a 10 获取音视频流1 原理简介2 编码流程3 VLC播放RTSP视频4 准备FFmpeg库5 示例代码 原文链接 xff1a https blog
  • (ROS)RLException: [display_mrobot_with_camera.launch] is neither a launch file等一系列错误解决办法

    前提 xff1a 运行 roslaunch mrobot description display mrobot chassis urdf launch 有误 错误1 xff1a rviz直接打不开 错误显示 xff1a RLExceptio
  • 9款好用的SSH客户端软件推荐

    9款好用的SSH客户端软件推荐 文章目录 9款好用的SSH客户端软件推荐MobaXtermXshellTermiusPuTTYSimpleRemoteZOC TerminalFinalshellJuiceSSHServerCat SSH客户
  • 几款数据库连接工具

    几款数据库连接工具 文章目录 几款数据库连接工具1 前言2 Navicat3 DBeaver4 DataGrip5 phpMyAdmin 1 前言 我目前使用sqlite3和mysql数据库比较多 xff0c 所以对数据库客户端的需求主要是
  • win10文件资源管理器右键卡死现象解决方案大全

    win10文件资源管理器右键卡死现象解决方案大全 文章目录 win10文件资源管理器右键卡死现象解决方案大全一 右键桌面卡死 xff0c 过了许久都未反应二 右键文件夹或文件卡死2 1 方案12 2 方案22 3 方案3 xff08 靠谱
  • CLion常用插件及c文件模板配置

    CLion常用插件及c文件模板配置 文章目录 CLion常用插件及c文件模板配置1 常用插件2 模板2 1 c源文件模板 xff1a xff08 使用文件模板 xff09 2 2 c头文件模板 xff1a xff08 使用文件模板 xff0
  • Windows下安装及卸载程序可用的添加和删除当前路径到环境变量的bat脚本以及如何和inno setup结合使用的实例

    文章目录 1 安装bat脚本 install bat 将当前路径添加到环境变量中 2 卸载bat脚本 uninstall bat 搜索当前路径并删除 3 inno setup添加安装和卸载时执行上述bat脚本4 安装到 C盘权限不足问题处理
  • 浏览器播放rtsp视频流:4、jsmpeg+go实现局域网下的rtsp视频流web端播放

    文章目录 1 前言2 资料准备3 兼容性及适用性说明4 jsmpeg架构5 基于以上架构的go方案可行性分析6 编译和结果展示 xff08 编译坑点 xff09 7 最后 1 前言 之前的rtsp转webrtc的方案存在如下缺陷 xff1a
  • TCP套接字编程实例(一)

    TCP套接字编程实例 xff08 一 xff09 TCP套接字编程第一部分我们先用单线程简单实现客户端的 发 和服务器的 收 话不多说 xff0c 直接上代码 1 Client部分 xff1a include include include
  • Vm虚拟机扩展Ubuntu系统磁盘空间

    Vm虚拟机扩展Ubuntu系统磁盘空间 前言 一般我们在安装虚拟机时都会选择默认的20G磁盘空间 xff0c 但是一旦需要搭建一两个交叉编译环境后 xff0c 20G的空间就无法满足了 xff0c 我就是出现了这样的情况 xff0c 所以也
  • Qt添加菜单栏和工具栏

    Qt添加菜单栏和工具栏 版本说明 版本作者时间备注0 1loon2018 10 24初稿 目录 文章目录 Qt添加菜单栏和工具栏版本说明目录一 需求与目的二 详细说明三 最后 一 需求与目的 一般常规的PC软件都会有主窗口 xff0c 主窗
  • Qt关于tabwidget的使用及注意事项

    Qt关于tabwidget的使用及注意事项 版本说明 版本作者日期备注0 1loon2018 11 12初稿 目录 文章目录 Qt关于tabwidget的使用及注意事项版本说明目录一 需求和目的二 了解QTabWIDget类及用法1 详细描
  • SLIC算法介绍

    SLIC xff08 simple linear iterativeclustering xff09 xff0c 即 简单线性迭代聚类 x1f49b 它是2010年提出的一种思想简单 实现方便的算法 xff0c 将彩色图像转化为CIELAB
  • 利用libwebsockets写ws、wss服务端和客户端

    利用libwebsockets写ws wss服务端和客户端 文章目录 利用libwebsockets写ws wss服务端和客户端服务端 xff1a 客户端官网例子坑点 服务端 xff1a server c span class token
  • 封装利用libwebsockets写出的客户端、服务端程序为客户端服务端类

    封装利用libwebsockets写出的客户端 服务端程序为客户端服务端类 文章目录 封装利用libwebsockets写出的客户端 服务端程序为客户端服务端类1 封装2 封装后写wss客户端 服务端3 测试结果4 客户端 服务端类程序 1

随机推荐