首页 > 代码库 > 【Pyhton】 网络爬虫初级

【Pyhton】 网络爬虫初级

【本文原创于Paul的博客园技术博客。】

【本文欢迎转载,转载请以链接形式注明出处。】

【本博客所有文章都经博主精心整理,请尊重我的劳动成果。】

【Pyhton】  网络爬虫初级

 

首先,我们来看一个Python抓取网页的库:urllib或urllib2。

 

那么urllib与urllib2有什么区别呢?

 

可以把urllib2当作urllib的扩增,比较明显的优势是urllib2.urlopen()可以接受Request对象作为参数,从而可以控制HTTP Request的header部。

 

做HTTP Request时应当尽量使用urllib2库,但是urllib.urlretrieve()函数以及urllib.quote等一系列quote和unquote功能没有被加入urllib2中,因此有时也需要urllib的辅助。

 

urllib.open()这里传入的参数要遵循一些协议,比如http,ftp,file等。例如:

 

urllib.open(‘http://www.baidu.com‘)

 

urllib.open(‘file:D\Python\Hello.py‘)

 

现在有一个例子,下载一个网站上所有gif格式的图片。那么Python代码如下:

 1 import re
 2 import urllib
 3 
 4 def getHtml(url):
 5     page = urllib.urlopen(url)
 6     html = page.read()
 7     return html
 8 
 9 def getImg(html):
10     reg = rsrc="http://www.mamicode.com/(.*?\.gif)"
11     imgre = re.compile(reg)
12     imgList = re.findall(imgre,html)
13     print imgList
14     cnt = 1
15     for imgurl in imgList:
16         urllib.urlretrieve(imgurl,%s.jpg %cnt)
17         cnt += 1
18 
19 if __name__ == __main__:
20     html = getHtml(http://www.baidu.com)
21     getImg(html)

根据上面的方法,我们可以抓取一定的网页,然后提取我们所需要的数据。

实际上,我们利用urllib这个模块来做网络爬虫效率是极其低下的,下面我们来介绍Tornado Web Server。

Tornado web server是使用Python编写出来的一个极轻量级、高可伸缩性和非阻塞IO的Web服务器软件,著名的Friendfeed网站就是使用它搭建的。Tornado跟其他主流的Web服务器框架(主要是Python框架)不同是采用epoll非阻塞IO,响应快速,可处理数千并发连接,特别适用用于实时的Web服务。

用Tornado Web Server来抓取网页效率会比较高。

从Tornado的官网来看,还要安装backports.ssl_match_hostname,官网如下:

http://www.tornadoweb.org/en/stable/

 1 import tornado.httpclient
 2 
 3 def Fetch(url):
 4     http_header = {User-Agent : Chrome}
 5     http_request = tornado.httpclient.HTTPRequest(url=url,method=GET,headers=http_header,connect_timeout=200,request_timeout=600)
 6     print Hello
 7     http_client = tornado.httpclient.HTTPClient()
 8     print Hello World
 9 
10     print Start downloading data...
11     http_response = http_client.fetch(http_request)
12     print Finish downloading data...
13 
14     print http_response.code
15 
16     all_fields = http_response.headers.get_all()
17     for field in all_fields:
18         print field
19 
20     print http_response.body
21 
22 if __name__ == __main__:
23     Fetch(http://www.baidu.com)

urllib2的常见方法:

(1)info()    获取网页的Header信息

(2)getcode() 获取网页的状态码

(3)geturl()  获取传入的网址

(4)read()    读取文件的内容