首页 > 代码库 > Scrapy基础(十四)————Scrapy实现知乎模拟登陆
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 #正则匹配出xsrf45 response_text = response.text46 match_obj = re.match(‘.*name="_xsrf" value="http://www.mamicode.com/(.*?)"‘, 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=http://www.mamicode.com/{52 "_xsrf":xsrf,53 ‘remember_me‘: ‘true‘,54 "password":"",55 "phone_num":""56 }57 58 #将获取到的xsrf加载到cookie中59 self.cookies["_xsrf"] = xsrf60 #通过FormRequest提交表单,这里的request对象和之前的session一样,还是处于刚刚的对话中;回调给检查登陆的函数61 return [scrapy.FormRequest(url=url,headers=self.headers,formdata=http://www.mamicode.com/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
Scrapy基础(十四)————Scrapy实现知乎模拟登陆
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。