前言

对于经常写爬虫的大家都知道,有些页面在登录之前是被禁止抓取的,比如知乎的话题页面就要求用户登录才能访问,而 “登录” 离不开 HTTP 中的 Cookie 技术。

登录原理

Cookie 的原理非常简单,因为 HTTP 是一种无状态的协议,因此为了在无状态的 HTTP 协议之上维护会话(session)状态,让服务器知道当前是和哪个客户在打交道,Cookie 技术出现了 ,Cookie 相当于是服务端分配给客户端的一个标识。

浏览器第一次发起 HTTP 请求时,没有携带任何 Cookie 信息

服务器把 HTTP 响应,同时还有一个 Cookie 信息,一起返回给浏览器

浏览器第二次请求就把服务器返回的 Cookie 信息一起发送给服务器

服务器收到HTTP请求,发现请求头中有Cookie字段, 便知道之前就和这个用户打过交道了。

实战应用

用过知乎的都知道,只要提供用户名和密码以及验证码之后即可登录。当然,这只是我们眼中看到的现象。而背后隐藏的技术细节就需要借助浏览器来挖掘了。现在我们就用 Chrome 来查看当我们填完表单后,究竟发生了什么?

(如果已经登录的,先退出)首先进入知乎的登录页面 https://www.zhihu.com/#signin ,打开 Chrome 的开发者工具条(按 F12)先尝试输入一个错误的验证码观察浏览器是如何发送请求的。

从浏览器的请求可以发现几个关键的信息

登录的 URL 地址是 https://www.zhihu.com/login/email

登录需要提供的表单数据有4个:用户名(email)、密码(password)、验证码(captcha)、_xsrf。

获取验证码的URL地址是 https://www.zhihu.com/captcha.gif?r=1490690391695&type=login

_xsrf 是什么?如果你对CSRF(跨站请求伪造)攻击非常熟悉的话,那么你一定知道它的作用,xsrf是一串伪随机数,它是用于防止跨站请求伪造的。它一般存在网页的 form 表单标签中,为了证实这一点,可以在页面上搜索 “xsrf”,果然,_xsrf在一个隐藏的 input 标签中

摸清了浏览器登录时所需要的数据是如何获取之后,那么现在就可以开始写代码用 Python 模拟浏览器来登录了。登录时所依赖的两个第三方库是 requests 和 BeautifulSoup,先安装

pip install beautifulsoup4==4.5.3

pip install requests==2.13.0

http.cookiejar 模块可用于自动处理HTTP Cookie,LWPCookieJar 对象就是对 cookies 的封装,它支持把 cookies 保存到文件以及从文件中加载。

而 session 对象 提供了 Cookie 的持久化,连接池功能,可以通过 session 对象发送请求

首先从cookies.txt 文件中加载 cookie信息,因为首次运行还没有cookie,所有会出现 LoadError 异常。

from http import cookiejar

session = requests.session()

session.cookies = cookiejar.LWPCookieJar(filename='cookies.txt')

try:

session.cookies.load(ignore_discard=True)

except LoadError:

print("load cookies failed")

获取 xsrf

前面已经找到了 xsrf 所在的标签,,利用 BeatifulSoup 的 find 方法可以非常便捷的获取该值

def get_xsrf():

response = session.get("https://www.zhihu.com", headers=headers)

soup = BeautifulSoup(response.content, "html.parser")

xsrf = soup.find('input', attrs={"name": "_xsrf"}).get("value")

return xsrf

获取验证码

验证码是通过 /captcha.gif 接口返回的,这里我们把验证码图片下载保存到当前目录,由人工识别,当然你可以用第三方支持库来自动识别,比如 pytesser。

def get_captcha():

"""

把验证码图片保存到当前目录,手动识别验证码

:return:

"""

t = str(int(time.time() * 1000))

captcha_url = 'https://www.zhihu.com/captcha.gif?r=' + t + "&type=login"

r = session.get(captcha_url, headers=headers)

with open('captcha.jpg', 'wb') as f:

