利用scrapy模拟登录知乎
闲来无事,写一个模拟登录知乎的小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)
本次登录后,并未对页面进行解析,只是打印一下页面,作为验证。
利用scrapy模拟登录知乎的更多相关文章
- Scrapy模拟登录知乎
建立项目 scrapy startproject zhihu_login scrapy genspider zhihu www.zhihu.com 编写spider 知乎的登录页url是http:// ...
- 2020.10.20 利用POST请求模拟登录知乎
前两天学习了Python的requests模块的相关内容,对于用GET和PSOT请求访问网页以抓取需要的内容有了初步的了解,想要再从一些复杂的网站积累些经验.最开始我采用最简单的get(url)方法想 ...
- scrapy模拟登录微博
http://blog.csdn.net/pipisorry/article/details/47008981 这篇文章是介绍使用scrapy模拟登录微博,并爬取微博相关内容.关于登录流程为嘛如此设置 ...
- Python爬虫初学(三)—— 模拟登录知乎
模拟登录知乎 这几天在研究模拟登录, 以知乎 - 与世界分享你的知识.经验和见解为例.实现过程遇到不少疑问,借鉴了知乎xchaoinfo的代码,万分感激! 知乎登录分为邮箱登录和手机登录两种方式,通过 ...
- requests_模拟登录知乎
如何登录知乎? 首先要分析,进行知乎验证的时候,知乎服务器需要我们提交什么数据,提交的地址.先进行几次登录尝试,通过浏览器中network中查看数据流得知,模拟登录知乎需要提供5个数据,分别是_xsr ...
- Python3之利用Cookie模拟登录
Python3之利用Cookie模拟登录 利用Cookie模拟登录步骤: 1. 在浏览器输入http://demo.bxcker.com,输入用户名和密码登录. 2.登录成功点" ...
- 忘记秘密利用python模拟登录暴力破解秘密
忘记秘密利用python模拟登录暴力破解秘密: #encoding=utf-8 import itertools import string import requests def gen_pwd_f ...
- python爬虫scrapy之登录知乎
下面我们看看用scrapy模拟登录的基本写法: 注意:我们经常调试代码的时候基本都用chrome浏览器,但是我就因为用了谷歌浏览器(它总是登录的时候不提示我用验证码,误导我以为登录时不需要验证码,其实 ...
- 【爬虫】python requests模拟登录知乎
需求:模拟登录知乎,因为知乎首页需要登录才可以查看,所以想爬知乎上的内容首先需要登录,那么问题来了,怎么用python进行模拟登录以及会遇到哪些问题? 前期准备: 环境:ubuntu,python2. ...
随机推荐
- ASM字节码框架学习之动态代理
ASM字节码操纵框架,可以直接以二进制的形式来来修改已经存在的类或者创建新的类.ASM封装了操作字节码的大部分细节,并提供了非常方便的接口来对字节码进行操作.ASM框架是全功能的,使用ASM字节码框架 ...
- [Python Study Notes]批量将wold转换为pdf
本文代码,由原ppt2pdf.py进行改写 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ...
- OpenVPN的那些坑
遇到的情形 最近遇到一种情况,当需要同时使用到多个VPN连接时,默认的openVPN连接是不支持的,但是可以通过手动配置虚拟网络适配器进行相关的设置. 具体解决方法 基本思路是:在本地的网络连接中添加 ...
- python[error] - mysql_config not found
具体报错信息: root@pts/4 $ pip install MySQL-python Collecting MySQL-python Using cached MySQL-python-1.2. ...
- Linux终端下 dstat 监控工具
dstat 是一个可以取代vmstat,iostat,netstat和ifstat这些命令的多功能产品.dstat克服了这些命令的局限并增加了一些另外的功能,增加了监控项,也变得更灵活了.dstat可 ...
- ansible安装
本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 1.配置epel源 wget -O /etc/yum.repos.d ...
- Spring_Spring与AOP_AspectJ基于注解的AOP实现
一.AspectJ.Spring与AOP的关系 AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Cl ...
- 0基础学python3心得体会 - python3学习笔记 - python3基础
基础预热 print()会依次打印每个字符串,遇到逗号","会输出一个空格,可以打印整数,或者计算 结果 Python提供了一个input(),,可以让用户输入字符串,并存放到一个 ...
- 真实场景的双目立体匹配(stereo matching)以及虚拟视点合成(virtual view synthsis)示例
双目立体匹配一直是双目视觉的研究热点,双目相机拍摄同一场景的左.右两幅视点图像,运用立体匹配匹配算法获取视差图,进而获取深度图.而深度图的应用范围非常广泛,由于其能够记录场景中物体距离摄像机的距离,可 ...
- js中的写出想jquery中的函数一样调用
1.IIFE: Immediately-Invoked function Expression 函数模块自调用 2.代码实现 <!DOCTYPE html> <html lang=& ...