爬虫之登陆验证

原创  2016年11月25日 10:49:55

  • 14147

运行爬虫抓取某些网站的时候,经常会碰到需要登陆验证(输入账号、密码)之后才能获取数据的情况。那么问题来了,如何完成登陆验证呢面以itunes为例大概总结两种方法。主要使用工具为python/java、selenium、phantomjs或firefox/chrome等浏览器.

一 python urllib2库的简单介绍

本人之前主要使用java进行外部数据获取,用的工具包httpclient。基本没用过python-urllib2库,google了一下,发现两个特别靠谱的参考资料:

1. csdn中 @请叫我汪海的《urllib2的使用细节与抓站技巧》,学习了一下,发现还挺好使的,简单明了。

2. 另外一个可参考的资料是《urllib2 – The Missing Manual :HOWTO Fetch Internet Resources with Python》跟上面内容有重复,也有补充。

看完这两个基本就能大概掌握获取网页的用法啦,这里强调以下几点。

a. 特别注意要发送的headers。文中已经提到了User-Agent 、Content-Type 、application/xml 、application/json 、application/x-www-form-urlencoded,很多时候数据取不出来与这些header有关系。httpheader可以参照wiki《List of HTTP header fields》,当年瞎摸索的时候,没注意看好这些headers,吃了不少亏。

b. 注意使用debug模式来监测爬取过程中的信息,尤其是报错信息和报错码。错误码也请参照wiki《List_of_HTTP_status_codes》,充分利用这些错误码,也能缩短调试时间。当然,多打印try-except也是一种有效的调试手段。

二、登陆之数据包分析

工具: python-urllib2   |  firefox+firebug或者chrome,用浏览器打开登陆页面之后,按F12键会默认打开开发者工具或者启动firebug,点击network监听数据包,下面以itune的登陆举一个例子。

1. 在浏览器中输入itunes的登陆地址:https://itunesconnect.apple.com/itc/static/loginiew=1&path=%2FWebObjects%2FiTunesConnect.woa,同时按F12启动firebug进行网络监听.


点击“网络” –》 ”全部“ ,可以看到所有加载的页面数据,包括html/图像/css/js等。

点击“html”,全部里边显示的信息太多,可以先只看html,这里边出现的html-url通常是我们需要用urllib2实际请求的页面。

下面是firefox+firebug显示的页面

爬虫之登陆验证

不同的工具监测到数据包会有差别,上面两个对比看一下,大概估计实际需要get的url,就只有2个。


2. 我们点开查看其中一个,重点关注一下相应的参数、头信息。(头信息中的Cookie字段和 后面的cookies表单中的内容是一致的)。

头信息又分为请求头信息和响应头信息。urlopen需要提交的头信息可能是请求头信息中的一部分。响应头信息中的字段可能会在访问下一个页面的时候用到。

爬虫之登陆验证

所以,itunes的登陆大概分为上面三步: 

先 get :  https://itunesconnect.apple.com/itc/static/loginiew=1&path=%2FWebObjects%2FiTunesConnect.woa

后 get :  https://idmsa.apple.com/appleauth/auth/signinidgetKey=22d448248055bab0dc197c6271d738c3

最后post : https://idmsa.apple.com/appleauth/auth/signin

下面附上上面3步骤对应的python代码,早期的话,这种方式直接就能完成itunes的登陆,也适用于大部分简单的网站。

[python]  view plain  copy

  1.   # 记录全过程的cookie  
  2.   cj=cookielib.CookieJar()   
  3.   opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))   
  4.   urllib2.install_opener(opener)   
  5.   # 前两步get  
  6.   response1 = urllib2.urlopen(‘<span style=”font-size:14px;”>https://itunesconnect.apple.com/itc/static/loginiew=1&path=%2FWebObjects%2FiTunesConnect.woa</span>’).read()  
  7.   response2 = urllib2.urlopen(‘https://idmsa.apple.com/appleauth/auth/signinidgetKey=22d448248055bab0dc197c6271d738c3’).read()  
  8.   # 第三步post  
  9.     
  10.   login_data = {‘accountName’:self.account, ‘password’self.password, ‘rememberMe’‘false’}# 账号和密码  
  11.   login_url = “<span style=”font-size:14px;“>https://idmsa.apple.com/appleauth/auth/signin</span>”  
  12.   head = {‘Content-Type’‘application/json’,# 头部信息  
  13.           ‘User-Agent’:‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36’}  
  14.   
  15.   loginData = urllib.urlencode(login_data)      
  16.   request = urllib2.Request(login_url, loginData, head) # 获取网页  
  17.   try:  
  18.       response = urllib2.urlopen(request, timeout = 6)  
  19.   except:  
  20.       print response.read()  
  21.       sys.exit(1)  
  22.   # 完成登陆,打印cookie信息  

在itunes网站升级之后,上面这种方法就不行了,因为itunes添加了新的验证机制,通常是需要爬虫使用额外的header。但难点在于这些header的构造非常复杂,中间会经过一系列js的运算,这个时候要爬虫去计算出这些header值就变得非常困难。例如itunes升级之后,就需要提交一个header叫“X-Apple-I-FD-Client-Info”,而这个header我们算不出来。

总结

通过数据包分析进行登录验证的优缺点如下。

优点:执行速度快。

缺点:抓包分析比较费时,有的时候不确定哪些header是必须的,另外有些header算不出来。

在验证分析需要的header取不到的情况下,就可以考虑使用浏览器模拟点击的方式,跳过数据包分析。

三、登陆之模拟点击

工具:python/java + selenium + firefox/chrome/phantomjs

(1)windows开发环境搭建

默认已经安装好了firefox

  • 安装pip

pip是一个python的软件包管理工具,用于自动下载并安装、更新python包,python3之后的某些版本已经自带pip,在python 2.7之前的话,需要自己安装,现在的安装方法已经非常简单,直接查看官方doc:http://pip.readthedocs.org/en/stable/installing/,下载get-pip.py并执行python get-pip.py即可一键安装。其他方法可参考《怎么在windows下安装pip》。为了便于使用,最好添加到系统变量PATH中。

  • 安装phantomjs

从官网下载windows版本的压缩包(http://phantomjs.org/download.html)。下载之后,直接解压到本地。建议使用最新版phantomjs-2.0.0-windows.zip,因为有些情况下phantomjs不能正确的解析仅仅是因为版本兼容性不好,这种bug基本无解,绕来绕去最终换过版本就好了。

    来源:布衣弓长

    声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2018年3月11日
下一篇 2018年3月11日

相关推荐