模拟登录是爬取某些站点内容的一个关键,有些网站(特别是论坛类),不登录的话,一个数据也拿不到。

模拟登录有这样几个关键:

  1. 弄清楚登录的url
    一些网站打开出现登录的页面,地址栏大多数不是登录提交表单的url。
  2. 提交登录表单的字段
    登录页面的url和登录表彰的字段名获取的方式有两种:
    1) 分析页面源代码,找到表单标签及属性。适应比较简单的页面,或者对网页代码,js非常熟悉。
    2) 采用抓包工具,查看提交的url和参数,如Chrome的开发者工具中的Network, Fiddler等。这种方式简单粗暴、快速。尤其适应页面比较复杂,登录时经过了几次跳转的。

  3. 登录以后去往页面的url
    这个不是必须的,因为一般都有登录后默认打开的页面,或者你所需要取数据的页面是明确的。但是如果对于第三方登录来讲,这个参数就是必要的。

知道了登录url, 表单的参数后,通过提交参数的方式来实现登录,不难。不是本文讨论的重点。

params = {'uname':'kitty','upass':'hello'}
r = requests.post("http://xxx.org/post", data=params)

一些站点的登录流程还是比较复杂,如代码封装在js中,登录时经过了跳转。那采用以上的方式来实现登录就比较复杂。即使用抓包拿到登录url,表单参数,这时的登录一般还附加了一些其他参数,需要一一构造出来,有的如时间戳等等。

有没有一种比较简单的方式,来成功实现爬虫模拟登录的,然后方便抓取到数据?Cookie就是这样一种方式。不需要知道登录url, 不需要知道登录表单的字段名,以及还需要哪些其他参数。

我以QQ群论坛来说明使用Cookie实现模拟登录,然后抓取数据。打开就是加载的登录div。

你可以找一个登录url和表单字段

以下两种方式,都需要首先拿到Cookie,可以使用Chorme开发者工具,或者Fiddler,在目标网站上使用用户名和密码登录一下,就拿到Cookie了。

找到Cookie

一、用requests发送请求,实现模拟登录

使用requests发送请求时,把cookie作为参数传递进来就可以了。

构造Cookie:

cookie = {'Cookie': 'qm_username=137958873x0; qm_sid=8a4cce2f4413b4a5c9981093942b3f6f,qMUZrWmt0Z0XQbVZWKlNBZXUzT0xCSXJNRHNXU1NDVzd6MXZFQjJSbGZxMF8.; RK=/jt+Uh72a5; pgv_pvid=2786550760; pgv_info=ssid=s5861035317; ptui_loginuin=1379588730; ptisp=ctc; ptcz=e3d339f47c356076793ff4c270b572e35ed69746057039ee2e78677e391793b9; pt2gguin=o1379588730; uin=o1379588730; skey=@ssNmMQP3p; p_uin=o1379588730; p_skey=2w78648Kd9wuwxK9lsiDM02MQFJfSIhEuxhhE*aH-SU_; pt4_token=aGGiHcty94vO0iC8mxQ*OgkHOI6fZmdzQCxsb-baX1U_'}

发达请求时,传递Cookie

html = requests.get(url,cookies=cookie).content

详细可参考,《用Python玩转QQ群论坛》

二、用Scrapy实现模拟登录

在Scrapy中Cookie登录的步骤跟上面一样,但是在实现过来中,却遇到很多困难,一直困扰我,而且在Scrapy中提示不多,如请求被禁止:

getting Forbidden by robots.txt: scrapy

总结一下Scrapy中实现Cookie登录的方法:
1)Cookie的写法不一样:

Cookie

注意,验证登录写在start_requests()方法中,传递cookie参数。

return [FormRequest("http://qgc.qq.com/309o916014x/",cookies=cookies,callback=self.parse)]

2) 在settings.py中的配置,增加:

ROBOTSTXT_OBEY=False

再次启动爬虫,成功!还是同样的页面,抓取到数据。

论坛帖子更新情况

总结一下,使用Cookie登录的好处:
不需要知道登录url和表单字段以及其他参数,不需要了解登录的过程和细节。由于不是采用登录url, 用户名+密码的方式。配合工具使用,快速方便。

所谓用Cookie实现登录,就把过登录过的信息(包括用户名、密码以及其他的验证信息)打包一起发给服务器,告诉服务器我是登录验证过的。

不足之处,Cookie有过期时间,过一段时间再运行这个爬虫,需要重新获取一下Cookie的值。抓取数据过程是没有问题的。


关于Cookie的介绍:

      1. Cookie分类
        Cookie总是保存在用户客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie。Cookie的有效性,最短的浏览器关闭后就消失了,最长是可以一直保存,直到被删除。

      2. Cookie用途
        因为HTTP协议是无状态的,即服务器不知道用户上一次做了什么,这严重阻碍了交互式Web应用程序的实现。
        在典型的应用是网上购物场景中,用户浏览了几个页面,买了一盒饼干和两饮料。最后结帐时,由于HTTP的无状态性,不通过额外的手段,服务器并不知道用户到底买了什么。
        所以Cookie就是用来绕开HTTP的无状态性的“额外手段”之一。服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器中的状态。

      3. Cookie的缺陷
        1)Cookie会被附加在每个HTTP请求中,所以无形中增加了流量。
        2) 由于在HTTP请求中的Cookie是明文传递的,所以安全性成问题。(除非用HTTPS)
        3) Cookie的大小限制在4KB左右。对于复杂的存储需求来说是不够用的。

