网络爬虫初级
首先,我們來看一個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 urllibdef getHtml(url):page = urllib.urlopen(url)html = page.read()return htmldef getImg(html):reg = r'src="(.*?\.gif)"'imgre = re.compile(reg)imgList = re.findall(imgre,html)print imgListcnt = 1for imgurl in imgList:urllib.urlretrieve(imgurl,'%s.jpg' %cnt)cnt += 1if __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.httpclientdef 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.codeall_fields = http_response.headers.get_all()for field in all_fields:print fieldprint http_response.bodyif __name__ == '__main__':Fetch('http://www.baidu.com')
?
?
urllib2的常見方法:
?
(1)info()??? 獲取網頁的Header信息
(2)getcode() 獲取網頁的狀態碼
(3)geturl()? 獲取傳入的網址
(4)read()????讀取文件的內容
?
?
總結
- 上一篇: Python数据库的连接
- 下一篇: 网络刷博器