爬蟲軟件python功能_Python 網絡爬蟲程序詳解

#!/usr/bin/python #調用python

from sys import argv #導入sys是導入python解釋器和他環境相關的參數

from os import makedirs,unlink,sep  #os主要提供對系統路徑,文件重命名和刪除文件所需的函數

#makedirs是創建遞歸文件夾的函數。

#比如說我們要創建一個新的目錄,/python/HTML/crawl,但是目前這三個文件夾都不存在,如果使用mkdir命令的話需要使用三次才能完成,

#但是使用os.makedir只需使用一次就可以創建好整個目錄。

#os.makedirs(os.path.join(os.erviron["HOME"],"python","HTML","crawl")

#os.unlink(path)刪除file路徑,和remove()相同。

#sep os.sep系統用此來分割路徑名

from os.path import dirname,exists,isdir,splitext

#使用os中的這些模塊來提取dirname路徑名,exists,isdir是文件類型測試,測試是否是一個目錄,splitext是將文件名和文件后綴分離。分成目錄文件名和后綴兩部分。

from string import replace,find,lower  #導入string模塊,用于字符串的替換,查找,和小寫化。

from htmllib import HTMLParser

from urllib import urlretrieve  #urlretrieve()函數用于將HTML文件整個下載到你的本地硬盤中去。

from urlparse import urlparse,urljoin  #urlparse用于將URL分解成6個元素,而urljoin用于將baseurl和newurl組合在一起

from formatter import DumbWriter,AbstractFormatter  #formatter函數主要用于格式化文本

from cStringIO import StringIO  #調用cStringIO函數對內存中的文件進行處理

#Retriever類負責從網上下載網頁并對每一個文檔里面的連接進行分析,如果符合下載原則就添加到“待處理”隊列中。

#從網上下載到的每個主頁都有一個與之對應的Retriever實例。Retriever有幾個幫助實現功能的方法,分別是:

#構造器(__init__()),filename(),download()和parseAndGetLinks()。

class Retriever:

def __init__(self,url):

#定義構造器,指向當前類的當前實例的引用。self 指向新創建的對象,另外一個參數是url.

#構造器實例化一個Retriever對象,并且把URL字符串和從filename()返回的與之對應的文件名保存為本地屬性。

self.url=url  #將url的值付給self.url

self.file=self.filename(url)

def filename(self,url,deffile="index.html"):  #定義filename方法,涉及另外兩個參數,url,deffile,很明顯deffile是后綴

parsedurl=urlparse(url,"http:",0)

urlparse(urlstr,defProtsch=None,allowFrag=None),defProtsch定義了缺醒的網絡協議和下載方式,allow是一個表示是否允許在URL中使用不完整成分的操作標志。allow_fragment如果是false,即使在URL addressing scheme支持fragment identifiers得情況下fragment identifiers也不允許,默認情況下fragment的默認值是true.

path=parsedurl[1]+parsedurl[2]

從urlparse分離出來的六個元素分別是(prot_shc,net_loc,path,params,query,frag).

parseurl[1]是net_loc,parseurl[2]是path.

和在一起正好是整個路徑

ext=splitext(path)

將path分解成目錄文件名和后綴標志。

if ext[1]=="":

如果沒有文件。ext是一個字符串,ext[0]就是目錄文件名,而ext[1]就是后綴名,說明沒有后綴

if path[-1]=="/":

并且path是比如說是以我的博客為例,http://blog.csdn.net/yangwenchao1983,分離后path[-1]=3,也就是字符串的最后一個字母,如果是/,說明有文件內容,

path=path+deffile

如果URL沒有尾綴的文件名,就用缺性的"index.html“作為文假名,可以說是一個主王爺,上面有各種文件公下載,現在沒有合適的文件,我們酒吧index.html作為補充。

else:

path=path+"/"+deffile  #如果是一個完整的文件名,我們需要在后面加上/index.html  如果不含有"/"符號的話,

dir=dirname(path)  #提取path字符串的目錄名稱

if sep!="/":  #如果文件的分割符不是/

dir=replace(dir,"/",sep)  #將dir中的/替換成分割符,/

if not isdir(dir):  #使用isdir辨別文件類型不是目錄。

