今天的工作很有意思, 我们用 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()) #

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

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

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

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

  1. python爬取网页url_Python网络爬虫之利用urllib2通过URL抓取网页内容

    所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地. 类似于使用程序模拟IE浏览器的功能,把URL作为HTTP请求的内容发送到服务器端, 然后读取服务器端的响应资源. 一.通 ...

  2. Python网络爬虫数据采集实战:同花顺动态网页爬取

    前文的爬虫都建立在静态网页基础之上,首先通过请求网站url获取到网页源代码.之后对源代码进行信息提取进而存储即可,本文则针对动态网页进行数据采集,首先介绍Ajax相关理论,之后实战爬取同花顺动态网页, ...

  3. Python学习笔记18:实操案例十五(记录用户登录日志,模拟淘宝客服自动回复)

    Python学习笔记18:实操案例十五(记录用户登录日志,模拟淘宝客服自动回复) 网课传送门:https://www.bilibili.com/video/BV1Sw411Z779?p=168& ...

  4. 网络爬虫系列(一):chrome抓包分析

    网络爬虫系列(一):chrom抓包分析 1.测试环境 2.网页分析 (1) 网页源代码分析 (2) 网络抓包分析 1.测试环境 浏览器:chrome浏览器 网页分析工具 :开发者工具 2.网页分析 ( ...

  5. 【Python】Python3网络爬虫实战-27、Requests与正则表达式抓取猫眼电影排行

    本节我们利用 Requests 和正则表达式来抓取猫眼电影 TOP100 的相关内容,Requests 相较于 Urllib 使用更加方便,而目前我们还没有系统学习 HTML 解析库,所以可能对 HT ...

  6. python下载电影天堂视频_一篇文章教会你利用Python网络爬虫获取电影天堂视频下载链接...

    点击上方"IT共享之家",进行关注 回复"资料"可获赠Python学习福利 [一.项目背景] 相信大家都有一种头疼的体验,要下载电影特别费劲,对吧?要一部一部的 ...

  7. python下载电影天堂视频教程_一篇文章教会你利用Python网络爬虫获取电影天堂视频下载链接|python基础教程|python入门|python教程...

    https://www.xin3721.com/eschool/pythonxin3721/ [一.项目背景] 相信大家都有一种头疼的体验,要下载电影特别费劲,对吧?要一部一部的下载,而且不能直观的知 ...

  8. Python实践 - 网络爬虫笔记 - 2、从网站上爬取公开信息

    Python实践笔记 - 2.从网站上爬取公开信息 张板书的Python的实践笔记,包括笔记与DeBug的经历. 为了完成一个比较麻烦的实习任务,尝试着做了这样一个爬虫项目. 任务要求之一是要检索安徽 ...

  9. Python网络爬虫(四):selenium+chrome爬取美女图片

    说明: Python版本:Python IDE:PyCharm chrome版本:我的版本63 chromedriver.exe:因为是模拟浏览器访问,chrome需要再下载一个驱动,具体方式在我的上 ...

  10. 用python画易烊千玺_竟然如此简单!输入明星名字就可以直接爬取高清图片

    听说你在自己喜欢的明星壁纸?比如李易峰,王一博,易烊千玺.王源.王俊凯,李现等.今天教你批量下载这些明星高清壁纸(文末有福利) 最近图慌,闲来无事爬取李易峰的高清图片,当做手机壁纸也是不错的选择.废话 ...

最新文章

  1. mysqldump导入导出百万级数据解决方案
  2. 数据库事务和spring事务的区别
  3. 3.4 matlab用for语句实现循环结构
  4. 探讨Redhat的开源“成功之道”
  5. php 枚举类型比较,java 枚举类比较是用==还是equals?
  6. sql企业管理器_Valentina Studio for mac(开源数据库管理器)
  7. 网络编程-TCP/IP协议栈-UDP/HTTP协议
  8. openjdk和jdk_JDK 11:发行候选更新和OpenJDK JDK 11 LTS
  9. 【CCF】201412-1门禁系统
  10. Crystal Reports Maximum Report Processing Jobs Limit
  11. 浅谈Android项目----JSON解析(4种解析技术详解)
  12. ab753变频器参数怎么拷贝到面板_20款常用变频器密码,想成为电工老师傅你一定需要,纯干货分享!...
  13. html5 密码强度,前端开发判断输入密码强度
  14. 手机号码归属地查询api [开源]
  15. 【转】全球十部最经典的科幻片,你看过几部?
  16. Android M的App Links实现详解
  17. Excel从手机号和座机号混合文本中提取手机号码
  18. Oracle数据库查询表中记录为空,Empty result set fetched
  19. krpano场景拖动时拖动惯性消失的问题
  20. w7系统怎么开启打印机服务器,W7系统如何开启打印机服务

热门文章

  1. 图论专项shortest_paths:UVa 10246
  2. Oracle中的next_day(date,char)
  3. 阿里云服务器购买价格,真正实用的阿里云服务器价格表
  4. 物联网是什么意思?物联网概念是什么?
  5. 网站域名有哪些不同的种类?
  6. Filco圣手二代双模蓝牙机械键盘的连接方法
  7. html 首行缩进两个空格,关于css的text-indent首行缩进两个字符和图片缩进的问题...
  8. 210917-电脑护眼模式总结
  9. 学渣考深大计算机,江苏科技大学又出学霸宿舍,6名同学全部考上研究生
  10. 作为一名程序员如何在国内使用谷歌搜索技术(Google)?