scrapy 爬取知乎登录认证部分(采用cookie登录)_scrapy 知乎 cookie-程序员宅基地

技术标签: python  爬虫登录  知乎  cookie登录  

scrapy 爬虫,为异步io框架;因此此处选择,先用requests请求,保存cookie文件,然后scrapy爬取前,在入口处加载cookie。
* 登录,保存cookie方法见前两节,此处展示的是scrapy读取cookie
* 首先要明确,scrapy框架关于登录的一些基础知识
1. scrapy 爬取有一个入口,在入口处加载cookie,后续的爬取会自动加载cookie信息
2. scrapy cookie的加载时接收字典形式的,因此,和requests加载cookie不同,要先转化为字典

加载cookie文件,并转化为字典形式

#!/usr/bin/env python3.6
# -*- coding: utf-8 -*-
# @Time    : 2018/4/18 18:10
# @Author  : ysj
import os
import http.cookiejar as cookielib
import requests
from scrapy_article.utl.ZhiHuLogIn import ZhiHu


cookie_file = os.path.join(os.path.dirname(__file__), 'zhihu_cookie.txt')


def load_cookie(filename=cookie_file):
    """加载cookie文件"""

    cookie = cookielib.LWPCookieJar()
    cookie.load(filename, ignore_discard=True, ignore_expires=True)
    return requests.utils.dict_from_cookiejar(cookie)


def get_dict_cookie(account='18516157608', password='******'):
    """" 调用前一节中的登录,"""
    login = ZhiHu(account, password)
    return requests.utils.dict_from_cookiejar(login.session.cookies)


if __name__ == '__main__':
    print(load_cookie())
    print(get_dict_cookie('18516157608', '*****'))

scrapy 入口加载cookie

主要是重写scrapy入口请求,添加cookie和headers
篇幅问题,此处指显示了重写的入口函数和一个登录是否成功的验证函数;需要提前加载上文load_cookie函数

class ZhihuSpider(scrapy.Spider):
    name = 'zhihu'
    allowed_domains = ['www.zhihu.com']
    start_urls = ['https://www.zhihu.com/']

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36',
        'HOST': 'www.zhihu.com',
        'Referer': 'https://www.zhihu.com/signin?next=%2F',
        'Authorization': 'oauth c3cef7c66a1843f8b3a9e6a1e3160e20'
    }
    login_url = 'https://www.zhihu.com/api/v3/oauth/sign_in'
    captcha_url = 'https://www.zhihu.com/api/v3/oauth/captcha?lang=en'
    check_url = 'https://www.zhihu.com/inbox'
    # check_url = 'https://www.zhihu.com/'
    def start_requests(self):
        self.post_data['signature'] = self.get_signature()

        return [scrapy.Request(url=self.check_url, headers=self.headers, method='GET', meta={
   'dont_redirect': True},
                               cookies=load_cookie(), callback=self.check_login)]

    def check_login(self, response):
        """用requests登录过,会保存cookie,传入scrapy使用,暂时不考虑scrapy登录"""
        if response.status < 300:
            print('登录成功')
            for url in self.start_urls:
                yield scrapy.Request(url, dont_filter=True, headers=self.headers)
        else:
            print('未登录,即将拉取验证码,重新登录')
            yield [scrapy.Request(url=self.check_url, headers=self.headers, method='GET', meta={
   'dont_redirect': True},
                                  cookies=get_dict_cookie(), callback=self.check_login)]

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_33162635/article/details/80031609

智能推荐

基于HTML5的可预览多图片Ajax上传-程序员宅基地

文章浏览阅读3.8k次。基于HTML5的可预览多图片Ajax上传by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=1923一、关于图片上传什么什么的在XHTML的时代,我们使用HTML file控件上传图片一次只能上传一张。要一次上传多图,做法是借助于flash。例如s

MySQL安装配置教程(保姆级,包含环境变量的配置)适合小白_mysqlhome怎么配置-程序员宅基地

文章浏览阅读3.3w次,点赞109次,收藏772次。从0到1教你如何下载MySQL,并安装配置环境变量,一看就懂,适合小白_mysqlhome怎么配置

高性能网络服务器编程:为什么linux下epoll是最好,Netty要比NIO.2好?_netty epoll 比较-程序员宅基地

文章浏览阅读643次。 基本的IO编程过程(包括网络IO和文件IO)是,打开文件描述符(windows是handler,java是stream或channel),多路捕获(Multiplexe,即select和poll和epoll)IO可读写的状态,而后可以读写的文件描述符进行IO读写,由于IO设备速度和CPU内存比速度会慢,为了更好的利用CPU和内存,会开多线程,每个线程读写一个文件描述符。  但C10K问题,让我们..._netty epoll 比较

VB编程:VB支持XP256色的ico图标工具ArtIcons Pro附序列号-60_彭世瑜_新浪博客-程序员宅基地

