




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第十三章網(wǎng)絡(luò)爬蟲基礎(chǔ)與實戰(zhàn)13.5BS庫的使用13.4網(wǎng)頁解析基礎(chǔ)13.2常用的爬蟲技術(shù)13.6lxml庫的使用13.3爬蟲基礎(chǔ)13.1爬蟲系統(tǒng)結(jié)構(gòu)13.7scrapy爬蟲框架13.1爬蟲系統(tǒng)架構(gòu)13.1爬蟲系統(tǒng)架構(gòu)?URL地址管理器:管理爬取的網(wǎng)頁地址,防止重復(fù)抓取和循環(huán)抓取。?HTML網(wǎng)頁下載器:下載對應(yīng)的網(wǎng)頁內(nèi)容到本地。?HTML網(wǎng)頁解析器:解析爬取的網(wǎng)頁內(nèi)容,從網(wǎng)頁中提取有價值的信息。?數(shù)據(jù)存儲管理器:保存爬取的有用信息,把解析出來的信息永久保存到文件或者數(shù)據(jù)庫中。13.2常用的爬蟲技術(shù)13.2常用的爬蟲技術(shù)
爬蟲系統(tǒng)主要是模擬人的上網(wǎng)行為,構(gòu)造HTTP請求包,發(fā)送HTTP請求到服務(wù)器,接收服務(wù)器返回的HTTP響應(yīng),對返回的網(wǎng)頁進(jìn)行解析,提取有價值的信息。
1.實現(xiàn)http請求爬蟲系統(tǒng)的核心部件之一就是HTML網(wǎng)頁下載器,下載網(wǎng)頁就需要實現(xiàn)HTTP請求,在Python中實現(xiàn)HTTP請求比較常用的主要有兩個庫:
urllib和requests庫requests庫基于urllib,是一個基于Apache2開源協(xié)議的HTTP庫。它比urllib更加方便,使用它可以減少爬蟲系統(tǒng)編寫的工作量,能夠滿足HTTP的測試需求。13.2常用的爬蟲技術(shù)2.實現(xiàn)網(wǎng)頁解析1)正則表達(dá)式正則表達(dá)式使用預(yù)定義的模式去匹配一類具有共同特征的字符串,可以快速、準(zhǔn)確地完成復(fù)雜的查找、替換等處理要求。正則表達(dá)式在文本編輯與處理、網(wǎng)頁爬蟲之類的場合中有重要應(yīng)用。它能夠提取想要的所有信息,效率也比較高,但是缺點也很明顯,就是寫起來比較復(fù)雜,不是很直觀。2)lxml庫lxml庫使用XPath語法,同樣是效率比較高的解析庫。XPath是一門在XML文檔中查找信息的語言,XPath可以在XML文檔中對元素和屬性進(jìn)行遍歷。XPath比較直觀易懂,lxml庫是解析網(wǎng)頁的最佳選擇,推薦使用lxml進(jìn)行網(wǎng)頁內(nèi)容解析。13.2常用的爬蟲技術(shù)3)bs4.BeautifulSoupBeautifulSoup是一個可以從HTML或者XML文件中提取數(shù)據(jù)的Python庫。它能夠?qū)崿F(xiàn)文檔的導(dǎo)航和查找。BeautifulSoup簡單易學(xué),但相比lxml和正則表達(dá)式,解析速度要慢很多。13.2常用的爬蟲技術(shù)
3)爬蟲框架Python中很多實現(xiàn)爬蟲項目的半成品---爬蟲框架。爬蟲框架允許根據(jù)具體項目的情況,調(diào)用框架提供的接口,編寫少量的代碼實現(xiàn)一個爬蟲系統(tǒng)。爬蟲框架實現(xiàn)了爬蟲系統(tǒng)要實現(xiàn)的常用功能,節(jié)省了編程人員的開發(fā)時間,幫助程序員高效開發(fā)爬蟲系統(tǒng)。Python中,爬蟲框架很多,常見的有Scrapy、Pyspider、Cola等。Scrapy是Python中最著名、最受歡迎的爬蟲框架,它是一個相對成熟的框架,有著豐富的文檔和開放的社區(qū)交流空間。13.3爬蟲基礎(chǔ)13.3爬蟲基礎(chǔ)
1.HTTP請求1)請求方法不同的請求方法有著不同的作用,最常見的請求方法有GET方法和POST方法。get()get方法請求指定的頁面信息。如果要查詢字符串(名稱/值對),那么這些信息是包含在get請求的URL中的。post()post方法向指定的資源提交要被處理的數(shù)據(jù)(如提交表單或者用戶登錄驗證),數(shù)據(jù)被包含在請求體中。
13.3爬蟲基礎(chǔ)
2)
請求頭部請求頭部包含很多關(guān)于客戶端環(huán)境和請求正文的有用信息。例如,請求頭部可以聲明瀏覽器所用的語言、瀏覽器的類型、操作系統(tǒng)、請求正文的長度等。一般網(wǎng)站服務(wù)器最常見的反爬蟲措施就是通過讀取請求頭部的用戶代理(user-agent)信息,來判斷這個請求是來自正常的瀏覽器還是爬蟲系統(tǒng),為了應(yīng)對服務(wù)器的這種反爬蟲策略,編寫爬蟲系統(tǒng)經(jīng)常需要構(gòu)造請求頭部,來偽裝成一個正常的瀏覽器。13.3爬蟲基礎(chǔ)RequestHeaders由眾多的頭域組成,每個頭域由一個域名、冒號(:)和值域3部分組成。它以字典的形式列出具體的信息,其中包含了重要的user-agent(用戶代理)信息。13.3爬蟲基礎(chǔ)
2.HTTP響應(yīng)瀏覽器發(fā)送HTTP請求后,WEB服務(wù)器會返回一個響應(yīng)(Response),其存儲了服務(wù)器響應(yīng)的內(nèi)容,該響應(yīng)是以HTML格式發(fā)送給瀏覽器的。同時,服務(wù)器會發(fā)送一個響應(yīng)狀態(tài)碼(HTTPStatusCode)。HTTP狀態(tài)碼主要是為了標(biāo)識此次HTTP請求的運(yùn)行狀態(tài),狀態(tài)碼由3位十進(jìn)制數(shù)字組成,第一個數(shù)字定義了響應(yīng)的類別。100:客戶端應(yīng)當(dāng)繼續(xù)發(fā)送請求;200:請求成功;
400:語義或者請求參數(shù)有誤;500:服務(wù)器內(nèi)部錯誤。13.3爬蟲基礎(chǔ)
3.requests庫requests庫是一個簡單而優(yōu)雅的HTTP庫,它不是Python的標(biāo)準(zhǔn)庫,需要安裝,requests實現(xiàn)HTTP請求非常簡單,操作更加人性化。
1)requests庫的請求方法使用requests庫發(fā)送HTTP請求非常簡單,使用get()方法或者post()方法就可以完成,同時把獲取的響應(yīng)對象賦值給response。>>>importrequests>>>response=requests.get("/")13.3爬蟲基礎(chǔ)2)requests庫的響應(yīng)對象使用requests請求方法后,系統(tǒng)會返回一個響應(yīng)(response)對象,它存儲了服務(wù)器響應(yīng)的內(nèi)容,可以使用response對象的text屬性獲取文本形式的響應(yīng)內(nèi)容。Requests會自動解碼來自服務(wù)器的響應(yīng)內(nèi)容,大多數(shù)unicode字符集都能被無縫地解碼??梢允褂胷esponse.encoding查看編碼方式,也可以修改response.encoding屬性來讓response.text使用其它編碼進(jìn)行解碼,如果編碼方式不對,會導(dǎo)致response.text輸出亂碼。13.3爬蟲基礎(chǔ)3)定制請求頭部服務(wù)器通過讀取請求頭部的用戶代理信息,來判斷這個請求是正常的瀏覽器發(fā)出的還是爬蟲系統(tǒng)的。因此,需要為請求添加HTTP頭部來偽裝成正常的瀏覽器。解決的方式是構(gòu)造一個用戶代理的字典給請求頭部就可以了(可以抓取瀏覽器發(fā)送的用戶代理信息來填寫)。4)傳遞URL參數(shù)很多時候,網(wǎng)站會通過URL的查詢字符串傳遞某種數(shù)據(jù)。Requests的get()方法允許使用params關(guān)鍵字參數(shù),post()方法使用data關(guān)鍵字參數(shù),以一個字符串字典來提供這些參數(shù)。>>>postdata={"key":"python","act":"input"}>>>response=requests.post("/",data=postdata)13.4網(wǎng)頁解析基礎(chǔ)13.4網(wǎng)頁解析基礎(chǔ)
1.HTML簡介HTML是一種表示網(wǎng)頁信息的符號標(biāo)記語言,HTML使用標(biāo)記標(biāo)簽來描述網(wǎng)頁。WEB瀏覽器的作用是讀取HTML文檔,并以網(wǎng)頁的形式顯示出它們。瀏覽器不會顯示HTML標(biāo)簽,而是使用標(biāo)簽來解釋網(wǎng)頁的內(nèi)容。網(wǎng)頁由若干個HTML定義的標(biāo)簽組成,標(biāo)簽分為嵌套和非嵌套兩類,嵌套格式為<標(biāo)簽>...</標(biāo)簽>,非嵌套僅有<標(biāo)簽>。此外,根據(jù)標(biāo)簽的不同,有的標(biāo)簽可以附帶有屬性參數(shù),表示為:<標(biāo)簽屬性="參數(shù)值">13.4網(wǎng)頁解析基礎(chǔ)1)HTML基本結(jié)構(gòu)<html>內(nèi)容</html>:稱為HTML開始標(biāo)簽,其內(nèi)容描述整個網(wǎng)頁<head>內(nèi)容</head>:HTML文件頭標(biāo)簽<title>內(nèi)容</title>:HTML文件標(biāo)題標(biāo)簽,顯示在瀏覽器窗口的左上角<body>內(nèi)容</body>:網(wǎng)頁的主題部分,也就是瀏覽器窗口中可以出現(xiàn)的所有信息。<meta>內(nèi)容</meta>:提供有關(guān)頁面的元信息2)文檔設(shè)置標(biāo)簽文檔設(shè)置標(biāo)簽分為格式標(biāo)簽和文本標(biāo)簽。<p>:段落標(biāo)簽<center>:居中對齊標(biāo)簽<pre>:預(yù)格式化標(biāo)簽。保留預(yù)先編排好的格式<ul>、<ol>、<li>:ul標(biāo)簽創(chuàng)建無序列表,ol標(biāo)簽創(chuàng)建有序列表,li標(biāo)簽創(chuàng)建其中的列表項<hr>:水平分割線標(biāo)簽<div>:分區(qū)顯示標(biāo)簽,也稱為層標(biāo)簽。常用來編排一大段HTML段落13.4網(wǎng)頁解析基礎(chǔ)13.4網(wǎng)頁解析基礎(chǔ)<h*>:標(biāo)題標(biāo)簽,共有6個級別,*的范圍為1~6。不同級別對應(yīng)不同顯示大小的標(biāo)題,h1最大,h6最小<font>:字體設(shè)置標(biāo)簽,用來設(shè)置字體的格式,一般有3個常用屬性:size、color和face,分別用來設(shè)置字體大小、字體顏色和字體。
3)圖像標(biāo)簽<img>稱為圖像標(biāo)簽,用來在網(wǎng)頁中顯示圖像。使用方法為:<imgsrc="路徑/文件名"width="屬性值"height="屬性值"border="屬性值"alt="屬性值">。4)超鏈接爬蟲開發(fā)中經(jīng)常需要抽取鏈接,鏈接的引用使用的是<a>標(biāo)簽,使用方法為:<ahref="鏈接地址"target="打開方式"name="頁面錨點名稱">鏈接文字或者圖片</a>
5)表格表格的基本結(jié)構(gòu)包括<table>、<caption>、<tr>、<td>和<th>等標(biāo)簽。<caption>標(biāo)簽用于在表格中使用標(biāo)題,位于<table>之后,<tr>表格行之前。<tr>標(biāo)簽用來定義表格的行,對于表格的每一行,都是由一對<tr>...</tr>標(biāo)簽表示,每一行<tr>標(biāo)簽內(nèi)可以嵌套多個<td>或者<th>標(biāo)簽。13.4網(wǎng)頁解析基礎(chǔ)13.4網(wǎng)頁解析基礎(chǔ)
2.XPath簡介XPath是一門在XML文檔中查找信息的語言,被用于在XML文檔中通過元素和屬性進(jìn)行導(dǎo)航。XPath雖然是被設(shè)計用來搜索XML文檔,不過它也能很好地在HTML文檔中工作,并且大多數(shù)瀏覽器也支持通過XPath來查詢節(jié)點。在Python爬蟲開發(fā)中,經(jīng)常使用XPath查找提取網(wǎng)頁中的信息,因此XPath非常重要。XPath是以路徑表達(dá)式的形式來指定元素,這些路徑表達(dá)式和我們在常規(guī)的電腦文件系統(tǒng)中看到的表達(dá)式非常相似。13.4網(wǎng)頁解析基礎(chǔ)1)XPath語法XPath使用路徑表達(dá)式來選取XML文檔中的節(jié)點或者節(jié)點集。節(jié)點是沿著路徑或者步來選取的。一個路徑表達(dá)式包括一系列的步,步和步之間用“/”或“//”分隔。表達(dá)式含義nodename選取此節(jié)點的所有子節(jié)點/從根節(jié)點選取//選擇任意位置的某個節(jié)點.選取當(dāng)前節(jié)點..選取當(dāng)前節(jié)點的父節(jié)點@選取屬性13.4網(wǎng)頁解析基礎(chǔ)要求路徑表達(dá)式選取bookstore元素的所有子節(jié)點bookstore選取根元素bookstore/bookstore選取屬于bookstore的子元素的所有book元素bookstore/book選取所有book子元素,而不管它們在文檔中的位置//book選取屬于bookstore元素后代的所有book元素bookstore//book選取名為lang的所有屬性//@lang13.4網(wǎng)頁解析基礎(chǔ)要求路徑表達(dá)式選取屬于bookstore子元素的第1個book元素//bookstore/book[1]選取屬于bookstore子元素的最后一個book元素//bookstore/book[last()]選取屬于bookstore子元素的倒數(shù)第2個book元素//bookstore/book[last()-1]選取最前面的2個屬于bookstore元素的子元素的book元素//bookstore/book[position()<3]選取所有擁有名為lang的屬性的author元素//author[@lang]選取所有author元素,且這些元素?fù)碛兄禐閑n的lang屬性//author[@lang='en']選取bookstore元素的所有book元素,且其中的price元素的值大于30//bookstore/book[price>30]選取bookstore元素中book元素的所有author元素,且其中pric元素的值大于30//bookstore/book[price>30]/author13.4網(wǎng)頁解析基礎(chǔ)
3.正則表達(dá)式正則表達(dá)式是由普通字符以及特殊字符(稱為元字符)組成的文字模式。模式用于描述在搜索文本時要匹配的一個或多個字符串。正則表達(dá)式作為一個模板,將某個字符模式與所搜索的字符串進(jìn)行匹配。正則表達(dá)式的測試工具RegexMatchTracer,該工具可以將寫的正則表達(dá)式生成樹狀結(jié)構(gòu),描述并高亮每一部分的語法,還可以檢查正則表達(dá)式寫的是否正確。13.4網(wǎng)頁解析基礎(chǔ)
1)元字符元字符有4種作用:匹配字符、匹配位置、匹配數(shù)量、匹配模式。元字符含義.匹配除了換行符以外的任意一個字符\b匹配單詞的開始或結(jié)束\d匹配任意一個數(shù)字\w匹配一個字母、數(shù)字、下劃線或漢字\s匹配任意空白符、包括空格、制表符、換行符、中文空格等^匹配字符串的開始$匹配字符串的結(jié)束13.4網(wǎng)頁解析基礎(chǔ)
匹配s100這樣的字符串(不是單詞),正則表達(dá)式可以寫成:^s\d*$;匹配一段文字“wearestandingshoulderofgiants”中所有以s開頭的單詞,正則表達(dá)式為:\bs\w*\b。
2)字符轉(zhuǎn)義如果要查找元字符本身的話,比如要查找“.”或者“*”就會出現(xiàn)問題,這個時候就要用到轉(zhuǎn)義,使用“\”來取消這些字符的特殊意義。例如,匹配這個網(wǎng)址時,正則表達(dá)式可以寫成www\.google\.com。13.4網(wǎng)頁解析基礎(chǔ)
3)界定符界定符用來指定重復(fù)的數(shù)量。界定符含義*重復(fù)0次或者多次+重復(fù)1次或者多次?重復(fù)0次或者1次{n}重復(fù)n次{n,}重復(fù)n次或者多次{n,m}重復(fù)n到m次13.4網(wǎng)頁解析基礎(chǔ)4).字符集合如果要匹配a、b、c、d中任意一個字符,這時就需要自定義字符結(jié)合。正則表達(dá)式是通過[]來實現(xiàn)自定義字符集合的。[abcd]表示匹配abcd中的任意一個字符,[a-d]表示匹配a到d的任意字符。
5).分支條件正則表達(dá)式例的分支條件指的是有幾種匹配規(guī)則,如果滿足其中任意一種規(guī)則都應(yīng)該當(dāng)成匹配,具體方法使用“|”把不同的規(guī)則分開。例如匹配固定電話號碼,正則表達(dá)式可以寫成:^0\d{2}-\d{8}|^0\d{3}-\d{7}。13.4網(wǎng)頁解析基礎(chǔ)6).分組使用小括號()指定一個表達(dá)式就可以看作一個分組,默認(rèn)情況下,每個分組會自動擁有一個組號,按照從左到右開始編號,第一個出現(xiàn)的分組的組號為1。例如匹配IP地址的正則表達(dá)式:((25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.){3}((25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d))。
7).反義有時需要查找除某一類字符集合之外的字符,這時就需要用到反義符號含義\W匹配任意不是字母、數(shù)字、下劃線、漢字的字符\S匹配任意不是空白字符的字符\D匹配任意非數(shù)字的字符\B匹配不是單詞開頭或者結(jié)束的位置[^abcd]匹配除了a、b、c、d以外的任意字符[^(123|abc)]匹配除了1、2、3或a、b、c這幾個字符以外的任意字符13.4網(wǎng)頁解析基礎(chǔ)13.4網(wǎng)頁解析基礎(chǔ)8).Python與正則表達(dá)式pile()方法將一個正則表達(dá)式的字符串轉(zhuǎn)化為Pattern匹配對象。re.match(pattern,string,flags)這個函數(shù)從輸入?yún)?shù)string的開頭開始,嘗試匹配pattern,如果遇到無法匹配的字符或者已經(jīng)到達(dá)string的末尾,立即返回None,反之獲得匹配結(jié)果。re.search(pattern,string,flags)search()和match()極為相似,區(qū)別在于match()只從string的開始位置匹配,search()會掃描整個string查找匹配。match()只有在string的起始位置匹配成功的時候才有返回,如果不是開始位置匹配成功的話,match()就返回None。13.4網(wǎng)頁解析基礎(chǔ)re.split(pattern,string,maxsplit)按照能夠匹配的子串將string進(jìn)行分割后返回列表,maxsplit用于指定分割次數(shù),不指定時將全部分割。re.findall(pattern,string,flags)搜索整個string,以列表形式返回能匹配的全部子串。>>>importre>>>pattern=pile(r"\d+")>>>text="abc123abcd456">>>result=re.match(pattern,text)>>>print("re.match():",result.group())ifresult!=Noneelseprint("re.match():None")
re.match():None>>>result=re.search(pattern,text)>>>print("re.search():",result.group())re.search():123>>>print("re.split():",re.split(pattern,text))re.split():['abc','abcd','']>>>print("re.findall():",re.findall(pattern,text))re.findall():['123','456']13.4網(wǎng)頁解析基礎(chǔ)13.5BeautifulSoup庫使用13.5BeautifulSoup庫使用BeautifulSoup是一個可以從HTML或XML文件中提取數(shù)據(jù)的Python擴(kuò)展庫。在Python爬蟲開發(fā)中,我們主要用到的是BeautifulSoup的查找功能。對于BeautifulSoup,推薦使用的是BeautifulSoup4,它已經(jīng)移植到bs4。
BeautifulSoup支持Python標(biāo)準(zhǔn)庫中HTML解析器,還支持一些第三方的解析器,其中一個是lxml。由于lxml解析速度比標(biāo)準(zhǔn)庫中的HTML解析器的速度快得多,我們選擇安裝lxml作為新的解析器。所以使用前請先安裝beautifulsoup4和lxml擴(kuò)展庫。13.5BeautifulSoup庫使用importrequestsfrombs4importBeautifulSoup#導(dǎo)入bs庫
url='/year?year=2018'#訪問的URLrawhtml=requests.get(url).text#創(chuàng)建HTML字符串#使用BeautifulSoup的構(gòu)造方法,第一個參數(shù)為要處理的HTML文檔,第二個##參數(shù)時解析器soup=BeautifulSoup(rawhtml,'lxml')#創(chuàng)建bs對象13.5BeautifulSoup庫使用BeautifulSoup支持大部分的CSS選擇器
,在Tag或BeautifulSoup對象的.select()方法中傳入字符串參數(shù),即可使用CSS選擇器的語法找到tag,返回值為列表。(1)選擇Tag標(biāo)簽soup.select("title")#選擇title標(biāo)簽soup.select("pa")#選擇p標(biāo)簽內(nèi)部的所有a標(biāo)簽,屬于標(biāo)簽逐層查找(2)通過Tag的類名查找soup.select(".sister")#查找class="sister"的所有標(biāo)簽soup.select("[class~=sister]") #查找class="sister"的所有標(biāo)簽13.5BeautifulSoup庫使用(3)通過Tag的id查找soup.select("a#link1") #查找所有a標(biāo)簽中滿足id="link1"的標(biāo)簽(4)選擇直接子標(biāo)簽soup.select("head>title") #選擇父標(biāo)簽為head的所有title標(biāo)簽soup.select("p>#link1") #選擇父標(biāo)簽p中id="link1"的標(biāo)簽(5)通過屬性來查找soup.select('a[href]') #選擇帶有href屬性的所有a標(biāo)簽(6)通過屬性的值來查找soup.select('a[href^="/"]')#選擇href屬性值以開頭/的所有a標(biāo)簽soup.select('a[href$="tillie"]') #選擇href屬性值以tillie作為結(jié)尾的所有a標(biāo)簽soup.select('a[href*=".com/el"]') #選擇href屬性值含有.com/el的所有a標(biāo)簽13.6lxml庫使用
13.6lxml庫使用lxml大部分功能都存在lxml.etree中,使用前需要自行安裝。
1.基本用法
lxml采用XPath語法來對元素進(jìn)行定位。使用前需要使用HTML源碼初始化etree,然后對返回的Element對象使用XPath篩選,系統(tǒng)就會返回一個篩選的結(jié)果列表。13.6lxml庫使用1)通過路徑查找元素>>>all_a=selector.xpath("http://p/a") #查找所有的a標(biāo)簽>>>print(all_a)#如果查到,則返回一個類型是Element的列表,反之,返回空列表[<Elementaat0x6a5f448>,<Elementaat0x6a5f7c8>,<Elementaat0x6a5f708>]>>>a_1=selector.xpath("http://p/a[1]")#XPath語法中的序號從1開始,表示查找第1個>>>print(a_1)[<Elementaat0x6a5f448>]如果要提取標(biāo)簽的文本,可以在路徑中使用text()方法來獲取文本信息。>>>all_a_text=selector.xpath("http://p/a/text()")>>>print(all_a_text)['Elsie','Lacie','Tillie']13.6lxml庫使用13.6lxml庫使用
2.通過屬性查找元素利用屬性來定位元素要使用類似[@屬性="值"]這種形式。>>>selector.xpath("http://p/a[@href='/tillie']")<Elementaat0x72c7288>]>>>selector.xpath('//*/a[@href="/tillie"]/text()')
['Tillie']>>>selector.xpath('//*/a[@href="/tillie"]/text()')[0] 'Tillie'13.6lxml庫使用3.提取屬性值提取屬性值就是要提取每個標(biāo)簽里的某個屬性的值。>>>selector.xpath("http://p/a[3]/@id") #提取第3個a標(biāo)簽的id屬性['link3']>>>selector.xpath("http://p/a[3]/attribute::*") #提取第3個a標(biāo)簽的所有屬性['/tillie','sister','link3']13.6lxml庫使用
下面以爬取北京交通委員會網(wǎng)站的“實時交通指數(shù)”數(shù)據(jù)為例,講解lxml擴(kuò)展庫的使用,該數(shù)據(jù)每5分鐘更新一次。
1.獲取目標(biāo)網(wǎng)頁內(nèi)容通過requests.get()發(fā)送HTTP請求,使用response.text獲取服務(wù)器響應(yīng)信息,使用lxml.etree初始化響應(yīng)信息。
2.網(wǎng)頁內(nèi)容解析通過查看網(wǎng)頁源代碼,發(fā)現(xiàn)所有的信息位于<tableclass="qyzs_table">下面的<trclass="qyzs_bg1">里面的<td>標(biāo)簽的文本內(nèi)容中。提取數(shù)據(jù)時根據(jù)實際需要可以對數(shù)據(jù)做適當(dāng)?shù)霓D(zhuǎn)換。3.獲取信息存儲到文件提取的有價值數(shù)據(jù)為了永久保存,可以存儲到文件中。defspider():
url="/uservice/app/congestion/serviceCongestion"
response=requests.get(url) #發(fā)送HTTP請求
response.encoding="utf-8" #設(shè)置編碼方案
selector=etree.HTML(response.text)#初始化源碼
col_name=selector.xpath('//table[@class="qyzs_table"]/tr/th/text()') #解析列名數(shù)據(jù)rows=selector.xpath('//table[@class="qyzs_table"]/tr')#解析交通數(shù)據(jù)dist_name=[row.xpath(".//td[1]/text()")[0]forrowinrows[1:]]#區(qū)域名稱數(shù)據(jù)index_name=[float(row.xpath(".//td[2]/text()")[0])forrowinrows[1:]]#交通指數(shù)grade_name=[row.xpath(".//td[3]/text()")[0]forrowinrows[1:]] #擁堵等級數(shù)據(jù)speed=[float(row.xpath(".//td[4]/text()")[0])forrowinrows[1:]] #平均速度數(shù)據(jù)title=selector.xpath('//div[@class="jtzs3_t1"]/text()')[0]#解析時間段數(shù)據(jù)sheet_name=title.strip().split("\xa0\xa0\xa0\xa0")[0].replace(":","點")#轉(zhuǎn)換時間段數(shù)據(jù)data=(col_name,dist_name,index_name,grade_name,speed,sheet_name)writer_data(*(data))defwriter_data(col_name,dist_name,index_name,grade_name,speed,sheet_name):df=pd.DataFrame({col_name[0]:dist_name,col_name[1]:index_name,col_name[2]:grade_name,col_name[3]:speed})df.to_excel("./data/traffic-BJ.xls",sheet_name,index=False)#定義主函數(shù),完成對其它函數(shù)的調(diào)用,該函數(shù)只能獨立運(yùn)行,不能以模塊身份運(yùn)行defmain():if__name__=="__main__":spider()#調(diào)用主函數(shù),完成爬蟲任務(wù)main()13.7scrapy爬蟲框架13.7scrapy爬蟲框架Scrapy爬蟲框架是Python中最著名、最受歡迎、社區(qū)最為活躍的爬蟲框架。它是一個相對成熟的框架,有著豐富的文檔和開放的社區(qū)交流空間。Scrapy爬蟲框架是人們?yōu)榱伺廊【W(wǎng)站數(shù)據(jù)、提取結(jié)構(gòu)化數(shù)據(jù)而編寫的。
在Python下直接安裝:pipinstallscrapy-i/simple/,這條命令使用了豆瓣為人們在國內(nèi)提供的源來安裝,下載速度非???。安裝完成后需要將scrapy的安裝目錄添加到系統(tǒng)環(huán)境變量中。安裝完成后,在cmd下執(zhí)行“scrapyversion”,如果成功,則會顯示scrapy版本號,這就代表安裝好了。13.7scrapy爬蟲框架
2.scrapy爬蟲步驟本機(jī)以爬取“瓜子二手車”網(wǎng)站的二手車信息為例,介紹scrapy爬蟲步驟。1).創(chuàng)建爬蟲項目
cd\sp
現(xiàn)在可以使用如下命令來創(chuàng)建第1個scrapy項目:
scrapystartprojectSPguazi13.7scrapy爬蟲框架(1)scrapy.cfg是scrapy項目的配置文件,一般不用設(shè)置。所在目錄為項目根目錄。(2)items.py是保存爬取到數(shù)據(jù)的容器。要爬取的數(shù)據(jù),就在這個文件中定義。(3)pipelines.py處理已經(jīng)爬取到的數(shù)據(jù)。例如,要把爬取的item去重或者保存到數(shù)據(jù)庫中,就要在這個文件中定義。(4)middlewares.py是中間件文件,主要用來發(fā)出請求、收到響應(yīng)或者spider做全局性的自定義設(shè)置。(5)settings.py是scrapy爬蟲框架的設(shè)置文件。(6)spiders目錄用于存放編寫的爬蟲代碼,爬蟲的主要邏輯在這里面定義,可以在這個文件夾里定義多個爬蟲。目前,這個文件夾里面還沒有爬蟲文件,因為還沒有生成爬蟲文件。13.7scrapy爬蟲框架3.創(chuàng)建爬蟲文件接著執(zhí)行如下命令:cdSPguazi #進(jìn)入項目目錄
scrapygenspiderguazi #生成爬蟲文件執(zhí)行完scrapygenspider命令后會在項目的spider目錄下生成一個名稱為guazi.py的爬蟲文件。其中g(shù)uazi是為這個爬蟲起的名字,是這個爬蟲要爬取的域名。13.7scrapy爬蟲框架4.修改items.py文件,定義要爬取的內(nèi)容。5.修改爬蟲文件guazi.py,定義如何爬取內(nèi)容。6.修改pipelines.py文件,將爬取到的數(shù)據(jù)進(jìn)行存儲(文件或者數(shù)據(jù)庫)。7.運(yùn)行爬蟲,scrapycrawlguazi。13.7scrapy爬蟲框架items.py是用于定義爬取數(shù)據(jù)的容器,定義了要爬取那些字段。這里提取4個字段數(shù)據(jù):汽車名、日期、公里數(shù)、價格。修改后的items.py文件內(nèi)容如下:importscrapyclassSpguaziItem(scrapy.Item):name=scrapy.Field() #定義要爬取的字段名 year=scrapy.Field() kilo=scrapy.Field() price=scrapy.Field()13.7scrapy爬蟲框架
當(dāng)啟動scrapy爬蟲時,框架默認(rèn)會直接爬取start_urls(字符串列表)中的網(wǎng)址。只有在登錄情況下,才能正常爬取網(wǎng)站。如果不希望爬蟲系統(tǒng)在啟動時就直接爬取start_urls中的網(wǎng)址,這個時候就需要重寫start_requests()方法。該方法必須返回一個可迭代的對象,同時可以在方法中指定回調(diào)函數(shù),所謂回調(diào)函數(shù),就是在用戶發(fā)起請求的時候,指定用來執(zhí)行后續(xù)解析的函數(shù)。編寫解析方法(默認(rèn)是parse())時,首先要把前面items.py中定義的items類導(dǎo)入進(jìn)來。然后編寫提取元素的代碼,提取出來序列化數(shù)據(jù)需要使用extract()轉(zhuǎn)化為unicode字符串。如果要提取第1個匹配的元素,可以使用切片的方法extract()[0],也可以使用extract_first()來提取。importscrapyfromSPguazi.itemsimportSpguaziItem#將前面定義的數(shù)據(jù)字段所在的items類導(dǎo)入classGuaziSpider(scrapy.S
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 鎮(zhèn)江環(huán)氧坡道地坪施工方案
- 安徽中考初三數(shù)學(xué)試卷
- 銅板幕墻施工方案
- 大理石電視墻金屬施工方案
- 五指山綠化排水板施工方案
- 嘉定區(qū)空調(diào)清洗施工方案
- 2025北京西城八年級(上)期末生物(教師版)
- 小區(qū)水電維修服務(wù)施工方案
- ?;髽I(yè)安全文化建設(shè)方案
- 推動醫(yī)務(wù)人員隊伍建設(shè)的策略及實施路徑
- 中藥玫瑰花培訓(xùn)
- 廣東省佛山市(2024年-2025年小學(xué)六年級語文)統(tǒng)編版小升初真題((上下)學(xué)期)試卷及答案
- 2025年吉林通化梅河新區(qū)(梅河口市)專項引進(jìn)高層次教育人才40人高頻重點提升(共500題)附帶答案詳解
- 湖北日報傳媒集團(tuán)(湖北日報社)招聘筆試沖刺題2025
- 危險性較大工程培訓(xùn)課件
- 建筑施工安全員述職
- 開封市第二屆職業(yè)技能大賽無人機(jī)裝調(diào)檢修項目技術(shù)文件(國賽項目)
- 2024解析:第九章固體壓強(qiáng)-基礎(chǔ)練(解析版)
- 【MOOC】人工智能與信息社會-北京大學(xué) 中國大學(xué)慕課MOOC答案
- 移動式升降平臺安全指導(dǎo)手冊
- 人美版六年級美術(shù)教案下冊全冊
評論
0/150
提交評論