python爬虫scrapy之登录知乎

时间:2022-09-22 14:45:33

下面我们看看用scrapy模拟登录的基本写法:

  注意:我们经常调试代码的时候基本都用chrome浏览器,但是我就因为用了谷歌浏览器(它总是登录的时候不提示我用验证码,误导我以为登录时不需要验证码,其实登录时候必须要验证码的),这里你可以多试试几个浏览器,一定要找个提示你输入验证码的浏览器调试。

  1、我们登录的时候,提示我们输入验证码,当验证码弹出之前会有个请求,我们打开这个请求,很明显,type是login,验证码无疑了,就算是看请求的因为名,你也应该知道这个就是验证码的请求,或者打开这个验证码的请求url,这。

  python爬虫scrapy之登录知乎

  python爬虫scrapy之登录知乎

  验证码的图片,悲惨了,这怎么整。别着急。。

  python爬虫scrapy之登录知乎

  2、验证码提示我们要点击倒着写的字体,这。。。,爬虫和反爬虫就是无休止的互相折磨。这明显就是上面那个图片的信息。

  python爬虫scrapy之登录知乎

  3、机智的我,发现验证码的请求参数里面有三个参数,r是一个13位的数字,type是登录用的,lang很可疑,改改它,把cn给他改成en。mygod这不也是验证码么,就试试它了。

  python爬虫scrapy之登录知乎

  python爬虫scrapy之登录知乎

  4、页面基本登录原理分析完了,我们接下来看看代码怎么写,首先我们重构scrapy的start_requests方法(有scrapy基础的同学都知道,这个名字可不是瞎写的)。

  5、分析这个验证码的请求连接,https://www.zhihu.com/captcha.gif?r=1511878790500&type=login&lang=en,这里面都可以固定,但是这个验证码肯定不行,13位的数字,果断想到了当前时间

   最后,我们要请求这个url,这里必须要加上请求头信息,callback就是下面你要执行的方法。

    def start_requests(self):
'''
1、首先构造并抓取登录需要提交的验证码
:return:
'''
t = str(int(time.time() * 1000))
captcha_url = 'https://www.zhihu.com/captcha.gif?r={0}&type=login&lang=en'.format(t)
return [scrapy.Request(url=captcha_url, headers=self.header, callback=self.parser_captcha)]

  6、上面请求完成后,就会将请求结果直接返回个下面的这个方法,所以它必须有个形式参数,来接收请求的结果,首先我们将请求的的结果,其实就是刚才我们看到的那个图片,图片的信息就在body里面,直接将整个body存成一个文件,然后我这里用的是Image打开我们存入的文件,文件都给你打开了,你还不得看看输入一下(如果你有云大码平台的服务,就直接让云大码平台搞定就行),这里我们只能自己看自己输入了。搞完了验证码,我们现在准备开始登陆,这里可不是直接用登陆的url登陆就行,你仔细的话还有个xrsf参数需要我们获取,那就请求的url直接就是登陆页面,注意你的头部信息,不伪装一下,立马给你请求出错。callback就不说了吧。这需要注意的就是,这直接把验证码存入了scrapy的meta里面了。

    def parser_captcha(self, response):
'''
1、根据start_requests方法返回的验证码,将它存入本地
2、打开下载下来的验证码
3、这里是需要手动输入的,这里可以接入打码平台
:param response:
:return:
'''
with open('captcha.jpg', 'wb') as f:
f.write(response.body)
f.close()
try:
im = Image.open('captcha.jpg')
im.show()
im.close()
except:
pass
captcha = input("请输入你的验证>")
return scrapy.FormRequest(url='https://www.zhihu.com/#signin', headers=self.header, callback=self.login, meta={
'captcha': captcha
})

  7、下面我们来搞定xsrf参数,这里我用xpath,一句话搞定,下面就是post_url就是上面phone_num请求里面的url,也是真正意义上的post提交登录信息的url。因为我们已经把验证码放进了meta里面了,所以这里直接获取就行。基本登录信息伪装完成以后,开始提交登录信息,登录完成以后,我们设置一个callback回调方法,检查一下登录信息。

    def login(self, response):
