首先,推荐两个关于python爬虫不错的博客:Python爬虫入门教程专栏 和 Python爬虫学习系列教程 。写的都很是不错,我学习到了不少东西!在此,我就我看到的学到的进行总结一下!javascript
爬虫就是一个不断的去抓去网页的程序,根据咱们的须要获得咱们想要的结果!但咱们又要让服务器感受是咱们人在经过浏览器浏览不是程序所为!归根到底就是咱们经过程序访问网站获得html代码,而后分析html代码获取有效内容的过程。下面让咱们从最简单的爬虫开始:html
爬取一个页面源代码java
在python中,抓取网页的库是urllib2。下面看一个最简单的例子:python
1 import urllib2 2 response = urllib2.urlopen('http://www.baidu.com/') 3 html = response.read() 4 print html
执行完成后你会发现窗口中打出了一堆代码,其实就是百度主页的html代码!(抵制百度!!!)浏览器
咱们来看一下urlopen的用法:安全
1 >>> help(urllib2.urlopen) 2 Help on function urlopen in module urllib2: 3 4 urlopen(url, data=None, timeout=<object object>, cafile=None, capath=None, cadefault=False, context=None)
第一个参数为url,第二个为要发送的数据,第三个是超时时间。其他的咱们通常不用,就不解释了!第二三个参数不是必须的,由于都有默认值,data默认值为None,timeout默认值为socket._GLOBAL_DEFAUTL_TIMEOUT。传入url以后,咱们获得一个response对象,返回的信息就在这里面!经过response.read()获取里面的内容。一样的咱们能够构造一个Request类,做为参数传入urlopen中,这个Request类中就包含url,data,timeout等内容。上面的代码咱们能够写成这样:服务器
1 import urllib2 2 3 request = urllib2.Request("http://www.baidu.com") 4 response = urllib2.urlopen(request) 5 print response.read()
这样是否是很清晰明了了?在构建Request的时候咱们一般会加入不少内容,咱们发出一个请求,服务器给咱们一个响应。一个简单的爬虫就这样起飞了!cookie
POST和GET数据传送app
日常咱们在浏览网页的时候不免涉及到登陆注册,填写表单,或者跳转到某个页面,这时候咱们要跟服务器进行交互,向服务器发送数据,发送数据的方式呢就是Post和Get,二者的区别在于GET方式直接以连接的形式访问,连接中包含全部的参数,如:http://www.baidu.com/shit?result=true 其中 result=true就是Get传递的数据,POST至关于Get就安全多了,它不会在连接上显示全部参数。python爬虫
Post方式:
1 import urllib 2 import urllib2 3 4 values = {} 5 values['username'] = "977610289@qq.com" 6 values['password'] = "******" 7 data = urllib.urlencode(values) 8 url = "http://www.xxx.com/login?from=http://xxx/loginInfo" 9 request = urllib2.Request(url,data) 10 response = urllib2.urlopen(request) 11 print response.read()
在上面的代码中,咱们建立了一个字典values,设置了username和password的值,而后经过urlencode函数将字典进行转码,命名为data,而后用url和data实例化了一个Request类,传递给urlopen()。
Get方式:
1 import urllib 2 import urllib2 3 4 values={} 5 values['username'] = "977610289@qq.com" 6 values['password']="******" 7 data = urllib.urlencode(values) 8 url = "http://www.xxx.com/login" 9 geturl = url + "?"+data 10 request = urllib2.Request(geturl) 11 response = urllib2.urlopen(request) 12 print response.read()
在上面的代码中,咱们建立了一个字典values,设置了username和password的值,而后经过urlencode函数将字典进行转码,命名为data,而后咱们把data拼接在了url中,咱们会获得这样的url:http://www.xxx.com/login?username=977610289%40qq.com&password=******。
在实现一个爬虫的时候,咱们要根据须要,选择post或者get方式进行访问!不过除了上面那些还不够,如今网站为了不爬虫去访问会进行一些检测,若是检测不经过就不会响应你的请求,为了彻底模拟浏览器工做,咱们每每要设置一些headers属性,以及防盗链:
1 headers = { 'User-Agent' : 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' , 2 'Referer':'http://www.zhihu.com/articles' }
3 request = urllib2.Request(url, data, headers)#利用data headers构造Request对象
有些网站可能会检测ip等,咱们可能会用到urllib2的代理,有些网站响应过慢咱们能够设置其timeout。在访问网站的状况下咱们可能会遇到一些网站错误,咱们要在程序中进行处理(一如既往的try... except...获得错误信息内容):
1 import urllib2 2 3 req = urllib2.Request('http://www.xxx.com') 4 try: 5 urllib2.urlopen(req) 6 except urllib2.URLError, e: 7 if hasattr(e,"code"): 8 print e.code 9 if hasattr(e,"reason"): 10 print e.reason 11 else: 12 print "OK"
常见的错误代码:400 非法请求 403 禁止访问 404 未找到资源 500 服务器内部错误 200 访问成功。
在网页访问过程当中,不可避免的要用到cookies,咱们的程序要模拟浏览器的行为,在访问网页的时候有时候要带上特定的cookies,这样才能成功访问网页。关于cookies咱们用到了cookielib,cookielib模块提供可存储cookie的对象,以便于与urllib2配合使用进行网站访问,利用其中的CookieJar类捕获和发送cookie,实现模拟登陆,维持登陆状态等。
获取cookie保存到变量:
1 import urllib2 2 import cookielib 3 #声明一个CookieJar对象实例来保存cookie 4 cookie = cookielib.CookieJar() 5 #利用urllib2库的HTTPCookieProcessor对象来建立cookie处理器 6 handler=urllib2.HTTPCookieProcessor(cookie) 7 #经过handler来构建opener 8 opener = urllib2.build_opener(handler) 9 #此处的open方法同urllib2的urlopen方法,也能够传入request 10 response = opener.open('http://www.baidu.com') 11 for item in cookie: 12 print 'Name = '+item.name 13 print 'Value = '+item.value 14 #利用cookie请求访问另外一个网址 15 gradeUrl = 'http://www.baidu.com/xxx/xx' 16 #请求访问 17 result = opener.open(gradeUrl) 18 print result.read()
上面程序建立了一个带有cookie的opener,在访问登陆url的时候,将登陆后的cookie保存下来,而后利用这个cookie来访问其余的网址。
下面放一个HttpClient.py,里面包含了post和get方法,以及getcookies:
1 import cookielib, urllib, urllib2, socket 2 3 class HttpClient: 4 __cookie = cookielib.CookieJar() 5 __req = urllib2.build_opener(urllib2.HTTPCookieProcessor(__cookie)) 6 __req.addheaders = [ 7 ('Accept', 'application/javascript, */*;q=0.8'), 8 ('User-Agent', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)') 9 ] 10 urllib2.install_opener(__req) 11 12 def Get(self, url, refer=None): 13 try: 14 req = urllib2.Request(url) 15 if not (refer is None): 16 req.add_header('Referer', refer) 17 return urllib2.urlopen(req, timeout=120).read() 18 except urllib2.HTTPError, e: 19 return e.read() 20 except socket.timeout, e: 21 return '' 22 except socket.error, e: 23 return '' 24 25 def Post(self, url, data, refer=None): 26 try: 27 req = urllib2.Request(url, urllib.urlencode(data)) 28 if not (refer is None): 29 req.add_header('Referer', refer) 30 return urllib2.urlopen(req, timeout=120).read() 31 except urllib2.HTTPError, e: 32 return e.read() 33 except socket.timeout, e: 34 return '' 35 except socket.error, e: 36 return '' 37 38 def Download(self, url, file): 39 output = open(file, 'wb') 40 output.write(urllib2.urlopen(url).read()) 41 output.close() 42 43 def getCookie(self, key): 44 for c in self.__cookie: 45 if c.name == key: 46 return c.value 47 return '' 48 49 def setCookie(self, key, val, domain): 50 ck = cookielib.Cookie(version=0, name=key, value=val, port=None, port_specified=False, domain=domain, domain_specified=False, domain_initial_dot=False, path='/', path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False) 51 self.__cookie.set_cookie(ck)