利用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)

本次登录后,并未对页面进行解析,只是打印一下页面,作为验证。

时间: 2024-08-02 03:26:58

利用scrapy模拟登录知乎的相关文章

python模拟登录知乎

这是一个模拟登录知乎的爬虫.运行后输入用户名密码以及和程序同一目录下的验证码图片,登陆成功后能够显示你在豆瓣地昵称. #! /usr/bin/env python #! -*-coding: utf-8 -*- import json import urllib import urllib2 import cookielib class Zhihu_login(object): """登陆知乎的一个演示程序""" def __init__(sel

python_模拟登录知乎

如何登录知乎? 首先要分析,进行知乎验证的时候,知乎服务器需要我们提交什么数据,提交的地址.先进行几次登录尝试,通过浏览器中network中查看数据流得知,模拟登录知乎需要提供5个数据,分别是_xsrf.password.captcha_type.captcha.phone_num,这个是手机号码进行验证登录,提交地址 https://www.zhihu.com/login/phone_num ,那,开始获取这些个数据,其中那个图片验证码是最难得,通过第三方插件zheye进行验证码解析,就可以解

python爬虫scrapy之登录知乎

下面我们看看用scrapy模拟登录的基本写法: 注意:我们经常调试代码的时候基本都用chrome浏览器,但是我就因为用了谷歌浏览器(它总是登录的时候不提示我用验证码,误导我以为登录时不需要验证码,其实登录时候必须要验证码的),这里你可以多试试几个浏览器,一定要找个提示你输入验证码的浏览器调试. 1.我们登录的时候,提示我们输入验证码,当验证码弹出之前会有个请求,我们打开这个请求,很明显,type是login,验证码无疑了,就算是看请求的因为名,你也应该知道这个就是验证码的请求,或者打开这个验证码

Python3之利用Cookie模拟登录

利用Cookie模拟登录步骤: 1.       在浏览器输入http://demo.bxcker.com,输入用户名和密码登录. 2.登录成功点"客户管理"模块. 3. 进入客户管理模块,显示客户列表. 4.通过抓包工具抓取客户列表,得到登录后的Cookie信息. GET http://demo.bxcker.com/customer/index.shtml HTTP/1.1 Host: demo.bxcker.com Connection: keep-alive Pragma: n

Android(Java) 模拟登录知乎并抓取用户信息

前不久.看到一篇文章我用爬虫一天时间"偷了"知乎一百万用户.仅仅为证明PHP是世界上最好的语言,该文章中使用的登录方式是直接复制cookie到代码中,这里呢,我不以爬信息为目的.仅仅是简单的介绍使用java来进行模拟登录的基本过程.之前写过的文章android 项目实战--打造超级课程表一键提取课表功能事实上就是模拟登录的范畴.再加上近期在知乎上看到非常多人问关于超级课程表的实现,事实上本质就是模拟登录,掌握了这篇文章的内容,你不再操心抓不到信息了.然后,这篇文章会使用到之前的一篇Co

使用selenium模拟登录知乎

网上流传着许多抓取知乎数据的代码,抓取它的数据有一个问题一定绕不过去,那就是模拟登录,今天我们就来聊聊知乎的模拟登录. 获取知乎内容的方法有两种,一种是使用request,想办法携带cookies等必要参数去请求数据,但是使用requests的话,不仅要解析Cookies,还要获取XSRF,比较麻烦,所以我想到了selenium. 我直接控制Chrome请求知乎,然后模拟输入用户名和密码,这样不也可以吗,嘿嘿 接下来说一下大体流程: 首先控制selenium模拟请求知乎登录界面:https://

Python入门小练习 003 利用cookielib模拟登录获取账户信息

为了方便, 使用chinaunix的账户获取账户主题. 有些网站可能需要验证码,  找一些不用验证码的网站 下面 ****** 很多个星号的均为私密信息, 所以用星号代替 #!/usr/bin/python # -*- encoding:utf-8 -*- import urllib import urllib2 import cookielib import re import chardet #判断字符串编码的包,用法为 charset.detect(str) 详细示例 http://www

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

工具准备 在开始之前,请确保 scrpay 正确安装,手头有一款简洁而强大的浏览器, 若是你有使用 postman 那就更好了. scrapy genspider zhihu 使用以上命令生成知乎爬虫,代码如下: # -*- coding: utf-8 -*- import scrapy class ZhihuSpider(scrapy.Spider): name = 'zhihu' allowed_domains = ['www.zhihu.com'] start_urls = ['http:

利用 Scrapy 爬取知乎用户信息

思路:通过获取知乎某个大V的关注列表和被关注列表,查看该大V和其关注用户和被关注用户的详细信息,然后通过层层递归调用,实现获取关注用户和被关注用户的关注列表和被关注列表,最终实现获取大量用户信息. 一.新建一个scrapy项目 scrapy startproject zhihuuser 移动到新建目录下: cd zhihuuser 新建spider项目: scrapy genspider zhihu 二.这里以爬取知乎大V轮子哥的用户信息来实现爬取知乎大量用户信息. a) 定义 spdier.p