xsrf = response.xpath("//input[@name='_xsrf']/@value").extract_first()
if xsrf is None:
return ''
post_url = 'https://www.zhihu.com/login/phone_num'
post_data = {
"_xsrf": xsrf,
"phone_num": '你的账户名称',
"password": '你的账户密码',
"captcha": response.meta['captcha']
}
return [scrapy.FormRequest(url=post_url, formdata=post_data, headers=self.header, callback=self.check_login)]

  8、上面请求完成以后,会返回我们一个字典,这里我们判断一下是否登录成功,如果登录成功以后,就执行我们start_urls里面的url地址,因为已经登录成功了,所以这里我们的start_urls就是https://www.zhihu.com,这样我们就可以再parse方法里面继续解析我们登录后的html信息了。

    def check_login(self, response):
js = json.loads(response.text)
print(js)
if 'msg' in js and js['msg'] == '登录成功':
for url in self.start_urls:
print(url)
yield scrapy.Request(url=url, headers=self.header, dont_filter=True)
else:
print("登录失败,请检查!!!")

  

  

代码如下:

import json
import scrapy
import time
from PIL import Image class ZhihuloginSpider(scrapy.Spider):
name = 'zhihu_login'
allowed_domains = ['zhihu.com']
start_urls = ['https://www.zhihu.com/']
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',
} def parse(self, response):
#主页爬取的具体内容
print(response.text) def start_requests(self):
'''
1、首先构造并抓取登录需要提交的验证码
:return:
'''
t = str(int(time.time() * 1000))
captcha_url = 'https://www.zhihu.com/captcha.gif?r={0}&type=login&lang=en'.format(t)
return [scrapy.Request(url=captcha_url, headers=self.header, callback=self.parser_captcha)] def parser_captcha(self, response):
'''
1、根据start_requests方法返回的验证码,将它存入本地
2、打开下载下来的验证码
3、这里是需要手动输入的,这里可以接入打码平台
:param response:
:return:
'''
with open('captcha.jpg', 'wb') as f:
f.write(response.body)
f.close()
try:
im = Image.open('captcha.jpg')
im.show()
im.close()
except:
pass
captcha = input("请输入你的验证>")
return scrapy.FormRequest(url='https://www.zhihu.com/#signin', headers=self.header, callback=self.login, meta={
'captcha': captcha
}) def login(self, response):
xsrf = response.xpath("//input[@name='_xsrf']/@value").extract_first()
if xsrf is None:
return ''
post_url = 'https://www.zhihu.com/login/phone_num'
post_data = {
"_xsrf": xsrf,
"phone_num": '你的账户名称',
"password": '你的账户密码',
"captcha": response.meta['captcha']
}
return [scrapy.FormRequest(url=post_url, formdata=post_data, headers=self.header, callback=self.check_login)] # 验证返回是否成功
def check_login(self, response):
js = json.loads(response.text)
print(js)
if 'msg' in js and js['msg'] == '登录成功':
for url in self.start_urls:
print(url)
yield scrapy.Request(url=url, headers=self.header, dont_filter=True)
else:
print("登录失败,请检查!!!")

  

