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

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

  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. 配置文件git config介绍

    Git有一个工具被称为git config,它允许你获得和设置配置变量:这些变量可以控制Git的外观和操作的各个方面. 一. 配置文件的存储位置 这些变量可以被存储在三个不同的位置: 1./etc/g ...

  2. 谷歌浏览器(Chrome)查看http报文headers信息

    转自:https://blog.csdn.net/floatdreamed/article/details/79208719 ①打开谷歌浏览器,随意输入要搜索的内容 ②按下F12键,此时会弹出浏览器的 ...

  3. 回调函数,回调函数使用call

    回调函数:一个函数b作为参数,给另外一个函数a使用.并且在执行a之后(注意不一定是执行完a),再去执行b这个函数. 上代码: function a(callback) { alert("我是 ...

  4. $CF19A\ World\ Football\ Cup$

    炒鸡\(6\)批的模拟题. 注意的是输入 把握好空格 大小写. 根据题目的这句话来排序 积分榜是按照以下原则制作的:胜利一个队得3分,平分1分,失败0分. 首先,球队按积分顺序排在积分榜上,分数相等比 ...

  5. ACM_求f(n)

    求f(n) Time Limit: 2000/1000ms (Java/Others) Problem Description: 设函数f(n)=1*1*1+2*2*2+3*3*3+...+n*n*n ...

  6. zepto中给不存在的元素设置样式并绑定事件的坑

    在移动端使用zepto选择器时,一般如果元素不存在会返回一个空的zepto对象. zepto在设置元素样式时,提供了两个入参方式,一种键值对方式$(".ter").css({&qu ...

  7. HTML DOM getElementById() 方法

    定义和用法 getElementById() 方法可返回对拥有指定 ID 的第一个对象的引用. 语法 document.getElementById(id) 说明 HTML DOM 定义了多种查找元素 ...

  8. 所有版本chrome、chromedriver、firefox下载链接

    1. 所有版本chrome下载 是不是很难找到老版本的chrome?博主收集了几个下载chrome老版本的网站,其中哪个下载的是原版的就不得而知了. http://www.slimjet.com/ch ...

  9. leetcode126 Word Ladder II

    思路: 宽搜过程中分层记录路径,递归还原.实现: class Solution { public: void getPath(string now, string beginWord, string ...

  10. 下载github项目

    两种方法:通过https或者ssh地址 找一个放置项目的文件夹,右键git bash here 输入 $ git clone https://项目地址 通过https 项目地址可以直接复制网页地址,或 ...