zoukankan      html  css  js  c++  java
  • scrapy带cookie登录简单的网站

    在爬数据的时候,登录一直是一个比较麻烦的问题。我也一直在网上找过各种资料,都挺麻烦的,因为需要分析各种http过程,感觉太麻烦了。

    不过最近在一个同学的帮助下,找到了使用cookie登录的方法。因为带cookie登录的话,server会认为你是一个已登录的用户,所以就会返回给你一个已登录的内容

    本文介绍的方法,是使用python的scrapy框架登录的方法。而且也只能登录一些比较简单的网站,对于那种大型的网站,因为目前我也还没有验证过,所以不敢保证。但是经过验证,登录豆瓣是万试万灵的。

    1. 获取cookie

    这个是整个任务的关键所在。只有获得了cookie才能进行下一步的编码工作。cookie获取的大致过程是自己先手动登录一次你想要的网站,然后记录想登录过程中的cookie就可以了。而想要获取这个cookie,也有两种方法。

    1.1 chrome方法——简单粗暴

    进入豆瓣首页后,F12-Network,就可以看到如上的截图。在这个截图中我们可以看到待会登录过程中各种http的请求的详细信息。注意右下角的红色按钮是红色的,红色表示正在记录,如果不是红色的话。。。就把它按一下保证是红色的就可以了。

    在登录框中输入用户名和密码后就会看到下面的Network中出现了一大排的内容,如下图所示:

    上图是登录成功后的截图,我们可以看到原本Network中的内容是空的,现在已经出现了很多了。为了防止不断出现内容干扰我们的分析,(其实不会干扰,但还是)将刚才的红色按钮关闭,也就是不再记录http消息,如上图中的灰色按钮。

    然后这个时候我们就可以好好分析一下,在Network下的Name列中,从哪一项中我们才可以找到cookie了。

    我们可以看到(如果出现了很多的话,就把滚动条拉到最上面可以看到)前面几行,除了第二行的“www.douban.com”是text/html类型的,其他的都是些网页的辅助内容,如css和图片。这样呢,我们可以想着说,cookie有可能是在这个html类型的项中,所以我们把“www.douban.com”点击一下,可以得到如下的图片:

    咦?我们在Headers中的Request Headers中找到了cookie诶?现在先假设它能用吧,我们要找的就是他了。那么我们就可以进入到第2步写代码了。

    1.2 chrome获取cookie的方法简单粗暴,但是还有另外一种方法也是可以的,不过必须要firefox浏览器,叫做firebug的一个插件工具。这个需要大家自己装一下,挺简单的。

    打开以后会出现如上所示的样子,现在还什么都没有。如果想要抓取http通信或者cookie的话,需要要左上角的“start”打开,表示需要firebug进行记录通信内容了。

    这时就可以开始登陆了,登陆后相应的会出现很多firebug截取的内容,如下图:

    这时我们可以看到,在最上面的一栏中,出现了firebug截取到通信内容,和我们在chrome中看到的内容似乎是一样的。所以我们还是选择“http://www.douban.com”这一项。然后下面一栏中Headers, Cookies之类的就会出现相应的内容。我们要找的内容当然在cookies中,就如上图所示的样子。

    我们可以看到,在firebug中获取的cookies的内容,似乎比chrome中获取的内容要少得多。但是没关系,chrome中的内容冗余比较多,只需要firebug中截取的cookies的内容就够了。

    然后我们就开始进入到编码阶段了。

    2. 编码

    # -*- coding:UTF-8 -*-
    import re 
    import json
    import codecs
    from scrapy.spider import Spider
    from scrapy.selector import Selector
    from scrapy.http import Request
    from scrapy import log
    
    from douban.items import DoubanItem
    
    import sys
    default_encoding = 'utf-8'
    reload(sys)
    sys.setdefaultencoding(default_encoding)
    
    class SanzhaSpider(Spider):
      name = "douban"
      allowed_domains = ["http://www.douban.com"]
      def start_requests(self):
          yield Request(response.url,cookies={'viewed':'"1083428"', '__utmv':'30149280.3975'}, callback=self.parse_with_cookie)
    
      def parse_with_cookie(self, response):
          file = codecs.open('page.html', 'w', encoding='utf-8')
          file.write(response.body)
          file.close()

    插入代码的内容就如上所示,最重要的方法就是重写的“start_requests”方法。这个方法就不在这里详细讲了,大家可以去官网看。只解释下Request方法的3个参数

    url #要带cookie访问的网页的url
    cookies #这是我们前面讨论了很久才获取的cookie的键值对的内容,需要按照一定的格式描述
    callback #当我们提交了这个request请求并获得了相应的response后,我们应该用什么方法去处理返回的response,处理的方法就是callback中给出的方法

    好了,按照这种方法,大家就可以顺利的登录豆瓣了。

    补充:

    1. 当我们抓取登录时http通讯内容时,有那么多的项都会有cookie的内容,为什么我们唯独选择“http://www.douban.com”这一项中的cookie内容呢?

    其实这个问题我也没有太明白,如果对于比较复杂的网站,如淘宝新浪之类的,应该没有这么简单。需要后续的深入研究才能解答这个问题。

    2. 那应该如何选择正确的cookie内容呢?

    额,,,试一试就好了,反正我试过其他的cookie内容,并不能成功。

    3. 豆瓣登录有时候可能需要验证码,这个是没关系的,你获取带验证码登录的cookie就没问题了。

      

    Bon Appetite!

  • 相关阅读:
    注意安全 保重身体
    抽象和接口的区别
    哪些设计模式最值得学习
    超级扫盲什么是设计模式?
    简单工厂、工厂方法和抽象工厂模式
    通过领域模型设计物流系统
    json过滤特殊字符
    数据库性能优化JOIN方法说明[转]
    策略模式
    观察者模式
  • 原文地址:https://www.cnblogs.com/zhawj159753/p/3916424.html
Copyright © 2011-2022 走看看