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

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

  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. YTU 2520: 小慧唱卡拉OK

    2520: 小慧唱卡拉OK 时间限制: 1 Sec  内存限制: 128 MB 提交: 478  解决: 207 题目描述 小慧唱歌非常好听,小鑫很喜欢听小慧唱歌,小鑫最近又想听小慧唱歌了,于是小鑫请 ...

  2. 8-15 globalCompositeOperation阶段练习二

    8-15 globalCompositeOperation阶段练习二 <!DOCTYPE html> <html lang="zh-cn"> <hea ...

  3. 动态更改Menu

    好像没有现成的api可能获取menu完美方法,只有在创建menu时,用全局的menuItem记下, 在需要修改时修改. 1)全局量: MenuItem  gMenuItem=NULL; 2)//创建菜 ...

  4. JSSDK使用步骤

    绑定域名 先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”. 备注:登录后可在“开发者中心”查看对应的接口权限. 引入js文件 在需要调用JS接口的页面引入如下JS文件,( ...

  5. EJB是什么?EJB的概念分析与理解(copy)

    [说明:转载于http://blog.csdn.net/jojo52013145/article/details/5783677] 1. 我们不禁要问,什么是"服务集群"?什么是& ...

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

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

  7. Spring 中 ApplicationContext 和 BeanFactory 的区别,以及 Spring bean 作用域

    //从ApplicationContext 中取 bean ApplicationContext ac = new ClassPathXmlApplicationContext ( "com ...

  8. focus、click、blur、display、float、border、absolute、relative、fixed

    onfocus:获取焦点,点击时,按着不放 onclick:点击松开之后,未点击其他处 onblur:点击松开之后,又点击其他处 display:block,none,inline block:单独占 ...

  9. mysql-installer-web-community-5.7.18.1.msi的安装(图文详解)

    不多说,直接上干货! 说在前面的话 我为什么已经尝试和使用过同类型产品的很多MySQL版本,还要书写这篇博客呢?基于mysql-installer-web-community-5.7.18.1.msi ...

  10. 微信小程序资料总结

    http://blog.csdn.net/ZCLengendary/article/details/54312030  --添加html标签与处理 https://www.cnblogs.com/HD ...