文章浏览阅读549次。【转载】VB支持XP256色的ico图标工具ArtIcons Pro序列号:ArtIcons专业版是一款具有渐层着色的功能专门用于制作图标的工具,下面是小编为大家搜罗的一些ArtIcons的序列号,需要的可以看一下:se7994t6z6se2tjuggb6seypqveabu ..._vb256图标

Jarvis OJ - ALL CHALLENGS_jarvisoj dsa-程序员宅基地

文章浏览阅读404次。作为一个安全菜鸟正在慢慢入门,在了解完基本的CTF知识后就开始刷题找知识点的感觉了虽然并不想写这篇博客,因为大部分题的思路都是看人家的writeup,并且人家写的比我更详细,但一些题目有很多知识点需要记住,所以就有了这篇博客WEB篇LOCALHOST看解决数量就知道没啥可说的;对于ip可控的2个头部一个是x-forwarded-for,一个是client-ipx-forwarded-for: X-Forwarded-For(XFF)是用来识别通过HTTP代理或负载均衡方式连接到Web服务器._jarvisoj dsa

React中的组件通信——父传子、子传父、Context_react子传父通信-程序员宅基地

文章浏览阅读3.7k次。0、认识组件间的通信在开发过程中,我们会经常遇到需要组件之间相互进行通信:比如App可能使用了多个Header,每个地方的Header展示的内容不同,那么我们就需要使用者传递给Header一些数据,让其进行展示;又比如我们在Main中一次性请求了Banner数据和ProductList数据,那么就需要传递给他们来进行展示;也可能是子组件中发生了事件,需要由父组件来完成某些操作,那就需要子组件向父组件传递事件;总之,在一个React项目中,组件之间的通信是非常重要的环节; 父组件在展示子组件_react子传父通信

随便推点

Minio 对象存储使用简单入门_minio endpoint-程序员宅基地

文章浏览阅读1.3w次,点赞15次,收藏51次。官方文档:MinIO Quickstart Guide| Minio中文文档1、简介Minio 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。Minio是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。2、容器安装..._minio endpoint

Linux: 两个USB摄像头的数据采集问题_linux上接两个摄像头-程序员宅基地

文章浏览阅读6.8k次。引子: 课题需要,同时采集两个摄像头数据,频率不高,但要同时。中间遇到的问题,唉一言难尽啊!为了图省事使用UVC摄像头,但是板子是USB1.1接口的,故挑选兼容USB1.1的UVC驱动的摄像头,最终选定两个301V芯片的摄像头,先使用一个摄像头,因频率不高,将采集频率设到了最_linux上接两个摄像头

大学生图书馆网页设计模板代码 DIV布局书店网页作业成品 学校书籍网页制作模板 学生简单书籍阅读网站设计成品_学校网站设计-程序员宅基地

文章浏览阅读187次。 校园网页设计 、学校班级网页制作、学校官网、小说书籍、等网站的设计与制作。️HTML静态网页设计作业使用dreamweaver制作,采用DIV+CSS布局,共有多个页面,首页使用CSS排版比较丰富,色彩鲜明有活力。顶部导航及底部区域背景色为100%宽度,主体内容区域宽度 一套优质的网页设计应该包含 (具体可根据个人要求而定)网站布局方面:计划采用目前主流的、能兼容各大主流浏览器、显示效果稳定的浮动网页布局结构。网站程序方面:计划采用最新的网页编程语言HTML5+CSS3+JS程序语_学校网站设计

Java序列化与反序列化最全详解_java序列化与反序列化全讲解 mocas_wang-程序员宅基地

文章浏览阅读2.9k次,点赞2次,收藏9次。什么是序列化和反序列化?序列化:序列化就是将 java对象 转化为字节序列的过程。序列化是指把一个Java对象变成二进制内容,本质上就是一个byte[]数组。 为什么要把Java对象序列化呢?因为序列化后可以把byte[]保存到文件中,或者把byte[]通过网络传输到远程,这样,就相当于把Java对象存储到文件或者通过网络传输出去了。注意:序列化是为了在传递和保存对象时,为了保证对象的完整性和可传递性。将对象转为有序的字节流,以便在网上传输或者保存在本地文件中。反序列化:反序列化就是将 字_java序列化与反序列化全讲解 mocas_wang

m4_forloop m4-程序员宅基地

文章浏览阅读4.7k次。<!--pre.display {font-family:inherit}pre.format {font-family:inherit}pre.smalldisplay {font-family:inherit; font-size:smaller}pre.smallformat {font-family:inherit; font-size:smalle

spring-@value属性赋值_@value integer-程序员宅基地

文章浏览阅读520次。1、@value给属性赋值,使用方式有三种:基本数值SpEL; #{}写${};取出配置文件【properties】中的值(在运行环境变量里面的值)使用如下: @Value("张三") private String name; @Value("#{20-2}") private Integer age; @Value("${person.nickName}") private String nickName;其中第三种需要增加外部配置文件,需要使用@PropertySource_@value integer