加入收藏 | 设为首页 |

雷火网站-Python爬虫之模仿知乎登录

海外新闻 时间: 浏览:335 次

Python爬虫之模仿知乎登录

常常写爬虫的都知道,有些页面在登录之前是被制止抓取的,比方知乎的论题页面就要求用户登录才干拜访,而 “登录” 离不开 HTTP 中的 Cookie 技能。

登录原理

Cookie 的原理十分简略,由于 HTTP 是一种无状况的协议,因而为了在无状况的 HTTP 协议之上保护会话(session)状况,让服务器知道当时是和哪个客户在打交道,Cookie 技能呈现了 ,Cookie 适当所以服务端分配给客户端的一个标识。

cookie

  1. 浏览器第一次建议 HTTP 恳求时,没有带着任何 Cookie 信息
  2. 服务器把 HTTP 呼应,一同还有一个 Cookie 信息,一同回来给浏览器
  3. 浏览器第2次恳求就把服务器回来的 Cookie 信息一同发送给服务器
  4. 服务器收到HTTP恳求,发现恳求头中有雷火网站-Python爬虫之模仿知乎登录Cookie字段, 便知道之前就和这个用户打过交道了。

实战使用

用过知乎的都知道,只需供给用户名和暗码以及验证码之后即可登录。当然,这仅仅咱们眼中看到的现象。而背面躲藏的技能细节就需求凭借浏览器来发掘了。现在咱们就用 Chrome 来检查当咱们填完表单后,终究发生了什么?

(假如现已登录的,先退出)首要进入知乎的登录页面 www.zhihu.com/#signin ,翻开 Chrome 的开发者工具条(按 F12)先测验输入一个过错的验证码调查浏览器是怎么发送恳求的。

从浏览器的恳求能够发现几个要害的信息

  1. 登录的 URL 地址是 www.zhihu.com/login/email
  2. 登录需求供给的表单数据有4个:用户名(email)、暗码(password)、验证码(captcha)、_xsrf。
  3. 获取验证码的URL地址是 www.zhihu.com/captcha.gif…

_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.cooki雷火网站-Python爬虫之模仿知乎登录es.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(雷火网站-Python爬虫之模仿知乎登录) * 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(),
'rem雷火网站-Python爬虫之模仿知乎登录ember_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去拜访那些需求登录的页面了。

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