詳解Python網(wǎng)絡(luò)爬蟲功能的基本寫法
網(wǎng)絡(luò)爬蟲,即Web Spider,是一個(gè)很形象的名字。把互聯(lián)網(wǎng)比喻成一個(gè)蜘蛛網(wǎng),那么Spider就是在網(wǎng)上爬來爬去的蜘蛛。
1. 網(wǎng)絡(luò)爬蟲的定義
網(wǎng)絡(luò)蜘蛛是通過網(wǎng)頁(yè)的鏈接地址來尋找網(wǎng)頁(yè)的。從網(wǎng)站某一個(gè)頁(yè)面(通常是首頁(yè))開始,讀取網(wǎng)頁(yè)的內(nèi)容,找到在網(wǎng)頁(yè)中的其它鏈接地址,然后通過這些鏈接地址尋找下一個(gè)網(wǎng)頁(yè),這樣一直循環(huán)下去,直到把這個(gè)網(wǎng)站所有的網(wǎng)頁(yè)都抓取完為止。如果把整個(gè)互聯(lián)網(wǎng)當(dāng)成一個(gè)網(wǎng)站,那么網(wǎng)絡(luò)蜘蛛就可以用這個(gè)原理把互聯(lián)網(wǎng)上所有的網(wǎng)頁(yè)都抓取下來。這樣看來,網(wǎng)絡(luò)爬蟲就是一個(gè)爬行程序,一個(gè)抓取網(wǎng)頁(yè)的程序。網(wǎng)絡(luò)爬蟲的基本操作是抓取網(wǎng)頁(yè)。
2. 瀏覽網(wǎng)頁(yè)的過程
抓取網(wǎng)頁(yè)的過程其實(shí)和讀者平時(shí)使用IE瀏覽器瀏覽網(wǎng)頁(yè)的道理是一樣的。比如說你在瀏覽器的地址欄中輸入 www.baidu.com 這個(gè)地址。
打開網(wǎng)頁(yè)的過程其實(shí)就是瀏覽器作為一個(gè)瀏覽的“客戶端”,向服務(wù)器端發(fā)送了 一次請(qǐng)求,把服務(wù)器端的文件“抓”到本地,再進(jìn)行解釋、展現(xiàn)。
HTML是一種標(biāo)記語(yǔ)言,用標(biāo)簽標(biāo)記內(nèi)容并加以解析和區(qū)分。瀏覽器的功能是將獲取到的HTML代碼進(jìn)行解析,然后將原始的代碼轉(zhuǎn)變成我們直接看到的網(wǎng)站頁(yè)面。
3. 基于python實(shí)現(xiàn)的網(wǎng)絡(luò)爬蟲功能
1). python獲取html頁(yè)面
其實(shí),最基本的抓站,兩句話就可以了:
import urllib2 content = urllib2.urlopen('http://XXXX').read()
這樣可以得到整個(gè) html 文檔,關(guān)鍵的問題是我們可能需要從這個(gè)文檔中獲取我們需要的有用信息,而不是整個(gè)文檔。這就需要解析充滿了各種標(biāo)簽的 html。
2). python爬蟲抓取頁(yè)面后解析html方法
python爬蟲html解析庫(kù)SGMLParser
Python 默認(rèn)自帶 HTMLParser 以及 SGMLParser 等等解析器,前者實(shí)在是太難用了,我就用 SGMLParser 寫了一個(gè)示例程序:
import urllib2 from sgmllib import SGMLParser class ListName(SGMLParser): def __init__(self): SGMLParser.__init__(self) self.is_h4 = "" self.name = [] def start_h4(self, attrs): self.is_h4 = 1 def end_h4(self): self.is_h4 = "" def handle_data(self, text): if self.is_h4 == 1: self.name.append(text) content = urllib2.urlopen('http://169it.com/xxx.htm').read() listname = ListName() listname.feed(content) for item in listname.name: print item.decode('gbk').encode('utf8')
很簡(jiǎn)單,這里定義了一個(gè)叫做 ListName 的類,繼承 SGMLParser 里面的方法。使用一個(gè)變量 is_h4 做標(biāo)記判定 html 文件中的 h4 標(biāo)簽,如果遇到 h4 標(biāo)簽,則將標(biāo)簽內(nèi)的內(nèi)容加入到 List 變量 name 中。解釋一下 start_h4() 和 end_h4() 函數(shù),他們?cè)褪?SGMLParser 中的
start_tagname(self, attrs) end_tagname(self)
tagname 就是標(biāo)簽名稱,比如當(dāng)遇到 <pre>,就會(huì)調(diào)用 start_pre,遇到 </pre>,就會(huì)調(diào)用 end_pre。attrs 為標(biāo)簽的參數(shù),以 [(attribute, value), (attribute, value), ...] 的形式傳回。
python爬蟲html解析庫(kù)pyQuery
pyQuery 是 jQuery 在 python 中的實(shí)現(xiàn),能夠以 jQuery 的語(yǔ)法來操作解析 HTML 文檔,十分方便。使用前需要安裝,easy_install pyquery 即可,或者 Ubuntu 下
sudo apt-get install python-pyquery
以下例子:
from pyquery import PyQuery as pyq doc=pyq(url=r'http://169it.com/xxx.html') cts=doc('.market-cat') for i in cts: print '====',pyq(i).find('h4').text() ,'====' for j in pyq(i).find('.sub'): print pyq(j).text() , print '\n'
python爬蟲html解析庫(kù)BeautifulSoup
有個(gè)頭痛的問題是,大部分的網(wǎng)頁(yè)都沒有完全遵照標(biāo)準(zhǔn)來寫,各種莫名其妙的錯(cuò)誤令人想要找出那個(gè)寫網(wǎng)頁(yè)的人痛打一頓。為了解決這個(gè)問題,我們可以選擇著名的 BeautifulSoup 來解析html 文檔,它具有很好的容錯(cuò)能力。
以上就是本文的全部?jī)?nèi)容,對(duì)Python網(wǎng)絡(luò)爬蟲功能的實(shí)現(xiàn)進(jìn)行了詳細(xì)的分析介紹,希望對(duì)大家的學(xué)習(xí)有所幫助。
- Python網(wǎng)絡(luò)爬蟲神器PyQuery的基本使用教程
- Python爬蟲實(shí)例_城市公交網(wǎng)絡(luò)站點(diǎn)數(shù)據(jù)的爬取方法
- Python3網(wǎng)絡(luò)爬蟲之使用User Agent和代理IP隱藏身份
- Python網(wǎng)絡(luò)爬蟲出現(xiàn)亂碼問題的解決方法
- Python網(wǎng)絡(luò)爬蟲實(shí)例講解
- python3使用urllib模塊制作網(wǎng)絡(luò)爬蟲
- 以Python的Pyspider為例剖析搜索引擎的網(wǎng)絡(luò)爬蟲實(shí)現(xiàn)方法
- 使用Python編寫簡(jiǎn)單網(wǎng)絡(luò)爬蟲抓取視頻下載資源
- python使用rabbitmq實(shí)現(xiàn)網(wǎng)絡(luò)爬蟲示例
- Python發(fā)展史及網(wǎng)絡(luò)爬蟲
相關(guān)文章
python網(wǎng)絡(luò)編程示例(客戶端與服務(wù)端)
這篇文章主要介紹了python網(wǎng)絡(luò)編程示例,提供了客戶端與服務(wù)端,需要的朋友可以參考下2014-04-04Python通過yagmail實(shí)現(xiàn)發(fā)送郵件代碼解析
這篇文章主要介紹了Python通過yagmail實(shí)現(xiàn)發(fā)送郵件代碼解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10pandas創(chuàng)建DataFrame的方式小結(jié)
今天給大家整理了pandas創(chuàng)建DataFrame的方式小結(jié),現(xiàn)在我們就來看看這三種生成Dataframe的方式,每種方式通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2021-09-09Python加載文件內(nèi)容的兩種實(shí)現(xiàn)方式
這篇文章主要介紹了Python加載文件內(nèi)容的兩種實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09Python異步發(fā)送日志到遠(yuǎn)程服務(wù)器詳情
這篇文章主要介紹了Python異步發(fā)送日志到遠(yuǎn)程服務(wù)器詳情,文章通過簡(jiǎn)單輸出到cmd和文件中的代碼展開詳情,需要的朋友可以參考一下2022-07-07python實(shí)現(xiàn)網(wǎng)站微信登錄的示例代碼
這篇文章主要介紹了python實(shí)現(xiàn)網(wǎng)站微信登錄的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09