Python爬虫学习(三)

回顾

  上一次我们编写了获取淘宝MM的图片,主要用到了模拟post请求,获取数据,然后json解析,正则匹配,图片保存等内容,虽然我们最后获取到了淘宝MM的图片,但是由于防盗刷机制,我们不能大面积的去获取图片,大面积的获取图片的时候,会要求我们登录,这次我们就来模拟下登录,到时再完善下上次获取淘宝MM的代码。

模拟登陆

  要模拟登陆,首先你要知道登陆的URL是什么,这个好办,可以通过Fiddler来获取请求登陆的URL以及POST给服务端的数据,(如果不知道如何使用Fiddler,麻烦移步这里,介绍的已经够清楚了)接下来我们就来模拟登陆下,这次模拟登陆的网站是慕课网,(为什么选它而不选淘宝呢?因为它比较好模拟!淘宝太复杂了,我还不会模拟!)当我们登陆慕课网的时候,我们通过Fiddler我们会看到有两个请求:

一个是登陆的URL,一个是我的课程,登陆成功后,会跳着到我的课程,接下来我们再来看看登陆的URL具体POST了什么数据给服务端,经过查看我们能看到下面的POST内容:

主要是传递了username,password,remember,这3个字段我相信大家都明白是什么意思,可是有一点应该批评下慕课的开发人员,为什么password传递的值是密码明文啊?你不知道这样很危险吗?这个我们就先不管了,我们先来看下如何模拟吧,先上代码吧!

实现过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#coding=utf-8
__author__ = 'JatWaston'

import urllib2
import urllib
import re
import cookielib

class MOOC:
def __init__(self):
self.loginUrl = 'http://www.imooc.com/user/login'
self.cookies = cookielib.CookieJar()
self.postdata = urllib.urlencode({
'username':'xxxxx', #用户名请自行修改
'password':'xxxxx', #密码请自行修改
'remember':'1'
})
self.courseUrl = 'http://www.imooc.com/space/index'#我的课程
self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookies)) #
def login(self):
request = urllib2.Request(url=self.loginUrl,data=self.postdata)
result = self.opener.open(request)
def getCourse(self):
request = urllib2.Request(self.courseUrl)
result = self.opener.open(request)
print result.read()


def main():
imooc = MOOC()
imooc.login()
imooc.getCourse()

if __name__ == '__main__':
main()

由于urllib2.urlopen()函数不支持验证、cookie或者其它HTTP高级功能。要支持这些功能,必须使用build_opener()函数创建自定义Opener对象。
build_opener([handler1 [ handler2, ... ]])

参数handler是Handler实例,常用的有HTTPBasicAuthHandler、HTTPCookieProcessor、ProxyHandler等。
build_opener ()返回的对象具有open()方法,与urlopen()函数的功能相同。

如果想详细了解build_opener用法,可以查看这个教程,介绍的也挺清楚的。

后记

  通过以上代码我们就能模拟登陆慕课了,后续我会完善淘宝MM的抓取,代码已经上传到Github了,大家可以到这里下载。