zoukankan      html  css  js  c++  java
  • 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"]=="u767bu5f55u6210u529f":
    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
  • 相关阅读:
    列出 visual studio 的所有快捷键
    CVS命令深入研究 zz
    大话系统之权限控制 (转)
    策略模式
    使用ISAPI_Rewrite对asp.net实现URL重写,显示HTML后缀
    使用ICSharpCode.SharpZipLib.dll实现在线解压缩
    ISAPI_REWRITE(转)
    ISAPI_Rewrite集
    做快乐的程序员(转)
    Request.PathInfo,Request.Path,RequestRawUrl
  • 原文地址:https://www.cnblogs.com/ruoniao/p/6947102.html
Copyright © 2011-2022 走看看