Scrapy用Cookie实现模拟登录的更多相关文章

  1. scrapy爬虫系列之六--模拟登录

    功能点:如何发送携带cookie访问登录后的页面,如何发送post请求登录 爬取网站:bilibili.github 完整代码:https://files.cnblogs.com/files/book ...

  2. python之cookie, cookiejar 模拟登录绕过验证

    0.思路 如果懒得模拟登录,或者模拟登录过于复杂(多步交互或复杂验证码)则人工登录后手动复制cookie(或者代码读取浏览器cookie),缺点是容易过期. 如果登录是简单的提交表单,代码第一步模拟登 ...

  3. urllib库利用cookie实现模拟登录慕课网

    思路 1.首先在网页中使用账户和密码名登录慕课网 2.其次再分析请求头,如下图所示,获取到请求URL,并提取出cookie信息,保存到本地 3.最后在代码中构造请求头,使用urllib.request ...

  4. python中使用cookie进行模拟登录

    背景:使用cookie模拟登录豆瓣->我的豆瓣网页 [准备工作] 1.通过Fiddler抓取“我的豆瓣”url: 2.通过Fiddler抓取“我的豆瓣”cookie值. import urlli ...

  5. PHP模拟登录并获取数据

    cURL 是一个功能强大的PHP库,使用PHP的cURL库可以简单和有效地抓取网页并采集内容,设置cookie完成模拟登录网页,curl提供了丰富的函数,开发者可以从PHP手册中获取更多关于cURL信 ...

  6. VC使用libcurl模拟登录CSDN并自动评论资源以获取积分

    环境:Win7 64位+VC2008 软件及源码下载:(http://pan.baidu.com/s/1jGE52pK) 涉及到的知识点: C++多线程编程 libcurl的使用(包括发送http请求 ...

  7. Cookies与保持登录(新浪微博的简单模拟登录)

    Cookies与保持登录(新浪微博的简单登录) .note-content {font-family: "Helvetica Neue",Arial,"Hiragino ...

  8. libcurl模拟登录CSDN并自动评论资源以获取积分

    软件及源码下载:(http://pan.baidu.com/s/1jGE52pK) 涉及到的知识点: C++多线程编程 libcurl的使用(包括发送http请求.发送cookie给服务器.保存coo ...

  9. PHP中使用CURL模拟登录并获取数据实例

    cURL 是一个功能强大的PHP库,使用PHP的cURL库可以简单和有效地抓取网页并采集内容,设置cookie完成模拟登录网页,curl提供了丰富的函数,开发者可以从PHP手册中获取更多关于cURL信 ...

随机推荐

  1. Ubuntu16.04下搭建开发环境及编译tiny4412 Android系统【转】

    本文转载自:http://blog.csdn.net/songze_lee/article/details/72808631 版权声明:本文为博主原创文章,未经博主允许不得转载. 1.安装ssh服务器 ...

  2. python-----删除文件到回收站

    python删除文件一般使用os.remove,但这样删是直接删除文件,不删到回收站的,那么想删除文件到回收站怎么办? 这时,就需要使用shell模块了 from win32com.shell imp ...

  3. C# 判断两个矩形是否相交

    源代码 public bool JudgeRectangleIntersect(double RecAleftX, double RecAleftY, double RecArightX, doubl ...

  4. iOS开发——多线程

    很多朋友都说iOS开发中,最难理解和学习的就是多线程,很多的原理实现都是通过log看到,也比较抽象,本人也是在多线程方面投入过很多脑细胞..无论这方面的知识掌握和应用起来是否轻松,牢固的基本功.正确的 ...

  5. E20170609-ts

    algorithm n.算法 layout   n. 布局,安排,设计; 布置图,规划图; resource  n. 资源; 物力,财力; 办法; 智谋; partial adj. 部分的; 偏爱的; ...

  6. vue 加载文件,省略后缀后的加载顺序

    Vue使用import ... from ...来导入组件,库,变量等.而from后的来源可以是js,vue,json.这个是在webpack.base.conf.js中设置的: module.exp ...

  7. C语言小项目-火车票订票系统

    list.h #ifndef __LIST_H__ #define __LIST_H__ #include "stdafx.h" #include <stdio.h> ...

  8. 为什么,博主我要写下这一系列windows实用网络?

    发现,随着自身一路过来所学,无论在大数据领域.还是linux  or  windows里,菜鸟的我慢慢在长大.把自己比作一个园,面积虽在增加,涉及面增多,但圆外的东西,还是那么多. 现在,正值在校读研 ...

  9. 专题十二:实现一个简单的FTP服务器

    引言: 在本专题中将和大家分享如何自己实现一个简单的FTP服务器.在我们平时的上网过程中,一般都是使用FTP的客户端来对商家提供的服务器进行访问(上传.下载文件),例如我们经常用到微软的SkyDriv ...

  10. Dubbo和Zookeeper

    一.软件架构演进 ​ 软件架构的发展经历了由单体架构.垂直架构.分布式架构到流动计算架构的演进过程. 1.单一架构 ​ 当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本.此 ...