利用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. ...
随机推荐
- 51NOD 1227 平均最小公倍数 [杜教筛]
1227 平均最小公倍数 题意:求\(\frac{1}{n} \sum_{i=1}^n lcm(n,i)\) 和的弱化版? \[ ans = \frac{1}{2}((\sum_{i=1}^n \su ...
- ManagementObjectSearcher Path
为了获取硬件信息,你还需要创建一个ManagementObjectSearcher 对象.ManagementObjectSearcher searcher = new ManagementObjec ...
- MarkDown 编辑数学公式
1. 参考博客:http://blog.csdn.net/smstong/article/details/44340637 1 数学公式的web解决方案 在网页上显示漂亮的数学公式,是多年来数学工作者 ...
- [经典] 使用Python批量重命名iPhone拍摄的照片-按照拍摄时间重命名
#!/usr/bin/env python # -*- coding: utf-8 -*- ''' 批量修改照片文件名称的Python脚本程序. 遍历指定目录(含子目录)的照片文件,根据拍照时间将照片 ...
- Linux ipip隧道及实现
一.IP隧道技术 IP隧道技术:是路由器把一种网络层协议封装到另一个协议中以跨过网络传送到另一个路由器的处理过程.IP 隧道(IP tunneling)是将一个IP报文封装在另一个IP报文的技术,这可 ...
- Linux系统Go开发环境搭建
Go 语言是由谷歌的科学家开发的,并开源的新语言,被誉为"21世纪的C语言",它的主要目标是将静态语言的安全性和高效性与动态语言的易开发性进行有机结合,达到完美平衡,从而使编程变得 ...
- Linux命令之tar-rsync
一.tar命令 可以对文件和目录进行打包压缩(相较于zip.gzip.bzip2不能对目录进行压缩,tar是一大优势) 用途:制作归档文件.释放归档文件 基本格式: 压缩---> tar [选 ...
- Python自动化测试、性能测试成长路线图
Python自动化测试成长路线图 性能测试成长路线图
- mysql有多条记录的单个字段想存为一个字段显示的方法
SELECT po.id,(SELECT GROUP_CONCAT(mr.member_type) as memberTypeList FROM prod_offer_member_rel mr WH ...
- keras初涉笔记【一】
安装keras依赖的库 sudo pip install numpy sudo pip install scipy sudo pip installl pyyaml sudo pipi install ...