阅读目录html
当咱们试图重新浪微博抓取数据时,咱们会发现网页上提示未登陆,没法查看其余用户的信息。python
模拟登陆是定向爬虫制做中一个必须克服的问题,只有这样才能爬取到更多的内容。chrome
实现微博登陆的方法有不少,通常咱们在模拟登陆时首选WAP版。浏览器
由于PC版网页源码中包括不少的js代码,提交的内容也更多,不适合机器模拟登陆。安全
咱们实现微博登陆的大致思路是这样的:服务器
原理很简单,让咱们一步一步来实现吧。cookie
在电脑和互联网之间的通讯是经过不一样的数据包收发来实现的。数据结构
Fiddler能够从中间对数据进行拦截,拷贝一份数据之后再将数据发送给目的端。(这也是为何说咖啡馆的公共WIFI不安全的缘由)并发
同类的还有WireShark。为什么这儿不用WireShark呢?ide
Wireshark太过于专业了,它能够实现抓取各类包,抓下来的包也很乱,针对性没Fiddler那么强。
1.下载地址:http://www.telerik.com/fiddler
2.安装方法:fiddler依赖.Net环境,若是已经有则无需配置,直接点击下一步就行。
1.启动Fiddler
2.配置Fiddler
点击左上角的“ WinConfig”,找到你使用的浏览器并勾选,点击“Save Changes”
3.使用Fiddler开始抓包
打开浏览器访问WAP版新浪微博网站weibo.cn
Fiddler窗口左侧找到weibo.cn /pub/的数据包,并双击,这时咱们就可以在右侧看到抓取到的信息.
找到Cookies字段,这正是咱们须要的.
维基百科是这样解释的:
Cookie(复数形态Cookies),中文名称为“小型文本文件”或“小甜饼”,指某些网站为了辨别用户身份而储存在用户本地终端(Client Side)上的数据(一般通过加密)。
通俗来讲就是服务器端为了确认用户终端的身份而设定的一种加密标识,它是存储在本地终端上的。
固然,随着Cookies技术的发展,Cookies的做用已经不止于用户身份标识。
当登录一个网站时,网站每每会请求用户输入用户名和密码,而且用户能够勾选“下次自动登陆”。
若是勾选了,那么下次访问同一个网站时,用户会发现没输入用户名和密码就已经登陆了。
这正是由于前一次登录时服务器发送了包含登陆凭据(用户名+密码的某种加密形式)的Cookie到用户的硬盘上。
第二次登陆时,若是该Cookies还没有到期,浏览器会发送该Cookies,服务器验证凭据,因而没必要输入用户名和密码就让用户登陆了。
下面将介绍使用 Fiddler 获取新浪微博 Cookies,而后使用 Requests 提交 Cookies 从而实现模拟登陆。
使用Fiddler抓取数据包.
打开新浪微博WAP版页面(weibo.cn),点击登陆,而后填写帐号密码,勾选“记住登陆状态”,切记要勾选此项.
登陆成功后,从Fiddler中选择最新的那个weibo.cn,而后复制Cookies字段的内容,填写到代码内.
代码以下:
#!/usr/bin/env python #coding=utf8 """ Simulate a user login to Sina Weibo with cookie. You can use this method to visit any page that requires login. """ import urllib2 import re # get your cookie from Fiddler11 cookie = 'your-cookie' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; rv:24.0) Gecko/20100101 Firefox/24.0', 'cookie': cookie } def visit(): url = 'http://weibo.com' req = urllib2.Request(url, headers=headers) text = urllib2.urlopen(req).read() # print the title, check if you login to weibo sucessfully pat_title = re.compile('<title>(.+?)</title>') r = pat_title.search(text) if r: print(r.group(1)) if __name__ == '__main__': visit()
因为使用Cookies登陆存在不少的弊端,通常咱们都使用Post提交数据的方法来实现模拟登陆.
大部分网站登陆时须要携带cookie,因此咱们还必须设置cookie处理器来保证cookie.
notice:若是遇到登陆后网站重定向到其余url这种状况,咱们可使用chrome的审查元素功能找出重定向后的网站url和该网站的提交数据,再次使用post方法就行.
代码以下:
#!/usr/bin/python import HTMLParser import urlparse import urllib import urllib2 import cookielib import string import re #登陆的主页面 hosturl = '******' //本身填写 #post数据接收和处理的页面(咱们要向这个页面发送咱们构造的Post数据) posturl = '******' //从数据包中分析出,处理post请求的url #设置一个cookie处理器,它负责从服务器下载cookie到本地,而且在发送请求时带上本地的cookie cj = cookielib.LWPCookieJar() cookie_support = urllib2.HTTPCookieProcessor(cj) opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler) urllib2.install_opener(opener) #打开登陆主页面(他的目的是从页面下载cookie,这样咱们在再送post数据时就有cookie了,不然发送不成功) h = urllib2.urlopen(hosturl) #构造header,通常header至少要包含一下两项。这两项是从抓到的包里分析得出的。 headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:14.0) Gecko/20100101 Firefox/14.0.1', 'Referer' : '******'} #构造Post数据,他也是从抓大的包里分析得出的。 postData = {'op' : 'dmlogin', 'f' : 'st', 'user' : '******', //你的用户名 'pass' : '******', //你的密码 'rmbr' : 'true', //特有数据,不一样网站可能不一样 'tmp' : '0.7306424454308195' //特有数据,不一样网站可能不一样 } #须要给Post数据编码 postData = urllib.urlencode(postData) #经过urllib2提供的request方法来向指定Url发送咱们构造的数据,并完成登陆过程 request = urllib2.Request(posturl, postData, headers) print request response = urllib2.urlopen(request) text = response.read() print text