python爬虫scrapy之登录知乎的更多相关文章

  1. python爬虫scrapy框架——人工识别知乎登录知乎倒立文字验证码和数字英文验证码

    目前知乎使用了点击图中倒立文字的验证码: 用户需要点击图中倒立的文字才能登录. 这个给爬虫带来了一定难度,但并非无法解决,经过一天的耐心查询,终于可以人工识别验证码并达到登录成功状态,下文将和大家一一 ...

  2. python爬虫scrapy框架——人工识别登录知乎倒立文字验证码和数字英文验证码(2)

    操作环境:python3 在上一文中python爬虫scrapy框架--人工识别知乎登录知乎倒立文字验证码和数字英文验证码(1)我们已经介绍了用Requests库来登录知乎,本文如果看不懂可以先看之前 ...

  3. Python爬虫之模拟登录微信wechat

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

  4. python爬虫Scrapy(一)-我爬了boss数据

    一.概述 学习python有一段时间了,最近了解了下Python的入门爬虫框架Scrapy,参考了文章Python爬虫框架Scrapy入门.本篇文章属于初学经验记录,比较简单,适合刚学习爬虫的小伙伴. ...

  5. python爬虫scrapy项目详解(关注、持续更新)

    python爬虫scrapy项目(一) 爬取目标:腾讯招聘网站(起始url:https://hr.tencent.com/position.php?keywords=&tid=0&st ...

  6. Python爬虫-百度模拟登录(二)

    上一篇-Python爬虫-百度模拟登录(一) 接上一篇的继续 参数 codestring codestring jxG9506c1811b44e2fd0220153643013f7e6b1898075 ...

  7. Python爬虫Scrapy框架入门(0)

    想学习爬虫,又想了解python语言,有个python高手推荐我看看scrapy. scrapy是一个python爬虫框架,据说很灵活,网上介绍该框架的信息很多,此处不再赘述.专心记录我自己遇到的问题 ...

  8. [Python爬虫] scrapy爬虫系列 <一>.安装及入门介绍

    前面介绍了很多Selenium基于自动测试的Python爬虫程序,主要利用它的xpath语句,通过分析网页DOM树结构进行爬取内容,同时可以结合Phantomjs模拟浏览器进行鼠标或键盘操作.但是,更 ...

  9. 安装python爬虫scrapy踩过的那些坑和编程外的思考

    这些天应朋友的要求抓取某个论坛帖子的信息,网上搜索了一下开源的爬虫资料,看了许多对于开源爬虫的比较发现开源爬虫scrapy比较好用.但是以前一直用的java和php,对python不熟悉,于是花一天时 ...

随机推荐

  1. nginx+fastcgi+c/cpp

    参考:http://github.tiankonguse.com/blog/2015/01/19/cgi-nginx-three/ 跟着做了一遍,然后根据记忆写的,不清楚有没错漏步骤,希望多多评论多多 ...

  2. HIVE: SerDe应用实例

    数据文件内容 id=123,name=steven id=55,name=ray 期望输出格式 123 steven 55 ray 1. 创建表, 用正则表达式的形式指定格式 create table ...

  3. ios 消息传递机制

    引用文章 一.KVO 1.当对象中的某个属性值发生了改变,可以对这些值的观察者做出通知. 2.接受者(会接收到值发生改变的消息) 必须知道发送者(值将发生改变的那个对象). 3.接收者同样还需要知道发 ...

  4. 关于GSMMAP分支cell_log扫描不正常问题的解决办法

    阔别多年,本周在KALI 2.0下重拾旧时趣味,可怎么折腾都未曾见ARFCN,迫不得已还刷了brust_ind分支 才达到目的.后经仔细翻阅官方文档发现此问题早有披露,解决方案也已经公布,逐分享给大家 ...

  5. 教程-MessageBox 使用方法

    对应对象:TApplication 声明:function MessageBox(Text,Caption:PChar;Flags:Word):Integer; 功能:MessageBox方法可以显示 ...

  6. P1822 魔法指纹

    一道放在分块训练中的分块打表屑题 看了神NaCly_Fish的题解学了间隔打表(话说这么屑的东西有什么学的必要吗) 内容大多摘自大佬的题解 1,答案可递推,才适合间隔打表 什么叫可递推呢?假设f[n] ...

  7. Zabbix监控——Zabbix自定义用户参数制作监控项

    https://blog.51cto.com/183530300/2087774 https://www.cnblogs.com/richardzgt/articles/7889404.html

  8. 设计模式-结构型模式,python组合模式

    设计模式上大的方向上分继承和组合,就是类模式和对象模式.此篇的组合模式非继承和组合概念中的组合.桥接 策略 代理 装饰者都用了组合,此组合非彼组合. 组合模式 组合模式(Composite Patte ...

  9. 如何用命令行执行loadrunner的脚本

    SET M_ROOT=D:\Mercury Interactive\Mercury LoadRunner\bin cd %M_ROOT% wlrun.exe -TestPath D:\ceshi10\ ...

  10. 微信公众平台如何与Web App结合?

    Web App简而言之就是为移动平台而优化的网页,它可以表现得和原生应用一样,并且克服了原生应用一些固有的缺点.一般而言Web App最大的入口是浏览器,但现在微信公众平台作为新兴的平台,结合其内置浏 ...