if exists(dir): unlink(dir)  #如果不是目錄文件,就是用unlink移除,

makedirs(dir)  #重新使用makedirs創建目錄文件

return path  #返回經過整理的路徑

def download(self):  #定義download()方法,使用try...except...來進行異常處理,

try:

retval=urlretrieve(self.url,self.file)

urlretrieve()不像urlopen()那樣對URL進行讀操作,它只是簡單的把位于urlstr處的HTML文件整個下載到你的本地硬盤中去,如果沒有給出localfile,它就會把數據保存到一個臨時文件中去。很明顯,這行程序的意思就是將self.url從望上的某個地方拷貝到硬盤的self.file中去。

except IOError:

如果文件不存在,就會引發IOerror,

retval=("***ERROR: invalid URL "%s"" %\self.url,)

沒有在有效的網址上找到這個文件,就將"***ERROR: invalid URL "%s""打印出來

return retval  #返回得到的文件

def parseAndGetLinks(self):

如果上面的的處理沒有發現任何錯誤,就會調用parseAndGetLinks()對新下載打破的主頁進行分析,確定對那個主頁上的每一個連接應該采取什么樣的行動。

self.parser=HTMLParser(AbstractFormatter(DumbWriter(StringIO())))

使用HTMLParser的方法進行處理,StringIO是從內存中讀取數據,DumbWriter將事件流轉換為存文本文檔。

self.parser.feed(open(self.file).read())

將self.file文件打開并且一次性讀入上面定義的的文件中去

self.parser.close()  #關閉文件

return self.parser.anchorlist  #返回地址和日期

class Crawler:

Crawler由三個數據項組成,這三個數據項是由構造器在實例化階段報存在這里的。

count = 0   #靜態下載主頁計數器

def __init__(self,url):

self.q=[url]

第一個數據是q,這是一個有下載連接組成的隊列,這個清單在執行過程中是會變化的,沒處理一個主頁它就縮短一次,而在各下載主頁中發現一個新的連接就會被加長。

self.seen=[]

Crawler的另外兩個數據項包括seen-這是我們已經下載過的全體連接所組成的一個列表;

self.dom=urlparse(url)[1]

把主連接的域名報存在dom中,用這個值核對后續連接是否屬于這同一個區域。

def getPage(self,url):

getPage()方法用第一個連接實例化出一個Retriever對象,從她開始進行后續的處理。

r=Retriever(url)

使用上面定義過得Retriever類,付給r。

retval=r.download()  #下載網頁連接,

if retval[0]=="*":

print retval,"...skipping parse"

return

Crawler.count=Crawler.count+1

Crawler還有一個靜態數據叫做count。這個計數器的作用就是記錄我們呢已經從望紅色那個下載到的對象的個數,每成功下載一個主頁,就讓它增加一個數。

print "\n(",Crawler.count,")"

print "URL:",url

print "FILE:",retval[0]

self.seen.append(url)

links=r.parseAndGetLinks()

for eachLink in Links:

if eachLink[:4]!="http" and find(eachLink,"://")==-1

print "*",eachLink,

以下鏈接將被忽略,不會被添加到待處理隊列里去的:屬于另外一個域的連接,已經被下載過得鏈接,已經放入待處理隊列里去的連接或者是"mailto:"連接。

if find(lower(eachLink),"mailto:")!=-1:應該是超連接

print "...discard,mailto link"

contine

if eachlink not in self.seen:

if find(eachLink,self.dom)==-1:

print "...discarded,not in domain"

else:

if eachLink not in self.q:

self.q.append(eachLink)

print "...new,aded to Q"

else:

print "...discarded,already in Q"

else:

print "...discarded,already processed"

def go(self):

while self.q:

url=self.q.pop()

self.getPage(url)

def main():

if len(argv)>1:

url=argv[1]

else:

try:

url=raw_input("Enter starting URL:")

except(KeyboardInterrupt,EOFError):

url=""

if not url: return

robot=Crawler(url)

robot.go()

if __name__=="__main__":

main()

