Scrapy进阶-模拟登陆初步

在认识爬虫中我给自己设定一个目标就是学习模拟登录。但是目前的知乎、豆瓣都要输入验证码,本以为可爱的是不会的,结果他居然要滑动图块解锁。但是学技术总要先会一点简单的呀,于是我就拿我自己的个人网站xuzhougent.top开刀了。由于阿里云服务器6-17号到期了,一时半会我也没有续期的打算,所以估计你们看的时候,这个域名已经打不开了。


背景知识

这个部分其实打算放在最后作为补充阅读的,但是作为一个懒人深知大家会直接翻到后面看重点,但是我觉得这一部分对于理解代码更加重要,所以我就自作主张提前了。

1. Request objects

Scrapy使用Request和Response对象爬取网站。通常而言,Request从spiders从产生,到Downloader时执行request返回Reponse对象。Response返回到发出request的爬虫里。先看下源码中Request类:

Scrapy进阶-模拟登陆初步_第1张图片
初始化函数

简单解释下里面的各个参数:

  1. url: 请求的地址
  2. callback:指定用来解析当前request产生的reponse的parse
  3. method: http方法,默认是'GET'
  4. meta:一个Python字典(dict),用于初始Request.meta值。起始为空,由不同的Scrapy组件进行填充注:HTTP.meta包含本次HTTP请求的Header信息,比如用户的IP地址和用户Agent
  5. body: 请求主体,不太懂,并且只能通过replace方法进行修改。待编辑
  6. headers:本次请求的headers,一般是浏览器信息
  7. cookies: 请求的cookies。模拟登陆的重要成员。
  8. encoding(string):编码方式,默认为'utf-8'。如果解析得到的item是乱码的,说明这个网站可能是其他编码方式,似乎京东是gbk的。
  9. priority(int): 请求的优先度,目前用不到
  10. dont_filter(boolean):因为scrapy会默认过滤掉重复的request,如果你需要对一个网站发起多次request,那么请设为False
  11. errback: scrapy会无视掉一些404等错误返回,如果你需要对这些错误返回进行爬取(比如说腾讯的公益404页面),你可以指定一个parse。

Cookie是http消息头中的一种属性,简单说明下,大致有以下内容:

  • Cookie名字(Name)Cookie的值(Value)
  • Cookie的过期时间(Expires/Max-Age)
  • Cookie作用路径(Path)
  • Cookie所在域名(Domain),使用Cookie进行安全连接(Secure)。
    前两个参数是Cookie应用的必要条件,另外,还包括Cookie大小(Size,不同浏览器对Cookie个数及大小限制是有差异的)。
    用法如下:
Scrapy进阶-模拟登陆初步_第2张图片
cookies用法
Scrapy进阶-模拟登陆初步_第3张图片
其他说明

2.模拟登陆的重点scrapy.http.FormRequest(url[, formdata, ...])

前面讲的基础的Request,scrapy还在此基础上定义了一个FormRequest用于向表格发起request,除了Request基本功能外,还定义了一个非常重要的类方法 from_response(response[,formname=None,formnumber=0,formdata=None,formxpath=None,formcss=None,clickdata=None, dont_click=False, ...])。老规矩,先解释一下各个参数:

  1. response: 用于在responses找到填写的web登录表单
  2. formname: 非必须,要填写web登录表单的名称
  3. formxpath和formcss:非必须,都是用来在responses定位web登录表单
  4. formnumbe:非必须,假如web登录表单有多个,用int指定其中一个。0表示第一个
  5. clickdata(dict): 查找控制点击的属性如()。默认使用web表单第一个可以点击元素。
  6. dont_click(boolean):假如这个web表单使用js控制,输入完自动提交,不需要点击,那么设置为false。

实战使用

没想到模拟登陆的背景知识写了那么多,如果你没看背景知识直接跳到这里,没有关系,那么下面代码有任何不懂的都可以在上面找到解释。

步骤一:

通过开发者工具找到要request的URL以及要填写的表单内容。我的网站比较好找就定义了一个login,填写的数据有4个。以前看到一个方法就是输入错误的登录账号密码进行查找,而且打开Preserver log以免登陆成功后login被覆盖掉。其中csrf_token是防止跨站工具的信息,需要在获取网页后查找
得到。


Scrapy进阶-模拟登陆初步_第4张图片
F12开发者工具

步骤二:思路整理

所谓爬虫就是模拟人去查看网页,所有写任何代码前,我们都先要想自己是如何做的,然后在编写代码让爬虫也模仿我们。

  1. 打开登录页面
  2. 输入账号密码
  3. 页面重定向到目标页面

步骤三:写代码

由于前面的背景知识铺垫很多,所以接下来就直接上代码了:
# -- coding: utf-8 --
import scrapy
from scrapy.http import Request, FormRequest

class LoginSpider(scrapy.Spider):
    name = "login"
    allowed_domains = ["xuzhougeng.top"]
          
    #向登录页发起请求,得到下一步需要的response
    def start_requests(self):
        return [Request('http://xuzhougeng.top/auth/login', callback=self.post_login)] 

    ## 首先查看一下自己的状态,需要sign in。所以填写好表单,用FormRequest.from_response提交,这时候网页会返回一个重定向的response给我们,我们用after_login处理
    def post_login(self, response):
        sign_in = response.xpath('//*[@id="navbar-collapse-01"]/ul[2]/li/a/text()').extract()[0]
        print(sign_in)
        csrf = response.css('div > input::attr(value)').extract_first()
        return FormRequest.from_response(response,formdata=
        {'csrf_token':csrf,
         'email':'[email protected]',
         'password':'password',
         'remember_me':'y',
         'submit:':'Log In'
         },callback=self.after_login)
  ### 检查登录状态
    def after_login(self, response):
        sign_out = response.css('#signin_icon > a::text').extract()
        print sign_out

下面是cmd的运行结果。


最终结果

这篇主要是初步学习模拟登陆,所以很多的基础知识,下面我想去试试登陆豆瓣和知乎,以及了,估计又要学很多东西。可能要学习一下Linux的网络编程去。

你可能感兴趣的:(Scrapy进阶-模拟登陆初步)