闲来无事,写一个模拟登录知乎的小demo。

分析网页发现:登录需要的手机号,密码,_xsrf参数,验证码

实现思路:

1、获取验证码

2、获取_xsrf 参数

3、携带参数,请求登录

验证码url : "https://www.zhihu.com/captcha.gif?r={t}&type=login&lang=en".format(t=t)  # t 为时间戳

登录界面url : "https://www.zhihu.com/#signin"

手机登录申请url : 'https://www.zhihu.com/login/phone_num'

实现代码:

  首先配置文件 settings 中 ROBOTSTXT_OBEY = False

  1、开头及验证码处理部分,先重写scrapy的start_requests方法。其次利用Pillow 来处理验证码,将验证码显示出来,手动填写(毕竟打码是需要费用的),知乎默认的验证码为中文,经分析发现验证码url 后面的 lang 参数决定语言,所以试着将语言改为英文(en)

# -*- coding: utf-8 -*-
import scrapy
import time
import json
from PIL import Image class ZhihuSpider(scrapy.Spider):
name = 'zhihu'
allowed_domains = ['www.zhihu.com'] # 重写start_requests方法,处理验证码问题
def start_requests(self):
t = str(time.time()).replace('','.')
# 验证码url
start_urls = "https://www.zhihu.com/captcha.gif?r={t}&type=login&lang=en".format(t=t)
self.header ={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36",
'Referer':' https: // www.zhihu.com /'
}
# 请求验证码的url
return [scrapy.Request(url=start_urls,headers=self.header,callback=self.capcha,dont_filter=True)] # 获取验证码
def capcha(self,response):
# 获取验证码,将验证马写入本地
with open('capcha.jpg','wb') as f:
f.write(response.body)
try:
# 利用pillow打开验证码
im = Image.open('capcha.jpg')
im.show()
except:
print('请打开文件%s自行输入'%("capcha.jpg"))
cap = input("请输入验证码>>")
data = {
"cap":cap
}
log_url = "https://www.zhihu.com/#signin"
return scrapy.Request(url=log_url,callback=self.parse_login,headers=self.header,meta=data,dont_filter=True)

  2、得到验证码后,开始搞_xsrf参数,从登录源码中分析得到_xsrf 在属性为name="_xsrf" 的input 节点中的value值

  # 解析申请登陆的页面,获取参数xsrf
def parse_login(self,response):
xsrf = response.xpath('//input[@name="_xsrf"]/@value').extract_first()
if not xsrf:
print("请求错误")
return ''
phone_num = input("请输入手机号码")
password = input("请输入密码")
data = {
'captcha':response.meta['cap'],
'_xsrf':xsrf,
'password':password,
'captcha_type':' en',
'phone_num':phone_num
}
# 用手机号-密码 登录的url
url = 'https://www.zhihu.com/login/phone_num'
return scrapy.FormRequest(url=url,callback=self.login_zh,headers=self.header,formdata=data,dont_filter=True,meta={'direct_list': [301, 302], 'direct_ignore': True})

3、参数都获取到后就可以模拟登录了

    # 验证是否登录成功
def login_zh(self,response):
print(json.loads(response.text)['msg'])
url = "https://www.zhihu.com/#signin"
# 请求登录知乎
yield scrapy.Request(url=url,callback=self.zh,headers=self.header,dont_filter=True,meta={'direct_list':[301,302],'direct_ignore':True}) # 后续解析知乎登录后的页面
def zh(self,response):
print(response.text)

本次登录后,并未对页面进行解析,只是打印一下页面,作为验证。

最新文章

  1. C#中调用user32.dll库的keybd_Event函数,操作键盘
  2. bs4的学习
  3. checkbox与说明文字无法对齐的问题
  4. Know How To Use ID_NULL Function To Search An Object In Oracle Forms
  5. 二模08day1解题报告
  6. Loadrunner:安装LR11时提示缺少vc2005_sp1_with_atl_fix_redist
  7. pthread_create线程创建的过程剖析(转)
  8. linux安装tomcat, jdk出现的问题
  9. Python中的re模块--正则表达式
  10. 敦泰FT6X06单层自容调屏
  11. 洛谷 P1962 斐波那契数列
  12. JN_0006:MongoDB未授权访问漏洞处理
  13. zoj 1649 bfs
  14. Js 常用调试的方法
  15. poj1562 Oil Deposits 深搜模板题
  16. django的查看sql语句setting设置
  17. 解决AS gradle下载同步卡慢的问题
  18. 洛谷P4562 [JXOI2018]游戏 数论
  19. python advanced programming (Ⅲ)
  20. Linux中Nginx安装与配置详解

热门文章

  1. 【视频编解码·学习笔记】6. H.264码流分析工程创建
  2. Flink入门使用
  3. Spring Task定时任务Scheduled
  4. 【转】Nginx配置详解
  5. MySQL开启binlog并且保存7天有效数据
  6. ssh快速登录远程服务器
  7. linux 添加静态路由
  8. JVM中对象访问定位两种方式
  9. 基于netty框架的Socket传输
  10. java1 - 环境与简介