Scrapy进阶-模拟登陆初步

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


背景知识

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

1. Request objects

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

初始化函数

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

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

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是防止跨站工具的信息,需要在获取网页后查找
得到。


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的运行结果。


最终结果

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,012评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,589评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,819评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,652评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,954评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,381评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,687评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,404评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,082评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,355评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,880评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,249评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,864评论 3 232
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,007评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,760评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,394评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,281评论 2 259

推荐阅读更多精彩内容