f.write(r.content)

captcha = input("验证码:")

return captcha

登录

一切参数准备就绪之后,就可以请求登录接口了。

def login(email, password):

login_url = 'https://www.zhihu.com/login/email'

data = {

'email': email,

'password': password,

'_xsrf': get_xsrf(),

"captcha": get_captcha(),

'remember_me': 'true'}

response = session.post(login_url, data=data, headers=headers)

login_code = response.json()

print(login_code['msg'])

for i in session.cookies:

print(i)

session.cookies.save()

请求成功后,session 会自动把 服务端的返回的cookie 信息填充到 session.cookies 对象中,下次请求时,客户端就可以自动携带这些cookie去访问那些需要登录的页面了。

auto_login.py 示例代码

# encoding: utf-8

# !/usr/bin/env python

"""

作者:liuzhijun

"""

import time

from http import cookiejar

import requests

from bs4 import BeautifulSoup

headers = {

"Host": "www.zhihu.com",

"Referer": "https://www.zhihu.com/",

'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87'

}

# 使用登录cookie信息

session = requests.session()

session.cookies = cookiejar.LWPCookieJar(filename='cookies.txt')

try:

print(session.cookies)

session.cookies.load(ignore_discard=True)

except:

print("还没有cookie信息")

def get_xsrf():

response = session.get("https://www.zhihu.com", headers=headers)

soup = BeautifulSoup(response.content, "html.parser")

xsrf = soup.find('input', attrs={"name": "_xsrf"}).get("value")

return xsrf

def get_captcha():

"""

把验证码图片保存到当前目录,手动识别验证码

:return:

"""

t = str(int(time.time() * 1000))

captcha_url = 'https://www.zhihu.com/captcha.gif?r=' + t + "&type=login"

r = session.get(captcha_url, headers=headers)

with open('captcha.jpg', 'wb') as f:

f.write(r.content)

captcha = input("验证码:")

return captcha

def login(email, password):

login_url = 'https://www.zhihu.com/login/email'

data = {

'email': email,

'password': password,

'_xsrf': get_xsrf(),

"captcha": get_captcha(),

'remember_me': 'true'}

response = session.post(login_url, data=data, headers=headers)

login_code = response.json()

print(login_code['msg'])

for i in session.cookies:

print(i)

session.cookies.save()

if __name__ == '__main__':

email = "xxxx"

password = "xxxxx"

login(email, password)

github源码地址:https://github.com/lzjun567/crawler_html2pdf/blob/master/zhihu/auto_login.py

总结

以上就是关于Python爬虫之模拟知乎登录的全部内容,希望本文的内容对大家学习或者使用python能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

本文标题: Python爬虫之模拟知乎登录的方法教程

本文地址: http://www.cppcns.com/jiaoben/python/192083.html

