Scrapy进阶-模拟登陆初步

简介: 在认识爬虫中我给自己设定一个目标就是学习模拟登录。但是目前的知乎、豆瓣都要输入验证码,本以为可爱的简书是不会的,结果他居然要滑动图块解锁。但是学技术总要先会一点简单的呀,于是我就拿我自己的个人网站xuzhougent.top开刀了。

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


背景知识

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

1. Request objects

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

img_85757831b58eb498b11068d2afc37bc9.png
初始化函数

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

  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个数及大小限制是有差异的)。
    用法如下:
img_7d48107839eaf49a40e2b0afd75c55a1.png
cookies用法
img_5d22aee3fbc3be3a604f9d2b0853350e.png
其他说明

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): 查找控制点击的属性如(<input type="submit">)。默认使用web表单第一个可以点击元素。
  6. dont_click(boolean):假如这个web表单使用js控制,输入完自动提交,不需要点击,那么设置为false。

实战使用

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

步骤一:

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


img_fbcede55c2f33912a633e495ba244569.png
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':'admin@admin.com',
         '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的运行结果。


img_5b6fc95175d5e685ea148d579ea0aded.png
最终结果

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

目录
相关文章
|
7月前
|
数据采集 JSON 前端开发
Python爬虫进阶:使用Scrapy库进行数据提取和处理
在我们的初级教程中,我们介绍了如何使用Scrapy创建和运行一个简单的爬虫。在这篇文章中,我们将深入了解Scrapy的强大功能,学习如何使用Scrapy提取和处理数据。
|
10月前
|
数据采集 JSON API
Scrapy爬虫模拟登陆参考demo
Scrapy爬虫模拟登陆参考demo
|
数据采集 Web App开发 安全
第76天:Scrapy 模拟登陆
第76天:Scrapy 模拟登陆
112 0
第76天:Scrapy 模拟登陆
|
搜索推荐 Python 数据采集
22、Python快速开发分布式搜索引擎Scrapy精讲—scrapy模拟登陆和知乎倒立文字验证码识别
转自: http://www.bdyss.cn http://www.swpan.cn 第一步。首先下载,大神者也的倒立文字验证码识别程序 下载地址:https://github.com/muchrooms/zheye 注意:此程序依赖以下模块包   Keras==2.
1299 0
|
数据采集 SQL JSON
爬虫进阶:Scrapy抓取科技平台Zealer
开篇   这次的目标网站也是本人一直以来有在关注的科技平台:Zealer,爬取的信息包括全部的科技资讯以及相应的评论。默认配置下运行,大概跑了半个多小时,最终抓取了5000+的资讯以及10几万的评论。
1484 0
|
数据采集 NoSQL 关系型数据库
爬虫进阶:Scrapy抓取慕课网
前言   Scrapy抓取慕课网免费以及实战课程信息,相关环境列举如下: scrapy v1.5.1 redis psycopg2 (操作并保存数据到PostgreSQL) 数据表   完整的爬虫流程大致是这样的:分析页面结构 -> 确定提取信息 -> 设计相应表结构 -> 编写爬虫脚本 -> 数据保存入库;入库可以选择mongo这样的文档数据库,也可以选择mysql这样的关系型数据库。
1610 0
|
数据采集 Java Python
爬虫进阶:Scrapy入门
进阶前言   学Py和写爬虫都有很长一段时间了,虽然工作方面主要还是做Java开发,但事实上用python写东西真的很爽。之前都是用Requests+BeautifulSoup这样的第三方库爬一些简单的网站,好处简单上手快,坏处也明显,单线程速度慢,偶尔想要跑快点还得自己写多线程或者多进程。
1872 0
|
数据采集 监控 中间件
scrapy 进阶使用
前段时间我写了一篇《scrapy快速入门》,简单介绍了一点scrapy的知识。最近我的搬瓦工让墙了,而且我又学了一点mongodb的知识,所以这次就来介绍一些scrapy的进阶知识,做一些真正有用的爬虫来。
1178 0
|
数据采集 API Python
Scrapy进阶-命令行的工作原理(以runspider为例)
官方教程说当你写好自己的spiders如douban之后,你可以通过scrapy runspider/crawl douban启动你的爬虫。于是一开始的时候你就知道通过这个命令行来启动爬虫,但是你有没有想过当你敲下这行命令后,scrapy到底做了什么呢? 命令入口:cmdline.
892 0
|
数据采集 数据安全/隐私保护 Python
Scrapy进阶-防ban策略
在再识Scrapy-下载豆瓣图书封面中我们学会了如何下载图片。但是在大批量爬取的时候我们最怕的就是被网站ban了。官网提供了几种方法: 1. download_delay 因为我们要大批量爬取网页,为了防止过分密集影响到别人的服务器,建议在setting.py中设置DOWNLOAD_DELAY=2,最好是在晚上睡觉的时候跑,这样虽然速度慢了一点,但是被dan的几率会降低很多哦。
1030 0