main()只有在這個腳本程序在直接被調用時才會執行,它是程序的出發點,其他導入了crawl.py的模塊需要明確的調用main()才能開始處理。要讓main()開始執行,需要給它一個URL,如果已經在一個命令行給出URL(例如我們直接調用這個腳本程序的時候),它就會從給定的URL起開始運行;否則,腳本程序將進入交互模式,提示用戶輸入一個URL。有了初始連接之后,程序將對Crawler類進行實例化并開始執行。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/443261.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443261.shtml
英文地址,請注明出處:http://en.pswp.cn/news/443261.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

價錢轉換python_如何在python中轉換貨幣?

我正在做一個虛擬助手項目。我想讓它告訴我其他貨幣的美元匯率。我用beauthoulsoup編寫了以下代碼,它從給定的網站獲取數據,對其進行解析并在命令行中打印結果供我閱讀。但這只是美元對巴基斯坦盧比。如何修改程序,使其接受任何貨幣并告訴我該…

char qt 轉unicode_Qt QString 中文 char* UTF-8 QByteArray QTextCodec unicode gb2312 GBK 亂碼與轉碼問題...

2012-03-22 14:00175人閱讀評論(0)代碼如下:如果不不設全局的字符集是utf-8,那么網上一般的方法是可以轉的。如下程序中 #define DD 1的情況下;但是如果設置了全局的utf-8,再用以前的方法:QByteArraybaaaa.toLatin1();…

計算機圖形學考試題及答案_計算機圖形學考試題及答案

3、在圖形文件中,常用來描述圖形元素(點,線,圓,弧等);而在光柵掃描圖形顯示器中,采用顯示所有圖形。4、當三維物體用透視變換方程投影到觀察平面上,物體中不與觀察平面平行任一簇平行線投影成收…

子窗體中組合框聯動_一張表實現組合框聯動

嗨,大家中午好!最近,有網友給我私信,想要一個聯動的示例,一個有關于部門聯動的操作。其實關于聯動的操作有很多,可以是組合框的聯動,列表框聯動,組合框與列表框也可以聯動&#xff0…

中如何實現文字轉語音_錄音轉文字、文字轉語音,學會這一招就夠了!手把手教你如何操作...

閱讀文章時候想著有人可以把文章讀給我聽就好了,寫作時想著語音直接可以轉換成文字就好了,大家是不是有時會突然冒出這樣的想法?七十這些看似天真的想法,還真的有辦法解決,這里就手把手教你如何操作才能將的文字轉換成…

圖像 理想低通濾波_圖像處理之濾波(下)

[toc]目錄一、常規濾波低通高通帶通帶阻二、非局部均值濾波三、維納濾波四、卡爾曼濾波前言所謂濾波,其實就是從混合在一起的諸多信號中提取出所需要的信號。信號的分類:確定型信號,可以表示為確定的時間函數,可確定其在任何時刻的…

泰山行宮碧霞元君祠_臨清市泰山行宮碧霞元君祠5月4號(農歷三月三十日)舉行大型泰山奶奶接駕法會...

臨清是泰山奶奶的娘家,每年的四月泰山奶奶要回臨清省親臨清市道教協會定于2019年農歷三月三十(5月4號星期六)于臨清桑樹園泰山行宮碧霞元君祠舉行大型泰山奶奶迎鸞接駕廟會。屆時,將有架鼓會、云龍會、獅胞會、鋼叉會、高蹺會、天音會、彩船會、秧歌會等…

充分條件反過來是必要條件嗎_“充分必要條件”引發的現實思考

昨天看了一篇文章是介紹“充分條件和必要條件”,大致就是A能直接推導出B,那A就是B的充分條件。A不一定能推導出B,但是沒A一定推導不出B,那A就是B必要條件。舉個簡單的例子:對你好(A)與喜歡你&am…

手機游戲降低游戲延遲的軟件_怎么降低手機網絡延遲(減少網絡延遲的5個小技巧)...

在過去的幾十年里,用戶或開發人員并不擔心延遲。在上世紀90年代和本世紀初,個人互聯網連接速度要慢得多,因此發送請求和接收響應之間的延遲要遠遠小于下載完成所需的時間。如今,更高的帶寬連接使下載速度更快,因此延遲…

mysql常用的開發軟件下載_強烈推薦!14款經典的MySQL客戶端軟件