python爬虫登录教程_Python爬虫之模拟知乎登录的方法教程相关推荐

  1. python rsa 公钥解密_python利用rsa库做公钥解密的方法教程

    前言 对于RSA的解密,即密文的数字的 D 次方求mod N 即可,即密文和自己做 D 次乘法,再对结果除以 N 求余数即可得到明文.D 和 N 的组合就是私钥(private key). 算法的加密 ...

  2. python爬虫模拟与思考_Python爬虫之模拟知乎登录

    昨天受邀在 CSDN 微信群做了一次 Python 技术分享,主题是<用Python模拟知乎登录>,效果非常不错,发现越来越多的人加入到了 Python 阵容中. 经常写爬虫的都知道,有些 ...

  3. python获取登录按钮_Python:Selenium模拟Chrome浏览器抓取淘宝商品信息

    对于采用异步加载技术的网页,有时候想通过逆向工程的方式来设计爬虫进行爬取会比较困难,因此,要想通过python获取异步加载数据往往可以使用Selenium模拟浏览器的方式来获取. Selenium是一 ...

  4. 学习笔记 -- 用python中的selenium模拟知乎登录

    文章目录 前言 一.模拟知乎登录的准备 二.登录验证码的问题 1.英文验证码 2.中文倒立文字验证码 三.完整代码如下 四.总结 前言 最近在学习python爬虫,为了巩固爬虫的知识,偶尔会写一些简单 ...

  5. python爬虫登录微博_python爬虫-模拟微博登录

    微博模拟登录 这是本次爬取的网址:https://weibo.com/ 一.请求分析 找到登录的位置,填写用户名密码进行登录操作 看看这次请求响应的数据是什么 这是响应得到的数据,保存下来 exect ...

  6. python模拟登录网站_Python爬虫之模拟登录wechat

    不知何时,微信已经成为我们不可缺少的一部分了,我们的社交圈.关注的新闻或是公众号.还有个人信息或是隐私都被绑定在了一起.既然它这么重要,如果我们可以利用爬虫模拟登录,是不是就意味着我们可以获取这些信息 ...

  7. python爬虫登录微博_python爬虫-模拟微博登录功能

    微博模拟登录 这是本次爬取的网址:https://weibo.com/ 一.请求分析 找到登录的位置,填写用户名密码进行登录操作 看看这次请求响应的数据是什么 这是响应得到的数据,保存下来 exect ...

  8. python爬虫基础项目教程_Python爬虫入门项目

    Python是什么 Python是著名的"龟叔"Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言. 创始人Guido van Ros ...

  9. python获取登录按钮_python爬虫24 | 搞事情了,用 Appium 爬取你的微信朋友圈。

    昨天小帅b看到一些事情不顺眼 有人偷换概念 忍不住就写了一篇反讽 996 的 看不下去了,我支持996,年轻人就该996! 没想到有些人看不懂 这就算了 还来骂我 早些时候关注我的小伙伴应该知道我第一 ...

最新文章

  1. 电路交换-报文交换-分组交换- 分组交换包括:虚电路和数据报
  2. php 结构体_php基础知识集合
  3. 如何设置MySQL的环境变量
  4. mysql @符号_quot;Incorrect string value quot; mysql 乱码 my插入emoji Yii2
  5. Eclipse 工具栏不见了
  6. Flutter进阶—创建有状态控件
  7. 网络编程-----网络通信协议
  8. 听力测试英语软件初中,初中生英语听力软件
  9. 3dmax2016卸载/安装失败/如何彻底卸载清除干净3dmax2016注册表和文件的方法
  10. acrobat PDF删除部分_【低碳环保打印四大金刚】四款优秀的专业PDF虚拟打印机分享...
  11. 用php写出一个网站的模板,25 个 PHP 的 Web 开发程序网站模板
  12. 敏捷开发(scrum)简介
  13. 牛客网面试提错题集(1)
  14. 练习:使用Python爬取COVID-19疫情国内当日数据
  15. 如何排两列的序计算机考试,excel中两列数据怎么一起排序?excel两列同时排序的方法...
  16. Coursera | Python for Everybody专项课程
  17. BigDecimel转人民币大写
  18. codevs 2964 公共素数因数
  19. [电池]设置-电池-上次充满电时间计算
  20. 为什么有人说富坚义博有着殿堂级的画功?他的画功体现在哪儿呢?

热门文章

  1. openGL GLSL GLSL.Refract Reflect Diffraction 反射、折射、衍射Fresnel Effect
  2. 校招面试过程中几个需要注意的地方
  3. 如何遍历一棵树(基于Python的理解以及实现)
  4. 银泰百货推出B2C网站 由中国服装网创始人廖斌掌舵
  5. 如何区分WS_POPUP、WS_OVERLAPPED和WS_CHILD
  6. PhotoSweeper for Mac v4.3.0 – 重复照片查找删除工具
  7. 【研发工程师专辑】新品万用表15B/17B MAX能解决哪些问题?
  8. ufl计算机科学排名,美国佛罗里达大学排名解析
  9. 河南工程学院OJ郑州轻工业学院OJ代码(C语言)
  10. 网络入侵检测系统之Suricata(四)--初始化模块代码详解