当前位置: 首页 > news >正文

Scrapy基础(十四)————Scrapy实现知乎模拟登陆

  模拟登陆大体思路见此博文,本篇文章只是将登陆在scrapy中实现而已

之前介绍过通过requests的session 会话模拟登陆;必须是session,涉及到验证码和xsrf的
写入cookie验证的问题;在scrapy中不需担心此问题,因为Request会保证这是一个会话,并且自动传递cookies
原理想通,因为验证码识别的问题,这里先使用cookie模拟登陆

 1 # -*- coding: utf-8 -*- 
 2 
 3 import scrapy
 4 import json
 5 import re
 6 
 7 
 8 
 9 
10 
11 class ZhihuSpider(scrapy.Spider):
12 
13     name = "zhihu"
14     allowed_domains = ["zhihu.com"]
15     start_urls = ['http://www.zhihu.com/']
16     #头部
17     headers = {
18     "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36",
19     "Host":"www.zhihu.com",
20     "Referer":"https://www.zhihu.com/",
21 }
22     #从已经登陆的浏览在中copy下来的
23     cookies = {
24     "d_c0":"",
25     "l_cap_id":"",
26     "r_cap_id":"",
27     "cap_id":"",
28     "_zap":"",
29     "__utmc":"",
30     "__utmb":"",
31     "__utmv":"",
32     "__utma":"",
33     "__utmz":"5",
34     "q_c1":"",
35     }
36     #最开始请求的reqeust函数,自动调用,将首次获取的response返回给登陆函数(里面有xsrf)
37     def start_requests(self):
38         #必须带上cookie;return返回,不用生成器,只需爬取登陆页面一次,而且必须返回一个可迭代对象,所以是列表
39         return [scrapy.Request(url="https://www.zhihu.com/#signin",cookies=self.cookies,headers=self.headers,callback=self.login)]
40 
41 
42     #知乎登录
43     def login(self,response):
44         #正则匹配出xsrf
45         response_text = response.text
46         match_obj = re.match('.*name="_xsrf" value="(.*?)"', response_text, re.DOTALL)
47         if match_obj:
48             xsrf = (match_obj.group(1))
49 
50         url = "https://www.zhihu.com/login/phone_num"
51         data={
52             "_xsrf":xsrf,
53             'remember_me': 'true',
54             "password":"",
55             "phone_num":""
56         }
57 
58         #将获取到的xsrf加载到cookie中
59         self.cookies["_xsrf"] = xsrf
60         #通过FormRequest提交表单,这里的request对象和之前的session一样,还是处于刚刚的对话中;回调给检查登陆的函数
61         return [scrapy.FormRequest(url=url,headers=self.headers,formdata=data,callback=self.check_login)]
62 
63     #查看登录状态;登陆成功则默认回调parse函数进行解析网页
64     def check_login(self,response):
65         text_json = json.load(response.text)
66         if "msg" in text_json and text_json["msg"]=="\u767b\u5f55\u6210\u529f":
67             for urls in self.start_urls:
68                yield scrapy.Request(url=urls,dont_filter=True,headers=self.headers)
69 
70 
71 
72 
73     def parse(self, response):
74         pass

 

转载于:https://www.cnblogs.com/ruoniao/p/6947102.html

相关文章:

  • IdentityServer4 SigningCredential(RSA 证书加密)
  • 一款基于jQuery Ajax的等待效果
  • uTorrent 被发现悄悄安装挖矿程序,BitTorrent 公司否认
  • TortoiseGit为github账号添加SSH keys,解决pull总是提示输入密码的问题
  • Npcap —— 基于 Winpcap/ Libpcap 的网络包抓取库
  • Lucene 个人领悟 (二)
  • Java线程挂起
  • DOM2和DOM3
  • noip 2008 双栈排序
  • 双向绑定底层剖析(用于自定义组件双向数据绑定和非form表单元素)
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • cocos2d-x 3.0的坑有哪些
  • 第十节:委托和事件(2)(泛型委托、Func和Action、事件及与委托的比较)
  • read 系统调用剖析【转】
  • vue2.0-transition配合animate.css
  • hexo+github搭建个人博客
  • 【面试系列】之二:关于js原型
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Java比较器对数组,集合排序
  • Java小白进阶笔记(3)-初级面向对象
  • js中的正则表达式入门
  • mockjs让前端开发独立于后端
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • Python利用正则抓取网页内容保存到本地
  • spring学习第二天
  • SQLServer之创建数据库快照
  • vuex 学习笔记 01
  • 阿里云购买磁盘后挂载
  • 安卓应用性能调试和优化经验分享
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 大主子表关联的性能优化方法
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 区块链技术特点之去中心化特性
  • 小程序01:wepy框架整合iview webapp UI
  • 一个项目push到多个远程Git仓库
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • Nginx实现动静分离
  • ​渐进式Web应用PWA的未来
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (剑指Offer)面试题34:丑数
  • (接口封装)
  • ... 是什么 ?... 有什么用处?
  • .NET 药厂业务系统 CPU爆高分析
  • .NET6 命令行启动及发布单个Exe文件
  • .net专家(高海东的专栏)
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节