【IT168 評論】不用我說,大家都知道MySQL是一個怎么樣的數據庫。雖然它的命運比較坎坷,但是絲毫沒有影響到我們對MySQL的熱情。不論是個人程序或者網站,還是企業數據庫,MySQL的身影無處不在。無論做什么數據庫的開發,一…

mysql最大值最小值_mysql最大值,最小值,總和查詢與計數查詢

1、最大值查詢:mysql> select max(score) from 4a;------------| max(score) |------------| 93 |------------1 row in set (0.06 sec)2、最小值查詢:mysql> select max(4a.score),min(4inall.score) from 4a,4inall;-------------------…

阿里云 centos mysql_在阿里云的CentOS環境中安裝配置MySQL的教程

1 常規錯誤的yum安裝方法:在前文中記述了CentOS 6.5系統中通過yum方式快速地搭建了LNMP環境,那么是否也能在CentOS 7或CentOS 7.1系統中依葫蘆畫瓢安裝MySql5.6.24呢?答案是否定的。[roottypecodes ~]# yum -y install mysql mysql-server my…

mysql文件脫機_SQL數據庫的脫機與聯機操作

online : 可對數據庫進行訪問offline:數據庫無法使用1、使用查詢語句select state_desc from sysdatabases where name 數據庫名 2、使用databasepropertyex( database,property)函數select databasepropertyex( 數據庫 ,’ status )分離數據庫:EXEC…

dockerfile 安裝mysql_dockerfile構建mysql鏡像

使用dockerfile構建mysql,鏡像構建完成后,運行容器后,啟動mysql服務總是報錯Fatal error: Cant open and lock privilege tables: Table storage engine for db doesnt have this optionmysql安裝使用的官方的壓縮包mysql-5.7.20-linux-glibc…

ubunt11 安裝mysql_ubuntu 11.10安裝mysql

1. 安裝devadmdevserver:~$ sudo apt-get install mysql-server......The following NEW packages will be installed:libdbd-mysql-perl libdbi-perl libhtml-template-perl libmysqlclient16libnet-daemon-perl libplrpc-perl mysql-client-5.1 mysql-client-core-5.1mysql-c…

mysql 取交集 php_mysql 查詢結果取交集的方法

本文將詳細介紹MySQL中如何實現以SQL查詢返回的結果集取交集的實現方法,需要的朋友可以參考1MySQL中如何實現以下SQL查詢(SELECT S.NameFROM STUDENT S, TRANSCRIPT TWHERE S.StudId T.StudId AND T.CrsCode CS305)INTERSECT(SELECT S.NameFROM STUDENT S, TRANSC…

mysql極客_極客mysql16

1.MySQL會為每個線程分配一個內存(sort_buffer)用于排序該內存大小為sort_buffer_size1>如果排序的數據量小于sort_buffer_size,排序將會在內存中完成2>如果排序數據量很大,內存中無法存下這么多數據,則會使用磁盤臨時文件來輔助排序&a…

mysql觸發器生成流水_利用mysql觸發器生成流水號

http://blog.csdn.net/bluestream/article/details/5755176利用mysql觸發器可以生成如日期(20100721)編號(0001)的流水號,編號每天都會從0001開始計算create table orders(orders_id int(10) primary key,customer_name varchar(100) );--------------------------------------…

linux 測試環境啟用jar_Linux下搭建測試環境

一、下載安裝包https://pan.baidu.com/s/1h-Nk8HcWKKtqbjrn0J_t1g 457jJDK1.8安裝包、Tomcat8安裝包本文用的遠程連接Linux操作系統的客戶端工具為Xshell,相關使用請自行百度二、安裝JDK1、先檢查該環境是否已經安裝過jdk。輸入java -version。如果有,…

代碼中 密碼存儲_你還記得瀏覽器自動存儲的密碼嗎?用js代碼恢復一下記憶吧...

哈嘍大家好我是無知便是罪專注于收集和分享互聯網上不為人知的好東西正常來說我們的手機和瀏覽器都有一個非常實用的功能就是可以自動的加密存儲我們的常用密碼了然后呢在我們需要的時候呢它可以自動填入進來非常非常的省時省力不過呢這種功能的我們用久了就很容易忘記自己當初…