有些网站需要用户登录,利用python实现知乎网站的模拟登录。用Cookies记录登录信息, 然后就可以抓取登录之后才能看到的信息。

知乎登录首页

浏览器行为">第一、使用Fiddler观察“登录”浏览器行为

打开工具Fiddler,在浏览器中访问https://www.zhihu.com,Fiddler 中就能看到捕捉到的所有连接信息。在左侧选择登录的那一条:

观察右侧,打开 Inspactors 透视图, 上方是该条连接的请求报文信息, 下方是响应报文信息:

1.2 用户登录信息

1.3 Raw显示请求报头原文

1.4下方:回应报文

2.1 抓取知乎首页

简单的写一个 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 了。

2.2 使用正则表达式获取沙漠之舟

_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]

2.3 发射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;

2.4 完整爬虫代码

'''

登录

对于需要用户登录的网站信息的爬取

'''

import urllib.request,gzip,re,http.cookiejar,urllib.parse

import sys

#解压缩函数

def ungzip(data):

try:

print("正在解压缩...")

data = gzip.decompress(data)

print("解压完毕...")

except:

print("未经压缩,无需解压...")

return data

#构造文件头

def getOpener(header):

#设置一个cookie处理器,它负责从服务器下载cookie到本地,并且在发送请求时带上本地的cookie

cookieJar = http.cookiejar.CookieJar()

cp = urllib.request.HTTPCookieProcessor(cookieJar)

opener = urllib.request.build_opener(cp)

headers = []

for key,value in header.items():

elem = (key,value)

headers.append(elem)

opener.addheaders = headers

return opener

#获取_xsrf

def getXsrf(data):

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

strlist = cer.findall(data)

return strlist[0]

#根据网站报头信息设置headers

headers = {

'Connection': 'Keep-Alive',

'Accept': '*/*',

'Accept-Language':'zh-CN,zh;q=0.8',

'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.63 Safari/537.36',

'Accept-Encoding': 'gzip, deflate,br',

'Host': 'www.zhihu.com',

'DNT':'1'

}

url = "https://www.zhihu.com/"

req=urllib.request.Request(url,headers=headers)

res=urllib.request.urlopen(req)

#读取知乎首页内容,获得_xsrf

data = res.read()

data = ungzip(data)

_xsrf = getXsrf(data.decode('utf-8'))

opener = getOpener(headers)

#post数据接收和处理的页面(我们要向这个页面发送我们构造的Post数据)

url+='login/email'

name='fly_yr2012@163.com'

passwd='zhihu2016'

#分析构造post数据

postDict={

'_xsrf':_xsrf,

'email':name,

'password':passwd,

'remember_me':'true'

}

#给post数据编码

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

#构造请求

res=opener.open(url,postData)

data = res.read()

#解压缩

data = ungzip(data)

print(data.decode())

第三、运行结果

GitHub源码链接

python3爬虫知乎_Python3 爬虫实例(四) -- 登录知乎相关推荐

  1. python3爬虫及数据分析_Python3爬虫及可视化数据分析系列图文教程——大纲目录...

    本文首发于:Python3爬虫及可视化数据分析系列图文教程--大纲目录 - Python量化投资​www.lizenghai.com 写在最前 最近更新:2019-03-28 本教程所有源码见文尾. ...

  2. python3 selenium安装教程_Python3爬虫利器之Selenium的安装

    Selenium是一个自动化测试工具,利用它我们可以驱动浏览器执行特定的动作,如点击.下拉等操作.对于一些JavaScript渲染的页面来说,这种抓取方式非常有效.下面我们来看看Selenium的安装 ...

  3. python3爬虫下载音乐_python3爬虫:下载网易云音乐排行榜

    "' 遇到python不懂的问题,可以加Python学习交流群:1004391443一起学习交流,群文件还有零基础入门的学习资料 "' import requests import ...

  4. python3.4.4教程_Python3基础教程四(个人整理

    <Python3基础教程四(个人整理>由会员分享,可在线阅读,更多相关<Python3基础教程四(个人整理(21页珍藏版)>请在人人文库网上搜索. 1.Python运算符优先级 ...

  5. python爬虫实验总结_python3爬虫总结(共4篇).docx

    python3爬虫总结(共4篇) 学用python也有3个多月了,用得最多的还是各类爬虫脚本:写过抓代理本机验证的脚本,写过在discuz论坛中自动登录自动发贴的脚本,写过自动收邮件的脚本,写过简单的 ...

  6. python3爬虫实例代码-Python3爬虫带上cookie的实例代码

    Cookie的英文原意是"点心",它是在客户端访问Web服务器时,服务器在客户端硬盘上存放的信息,好像是服务器发送给客户的"点心".服务器可以根据Cookie来 ...

  7. python3 爬虫_Python3爬虫介绍

    Python3爬虫介绍 一.为什么要做爬虫 首先请问:都说现在是"大数据时代",那数据从何而来? 数据管理咨询公司:麦肯锡.埃森哲.艾瑞咨询 爬取网络数据:如果需要的数据市场上没有 ...

  8. Python3网络爬虫(四): 登录

    转载:http://www.yiibai.com/python/python3-webbug-series4.html 第一步: 使用 Fiddler 观察浏览器行为 在开着 Fiddler 的条件下 ...

  9. python爬虫教程书籍-python爬虫有哪些书(python爬虫教程知乎)

    python爬虫有哪些书 python有哪?下面给大家介绍6本有关爬书: 更多Python书籍推荐,可以参考这篇文<想学python看哪些书> 1.Python网络爬虫实战 本书从Pyth ...

最新文章

  1. 皮一皮:这是要红啊...
  2. java打印图片到页面_在Java中打印BufferedImage的正确方法
  3. linux远程脚本事例,ssh远程执行命令方法和Shell脚本实例
  4. 'Push segues can only be used when the source controller is managed by an instance of UINavigationC
  5. powerdesigner基本使用 - 创建概念模型
  6. Word 2016加载Endnote x9的方法
  7. 【Linux基础】 diff命令的参数详解和实例
  8. 前端学习(3011):vue+element今日头条管理--关于编辑器代码段
  9. python socket 发送图片
  10. 我是如何从通信成功转型为 Java 软件开发工程师的?
  11. 如何elf文件转换为asm汇编文件
  12. 浅谈JAVA工作流的优雅实现方式
  13. 修改iphone模拟器hosts
  14. 如何用计算机直接做工资表,超简单一招!用Excel十秒快速制作工资条
  15. Civil 3d 交叉口标注
  16. QBXT 2018春季DP图论班 2018.5.4 --- 树形DP
  17. Step1我学习ros2的一些经历(从ubuntu安装到ros2中的位姿转换)
  18. 【舒利迭】 沙美特罗替卡松粉吸入剂 (50微克 250微克)
  19. excel中多列内容显示不全
  20. python实现批量改名

热门文章

  1. 世界上最难征服的山峰排行
  2. 指导教师的shooow
  3. 前端小菜 - web 初相识
  4. dorado7数据库准备工作出现的错误
  5. 通用计算机的硬件一般由五大组成,计算机五大部件是指什么
  6. qml中使用canvas绘制温度计
  7. POI .xlsx格式前端下载为.xls问题解决
  8. Toolbox for Emotional feAture extraction from Physiological signals (TEAP) 论文部分意译
  9. java中数组的length_java中数组有没有length()方法?string没有lenght()方法?
  10. pom文件(本地邮箱服务器配置)