lba from 手机 获取 得到 call turn 解析 文件
闲来无事,写一个模拟登录知乎的小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‘
实现代码:
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模拟登录知乎
lba from 手机 获取 得到 call turn 解析 文件
原文:http://www.cnblogs.com/Frange/p/7966248.html
来源: http://www.bubuko.com/infodetail-2415813.html