利用scrapy模拟登录知乎

Posted frange

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用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‘

实现代码:

  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基础(十四)————知乎模拟登陆

python爬虫scrapy之登录知乎

Python爬虫实战,Scrapy实战,知乎粉丝小爬虫

Python爬虫从入门到放弃(二十四)之 Scrapy登录知乎

php登录知乎并发表文章

scrapy模拟登陆知乎--抓取热点话题