python网络爬虫初级实现代码

首先,我们来看一个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代码如下:

import re
import urllib
def gethtml(url):
page = urllib.urlopen(url)
html = page.read()
return html
def getimg(html):
reg = r’src=”(.*?\.gif)”‘
imgre = re.compile(reg)
imglist = re.findall(imgre,html)
print imglist
cnt = 1
for imgurl in imglist:
urllib.urlretrieve(imgurl,’%s.jpg’ %cnt)
cnt += 1
if __name__ == ‘__main__’:
html = gethtml(‘http://www.baidu.com’)
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/

import tornado.httpclient
def fetch(url):
http_header = {‘user-agent’ : ‘chrome’}
http_request = tornado.httpclient.httprequest(url=url,method=’get’,headers=http_header,connect_timeout=200,request_timeout=600)
print ‘hello’
http_client = tornado.httpclient.httpclient()
print ‘hello world’
print ‘start downloading data…’
http_response = http_client.fetch(http_request)
print ‘finish downloading data…’
print http_response.code
all_fields = http_response.headers.get_all()
for field in all_fields:
print field
print http_response.body
if __name__ == ‘__main__’:
fetch(‘http://www.baidu.com’)

urllib2的常见方法:

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

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

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

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