python 網(wǎng)絡(luò)爬蟲初級(jí)實(shí)現(xiàn)代碼
首先,我們來(lái)看一個(gè)Python抓取網(wǎng)頁(yè)的庫(kù):urllib或urllib2。
那么urllib與urllib2有什么區(qū)別呢?
可以把urllib2當(dāng)作urllib的擴(kuò)增,比較明顯的優(yōu)勢(shì)是urllib2.urlopen()可以接受Request對(duì)象作為參數(shù),從而可以控制HTTP Request的header部。
做HTTP Request時(shí)應(yīng)當(dāng)盡量使用urllib2庫(kù),但是urllib.urlretrieve()函數(shù)以及urllib.quote等一系列quote和unquote功能沒(méi)有被加入urllib2中,因此有時(shí)也需要urllib的輔助。
urllib.open()這里傳入的參數(shù)要遵循一些協(xié)議,比如http,ftp,file等。例如:
urllib.open('http://www.baidu.com')
urllib.open('file:D\Python\Hello.py')
現(xiàn)在有一個(gè)例子,下載一個(gè)網(wǎng)站上所有g(shù)if格式的圖片。那么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)
根據(jù)上面的方法,我們可以抓取一定的網(wǎng)頁(yè),然后提取我們所需要的數(shù)據(jù)。
實(shí)際上,我們利用urllib這個(gè)模塊來(lái)做網(wǎng)絡(luò)爬蟲效率是極其低下的,下面我們來(lái)介紹Tornado Web Server。
Tornado web server是使用Python編寫出來(lái)的一個(gè)極輕量級(jí)、高可伸縮性和非阻塞IO的Web服務(wù)器軟件,著名的Friendfeed網(wǎng)站就是使用它搭建的。Tornado跟其他主流的Web服務(wù)器框架(主要是Python框架)不同是采用epoll非阻塞IO,響應(yīng)快速,可處理數(shù)千并發(fā)連接,特別適用用于實(shí)時(shí)的Web服務(wù)。
用Tornado Web Server來(lái)抓取網(wǎng)頁(yè)效率會(huì)比較高。
從Tornado的官網(wǎng)來(lái)看,還要安裝backports.ssl_match_hostname,官網(wǎng)如下:
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的常見(jiàn)方法:
(1)info() 獲取網(wǎng)頁(yè)的Header信息
(2)getcode() 獲取網(wǎng)頁(yè)的狀態(tài)碼
(3)geturl() 獲取傳入的網(wǎng)址
(4)read() 讀取文件的內(nèi)容
相關(guān)文章
利用Python對(duì)文件夾下圖片數(shù)據(jù)進(jìn)行批量改名的代碼實(shí)例
今天小編就為大家分享一篇關(guān)于利用Python對(duì)文件夾下圖片數(shù)據(jù)進(jìn)行批量改名的代碼實(shí)例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02Django報(bào)錯(cuò)TemplateDoesNotExist的問(wèn)題及解決
這篇文章主要介紹了Django報(bào)錯(cuò)TemplateDoesNotExist的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08Python turtle實(shí)現(xiàn)貪吃蛇游戲
這篇文章主要為大家詳細(xì)介紹了Python turtle實(shí)現(xiàn)貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06python基于paramiko庫(kù)遠(yuǎn)程執(zhí)行 SSH 命令,實(shí)現(xiàn) sftp 下載文件
這篇文章主要介紹了python基于paramiko庫(kù)遠(yuǎn)程執(zhí)行 SSH 命令,實(shí)現(xiàn) sftp 下載文件的方法,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-03-03