網(wǎng)頁(yè)代碼
網(wǎng)站打開(kāi)速率慢的緣由,排查方式及優(yōu)化方式
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 312 次瀏覽 ? 2020-07-26 08:01
排查網(wǎng)站打開(kāi)速率慢的緣由:
1 網(wǎng)站服務(wù)器速率或租用空間所在服務(wù)器速率
服務(wù)器空間速率是網(wǎng)站打開(kāi)速率快的硬件基礎,也是先決條件。否則縱使你網(wǎng)站頁(yè)面設計的特別"苗條",網(wǎng)站打開(kāi)速率也會(huì )打折扣。解決辦法:要找你的空間商解決或換空間商。
如何測量服務(wù)器速率快慢呢?
方法一: ping命令看聯(lián)接到服務(wù)器的時(shí)間和丟包情況。
1>單擊“開(kāi)始”鍵并選擇運行;接著(zhù)在“運行”對話(huà)框中輸入cmd
注:有的可能是輸入command,也有可能有的windows不帶DOS系統。
2>鍵入Ping和您要測試的網(wǎng)址(比如:Ping -t)。然后回車(chē),便得到你訪(fǎng)問(wèn)服務(wù)器的回時(shí)間。
一般,“PING”命令會(huì )手動(dòng)進(jìn)行下去,直到你使它中止,如敲“ctrl +C”。如果你熟悉使用Telnet中PING的功能,并且你具有在不同網(wǎng)路上的Telnet賬號,你就可以以不同的網(wǎng)路為基礎,對其他的主機(IP地址或域名)進(jìn)行PING的測試,你可以比較在不同的訪(fǎng)問(wèn)點(diǎn)那些被訪(fǎng)問(wèn)主機的回應時(shí)間,并得到“丟包率”、平均回應時(shí)間等測試結果。
time:顯示了信息包抵達遠程主機后返回的時(shí)間。計算定位為微秒。數值越小速率越快。
lost:丟包情況。
TTL:生存時(shí)間 指定數據包被路由器遺棄之前容許通過(guò)的網(wǎng)關(guān)數目。
一個(gè)速率好的機房,首先丟包率不能超過(guò)1%,最好是1000個(gè)沒(méi)有一個(gè)丟包,這種是最理想的,但是這個(gè)不是絕對值,只要高于1%的都屬于不錯的路由情況了。
其次ping值要小,同城的聯(lián)通adsl ping平均值絕對不能超過(guò)20,一般在10,跨省的adsl ping平均值應當在20-40屬于正常。
第三點(diǎn)是ping值要均勻,如果最小的ping值只有4,但是不時(shí)的有幾十,最大有79的出現,這個(gè)就是路由不穩定的表現,同樣的聯(lián)通的adsl,盡管最小也有8,但是最大也只有9,就說(shuō)明路由穩定。
方法二: 查看登臺服務(wù)器上其它網(wǎng)站的打開(kāi)速率。
相同IP地址站點(diǎn)查詢(xún)網(wǎng)址:
通過(guò)前面的查詢(xún)工具可以看見(jiàn)和自已在同一臺服務(wù)器上的網(wǎng)站個(gè)數和網(wǎng)址??梢郧魄破渌W(wǎng)站是否打開(kāi)也慢呢。
2 電信和移動(dòng)互訪(fǎng)困局問(wèn)題。
如果空間打開(kāi)的速率時(shí)快時(shí)慢,甚至有時(shí)候打不開(kāi),那就是空間不穩定的誘因。要找你的空間商解決或換空間商了;如果是在有的地方打開(kāi)速率快,有的地方打開(kāi)速率慢,那應當是網(wǎng)路線(xiàn)路的問(wèn)題。電信線(xiàn)路用戶(hù)訪(fǎng)問(wèn)放到移動(dòng)服務(wù)器的網(wǎng)站,聯(lián)通線(xiàn)路用戶(hù)訪(fǎng)問(wèn)置于聯(lián)通服務(wù)器上的網(wǎng)站,相對來(lái)說(shuō)打開(kāi)速率肯定是比較慢。
解決辦法:如果選購空間的話(huà),建議訂購雙線(xiàn)空間或多線(xiàn)空間。這已不是新鮮的概念,大部分的虛擬主機商都有兩線(xiàn)或多線(xiàn)空間,價(jià)格高一些,但是從用戶(hù)體驗角度來(lái)說(shuō)是物有所值的。
3 從網(wǎng)站本身找問(wèn)題,網(wǎng)站的問(wèn)題包括網(wǎng)站程序設計,網(wǎng)頁(yè)設計結構,網(wǎng)頁(yè)內容三個(gè)部份。
網(wǎng)站程序設計:
1>網(wǎng)頁(yè)中若果有幻燈片播放療效的代碼,需要審查一下,是否嚴重拖慢網(wǎng)站打開(kāi)速率。
2>如果排除各方面緣由,可以找搞程序設計的相關(guān)專(zhuān)業(yè)人士,查看程序的設計結構是否合理。
網(wǎng)頁(yè)設計結構:
1>如果是table布局的網(wǎng)站,查看是否嵌套次數多很,或是一個(gè)大表格之后分成多個(gè)表格這樣的網(wǎng)頁(yè)布局。解決辦法:建議用div布局,配合css ,這樣除了打開(kāi)速率快,也有利于更改。
2>如果網(wǎng)站中有統計代碼,在線(xiàn)客服或是其它js代碼,看看是否放在了網(wǎng)頁(yè)代碼的最前面。解決辦法:最好盡可能的放在網(wǎng)頁(yè)代碼最后,當網(wǎng)站代碼加載完畢,才執行這種代碼。
3>可能有錯誤的代碼
一種情況是查看一下網(wǎng)頁(yè)代碼是否有不存在的圖片或文件路徑代碼。(如上圖所示用firebug聽(tīng)到20.jpg這個(gè)圖片,紅色顯示表示實(shí)際不存在,代碼中有調用它的代碼)因為本身圖片在空間中不存在,可是在執行代碼的時(shí)侯網(wǎng)站打開(kāi)速度慢 如何優(yōu)化,執行到這一行時(shí),卻要始終加載這個(gè)圖片,在細微程度上是會(huì )影響到網(wǎng)站的速率的。
另一種情況是從別的網(wǎng)站轉抄的特效javascript代碼,可能轉載不全,有許多網(wǎng)頁(yè)錯誤,造成網(wǎng)站打開(kāi)速率慢。解決辦法:修正網(wǎng)站上代碼錯誤。
4>盡量減低javascript的特效的使用。
如:鼠標特效、欄目特效、狀態(tài)欄特效等,這些特效的原理是先由服務(wù)器下載到你本地的機器,然后在本地機器上運行形成,如果觀(guān)看你網(wǎng)站的網(wǎng)友機器配置低的話(huà),要運行一段時(shí)間就能完成。
網(wǎng)頁(yè)內容:
1>查看網(wǎng)頁(yè)中是否有許多規格大的圖片存在,如果非要圖片療效來(lái)抒發(fā)的話(huà),可以把大圖片切分成多個(gè)小圖片。圖片進(jìn)行減重處理,可以讓字節數顯得較小,否則好多的圖片會(huì )占用好多空間又讓網(wǎng)站打開(kāi)速率顯得太慢??梢杂胮hotoshop、fireworks等畫(huà)圖軟件將圖片規格縮小,使圖片的質(zhì)量稍為減少一下,在圖片質(zhì)量和圖片大小之間找尋一個(gè)最佳的比列。
2>查看網(wǎng)頁(yè)中是否有規格大的flash文件存在,排除抒發(fā)療效外,盡量少用小型flash。
3>有的同學(xué)喜歡在網(wǎng)頁(yè)中加音樂(lè ),用戶(hù)一打開(kāi)網(wǎng)站,就有背景音樂(lè )播放,這樣的事情盡量不要做。
4>內容中過(guò)多地引用了其它網(wǎng)站的內容。如引用其他網(wǎng)站的圖片或其它內容,如果哪個(gè)網(wǎng)站的速率慢,或者那種網(wǎng)站的頁(yè)面早已不存在了,打開(kāi)的速率都會(huì )更慢。解決辦法:這樣問(wèn)題常見(jiàn)的情況是,友情鏈接交換中圖片鏈接真接鏈接別的網(wǎng)站的logo圖片,建議先把對方的logo圖片上傳到自已的網(wǎng)站空間中,然后加上鏈接。第二種情況是許多同學(xué)喜歡用iframe嵌套別的網(wǎng)站上的搜索,查ip等小功能模塊,建議少用這些方法。
查看網(wǎng)站中圖片、代碼等加載情況可以用 firefox瀏覽器的插件工具firebug 工具查看。
優(yōu)化加載速率的方式:
一、優(yōu)化圖片
幾乎沒(méi)有那個(gè)網(wǎng)頁(yè)上是沒(méi)有圖片的。如果你經(jīng)歷過(guò)56K狗的年代,你一定不會(huì )很喜歡有大量圖片的網(wǎng)站。因為加載那樣一個(gè)網(wǎng)頁(yè)會(huì )耗費大量的時(shí)間。
即使在現今,網(wǎng)絡(luò )帶寬有了好多的提升,56K狗漸漸淡出,優(yōu)化圖片以推動(dòng)網(wǎng)頁(yè)速率還是太有必要的。
優(yōu)化圖片包括降低圖片數、降低圖象質(zhì)量、使用恰當的格式。
1、減少圖片數:去除不必要的圖片。
2、降低圖象質(zhì)量:如果不是太必要,嘗試減少圖象的質(zhì)量,尤其是jpg格式,降低5%的質(zhì)量看起來(lái)變化不是很大,但文大小的變化是比較大的。
3、常識使用腳本文件取代療效:
比如一些web2.0的款式,如果使用ps制做,每個(gè)圖片基本會(huì )降低%5-%25的大小成本.
相反,使用javascript代碼來(lái)實(shí)現療效,僅僅只降低幾個(gè)字節.
二、圖像格式的選擇
一般在網(wǎng)頁(yè)上使用的圖片格式有三種,jpg、png、gif。三種格式的具體技術(shù)指標不是這篇文章探討的內容,我們只須要曉得在哪些時(shí)侯應當使用哪些格式,以降低網(wǎng)頁(yè)的加載時(shí)間。
1、JPG:一般用于展示景色、人物、藝術(shù)照的攝影作品。有時(shí)也用在筆記本截屏上。
2、GIF:提供的顏色較少,可用在一些對顏色要求不高的地方,比如網(wǎng)站logo、按鈕、表情等等。當然,gif的一個(gè)重要的應用是動(dòng)漫圖片。
3、PNG:PNG格式能提供透明背景,是一種專(zhuān)為網(wǎng)頁(yè)展示而發(fā)明的圖片格式。一般用于須要背景透明顯示或對圖象質(zhì)量要求較高的網(wǎng)頁(yè)上。
三、優(yōu)化CSS
CSS疊層樣式表使網(wǎng)頁(yè)加載上去更高效,瀏覽體驗也得到增強。有了CSS,表格布局的形式可以退職了。
但有時(shí)我們在寫(xiě)CSS的時(shí)侯會(huì )使用了一些比較羅嗦的句子,比如這句:
復制內容到剪貼板
代碼:
margin-top: 10px;
margin-right: 20px;
margin-bottom: 10px;
margin-left: 20px;
你可以將它簡(jiǎn)化為:
margin: 10px 20px 10px 20px;
又或則這句:
A paragraph ofdecorated text
Secondparagraph
Thirdparagraph
Forthparagraph
可以用div來(lái)包含:
A paragraph of decoratedtext
Secondparagraph
Thirdparagraph
Forthparagraph
四、網(wǎng)址后加斜杠
有些網(wǎng)址,比如當服務(wù)器收到這樣一個(gè)地址懇求的時(shí)侯,它須要耗費時(shí)間去確定這個(gè)地址的文件類(lèi)型。如果220是一個(gè)目錄,不妨在網(wǎng)址后多加一個(gè)斜杠,讓其弄成,這樣服務(wù)器才能一目了然地曉得要訪(fǎng)問(wèn)該目錄下的index或default文件,從而節約了加載時(shí)間。
五、標明高度和長(cháng)度
這點(diǎn)很重要,但很多人因為懶惰或其它緣由,總是將其忽略。當你在網(wǎng)頁(yè)上添加圖片或表格時(shí),你應當指定它們的高度和長(cháng)度,也就是height和width參數。如果瀏覽器沒(méi)有找到這兩個(gè)參數,它須要一邊下載圖片一邊估算大小,如果圖片好多,瀏覽器須要不斷地調整頁(yè)面。這不但影響速率,也影響瀏覽體驗。
下面是一個(gè)比較友好的圖片代碼:
復制內容到剪貼板
代碼:
當瀏覽器曉得了高度和長(cháng)度參數后,即使圖片暫時(shí)未能顯示,頁(yè)面上也會(huì )騰出圖片的空位,然后繼續加載前面的內容。從而加載時(shí)間快了,瀏覽體驗也更好了
六、減少http請求
當瀏覽者打開(kāi)某個(gè)網(wǎng)頁(yè),瀏覽器會(huì )發(fā)出好多對象懇求(圖像、腳本等等),視乎網(wǎng)路延時(shí)情況,每個(gè)對象加載就會(huì )有所延后。如果網(wǎng)頁(yè)上對象好多,這可以須要耗費大量的時(shí)間。
因此,要為http懇求減負。如何減負?
1、去除一些不必要的對象。
2、將臨近的兩張圖片合成一張。
3、合并CSS文件
看看下邊這段代碼,需要加載三個(gè)CSS文件:
我們可以將其合成一個(gè):
從而降低http懇求。
七、其它小技巧
1、去除不必要加載項。
2、如果在網(wǎng)頁(yè)上嵌入了其它網(wǎng)站的widget,如果有選擇余地,一定要選擇速率快的。
3、盡量用圖片取代flash,這對SEO也有用處。
4、有些內容可以靜態(tài)化就將其靜態(tài)化,以降低服務(wù)器的負擔。
5、統計代碼放到頁(yè)尾(或者使用延遲加載)。 查看全部
如果你的網(wǎng)站打開(kāi)速率過(guò)慢網(wǎng)站打開(kāi)速度慢 如何優(yōu)化,而你又不知道該怎么解決,那么這篇文章是非看不可了。手把手的教你怎么排查網(wǎng)站打開(kāi)慢的緣由,以及優(yōu)化方式。
排查網(wǎng)站打開(kāi)速率慢的緣由:
1 網(wǎng)站服務(wù)器速率或租用空間所在服務(wù)器速率
服務(wù)器空間速率是網(wǎng)站打開(kāi)速率快的硬件基礎,也是先決條件。否則縱使你網(wǎng)站頁(yè)面設計的特別"苗條",網(wǎng)站打開(kāi)速率也會(huì )打折扣。解決辦法:要找你的空間商解決或換空間商。
如何測量服務(wù)器速率快慢呢?
方法一: ping命令看聯(lián)接到服務(wù)器的時(shí)間和丟包情況。
1>單擊“開(kāi)始”鍵并選擇運行;接著(zhù)在“運行”對話(huà)框中輸入cmd
注:有的可能是輸入command,也有可能有的windows不帶DOS系統。
2>鍵入Ping和您要測試的網(wǎng)址(比如:Ping -t)。然后回車(chē),便得到你訪(fǎng)問(wèn)服務(wù)器的回時(shí)間。
一般,“PING”命令會(huì )手動(dòng)進(jìn)行下去,直到你使它中止,如敲“ctrl +C”。如果你熟悉使用Telnet中PING的功能,并且你具有在不同網(wǎng)路上的Telnet賬號,你就可以以不同的網(wǎng)路為基礎,對其他的主機(IP地址或域名)進(jìn)行PING的測試,你可以比較在不同的訪(fǎng)問(wèn)點(diǎn)那些被訪(fǎng)問(wèn)主機的回應時(shí)間,并得到“丟包率”、平均回應時(shí)間等測試結果。
time:顯示了信息包抵達遠程主機后返回的時(shí)間。計算定位為微秒。數值越小速率越快。
lost:丟包情況。
TTL:生存時(shí)間 指定數據包被路由器遺棄之前容許通過(guò)的網(wǎng)關(guān)數目。
一個(gè)速率好的機房,首先丟包率不能超過(guò)1%,最好是1000個(gè)沒(méi)有一個(gè)丟包,這種是最理想的,但是這個(gè)不是絕對值,只要高于1%的都屬于不錯的路由情況了。
其次ping值要小,同城的聯(lián)通adsl ping平均值絕對不能超過(guò)20,一般在10,跨省的adsl ping平均值應當在20-40屬于正常。
第三點(diǎn)是ping值要均勻,如果最小的ping值只有4,但是不時(shí)的有幾十,最大有79的出現,這個(gè)就是路由不穩定的表現,同樣的聯(lián)通的adsl,盡管最小也有8,但是最大也只有9,就說(shuō)明路由穩定。
方法二: 查看登臺服務(wù)器上其它網(wǎng)站的打開(kāi)速率。
相同IP地址站點(diǎn)查詢(xún)網(wǎng)址:
通過(guò)前面的查詢(xún)工具可以看見(jiàn)和自已在同一臺服務(wù)器上的網(wǎng)站個(gè)數和網(wǎng)址??梢郧魄破渌W(wǎng)站是否打開(kāi)也慢呢。
2 電信和移動(dòng)互訪(fǎng)困局問(wèn)題。
如果空間打開(kāi)的速率時(shí)快時(shí)慢,甚至有時(shí)候打不開(kāi),那就是空間不穩定的誘因。要找你的空間商解決或換空間商了;如果是在有的地方打開(kāi)速率快,有的地方打開(kāi)速率慢,那應當是網(wǎng)路線(xiàn)路的問(wèn)題。電信線(xiàn)路用戶(hù)訪(fǎng)問(wèn)放到移動(dòng)服務(wù)器的網(wǎng)站,聯(lián)通線(xiàn)路用戶(hù)訪(fǎng)問(wèn)置于聯(lián)通服務(wù)器上的網(wǎng)站,相對來(lái)說(shuō)打開(kāi)速率肯定是比較慢。
解決辦法:如果選購空間的話(huà),建議訂購雙線(xiàn)空間或多線(xiàn)空間。這已不是新鮮的概念,大部分的虛擬主機商都有兩線(xiàn)或多線(xiàn)空間,價(jià)格高一些,但是從用戶(hù)體驗角度來(lái)說(shuō)是物有所值的。
3 從網(wǎng)站本身找問(wèn)題,網(wǎng)站的問(wèn)題包括網(wǎng)站程序設計,網(wǎng)頁(yè)設計結構,網(wǎng)頁(yè)內容三個(gè)部份。
網(wǎng)站程序設計:
1>網(wǎng)頁(yè)中若果有幻燈片播放療效的代碼,需要審查一下,是否嚴重拖慢網(wǎng)站打開(kāi)速率。
2>如果排除各方面緣由,可以找搞程序設計的相關(guān)專(zhuān)業(yè)人士,查看程序的設計結構是否合理。
網(wǎng)頁(yè)設計結構:
1>如果是table布局的網(wǎng)站,查看是否嵌套次數多很,或是一個(gè)大表格之后分成多個(gè)表格這樣的網(wǎng)頁(yè)布局。解決辦法:建議用div布局,配合css ,這樣除了打開(kāi)速率快,也有利于更改。
2>如果網(wǎng)站中有統計代碼,在線(xiàn)客服或是其它js代碼,看看是否放在了網(wǎng)頁(yè)代碼的最前面。解決辦法:最好盡可能的放在網(wǎng)頁(yè)代碼最后,當網(wǎng)站代碼加載完畢,才執行這種代碼。
3>可能有錯誤的代碼
一種情況是查看一下網(wǎng)頁(yè)代碼是否有不存在的圖片或文件路徑代碼。(如上圖所示用firebug聽(tīng)到20.jpg這個(gè)圖片,紅色顯示表示實(shí)際不存在,代碼中有調用它的代碼)因為本身圖片在空間中不存在,可是在執行代碼的時(shí)侯網(wǎng)站打開(kāi)速度慢 如何優(yōu)化,執行到這一行時(shí),卻要始終加載這個(gè)圖片,在細微程度上是會(huì )影響到網(wǎng)站的速率的。
另一種情況是從別的網(wǎng)站轉抄的特效javascript代碼,可能轉載不全,有許多網(wǎng)頁(yè)錯誤,造成網(wǎng)站打開(kāi)速率慢。解決辦法:修正網(wǎng)站上代碼錯誤。
4>盡量減低javascript的特效的使用。
如:鼠標特效、欄目特效、狀態(tài)欄特效等,這些特效的原理是先由服務(wù)器下載到你本地的機器,然后在本地機器上運行形成,如果觀(guān)看你網(wǎng)站的網(wǎng)友機器配置低的話(huà),要運行一段時(shí)間就能完成。
網(wǎng)頁(yè)內容:
1>查看網(wǎng)頁(yè)中是否有許多規格大的圖片存在,如果非要圖片療效來(lái)抒發(fā)的話(huà),可以把大圖片切分成多個(gè)小圖片。圖片進(jìn)行減重處理,可以讓字節數顯得較小,否則好多的圖片會(huì )占用好多空間又讓網(wǎng)站打開(kāi)速率顯得太慢??梢杂胮hotoshop、fireworks等畫(huà)圖軟件將圖片規格縮小,使圖片的質(zhì)量稍為減少一下,在圖片質(zhì)量和圖片大小之間找尋一個(gè)最佳的比列。
2>查看網(wǎng)頁(yè)中是否有規格大的flash文件存在,排除抒發(fā)療效外,盡量少用小型flash。
3>有的同學(xué)喜歡在網(wǎng)頁(yè)中加音樂(lè ),用戶(hù)一打開(kāi)網(wǎng)站,就有背景音樂(lè )播放,這樣的事情盡量不要做。
4>內容中過(guò)多地引用了其它網(wǎng)站的內容。如引用其他網(wǎng)站的圖片或其它內容,如果哪個(gè)網(wǎng)站的速率慢,或者那種網(wǎng)站的頁(yè)面早已不存在了,打開(kāi)的速率都會(huì )更慢。解決辦法:這樣問(wèn)題常見(jiàn)的情況是,友情鏈接交換中圖片鏈接真接鏈接別的網(wǎng)站的logo圖片,建議先把對方的logo圖片上傳到自已的網(wǎng)站空間中,然后加上鏈接。第二種情況是許多同學(xué)喜歡用iframe嵌套別的網(wǎng)站上的搜索,查ip等小功能模塊,建議少用這些方法。
查看網(wǎng)站中圖片、代碼等加載情況可以用 firefox瀏覽器的插件工具firebug 工具查看。
優(yōu)化加載速率的方式:
一、優(yōu)化圖片
幾乎沒(méi)有那個(gè)網(wǎng)頁(yè)上是沒(méi)有圖片的。如果你經(jīng)歷過(guò)56K狗的年代,你一定不會(huì )很喜歡有大量圖片的網(wǎng)站。因為加載那樣一個(gè)網(wǎng)頁(yè)會(huì )耗費大量的時(shí)間。
即使在現今,網(wǎng)絡(luò )帶寬有了好多的提升,56K狗漸漸淡出,優(yōu)化圖片以推動(dòng)網(wǎng)頁(yè)速率還是太有必要的。
優(yōu)化圖片包括降低圖片數、降低圖象質(zhì)量、使用恰當的格式。
1、減少圖片數:去除不必要的圖片。
2、降低圖象質(zhì)量:如果不是太必要,嘗試減少圖象的質(zhì)量,尤其是jpg格式,降低5%的質(zhì)量看起來(lái)變化不是很大,但文大小的變化是比較大的。
3、常識使用腳本文件取代療效:
比如一些web2.0的款式,如果使用ps制做,每個(gè)圖片基本會(huì )降低%5-%25的大小成本.
相反,使用javascript代碼來(lái)實(shí)現療效,僅僅只降低幾個(gè)字節.
二、圖像格式的選擇
一般在網(wǎng)頁(yè)上使用的圖片格式有三種,jpg、png、gif。三種格式的具體技術(shù)指標不是這篇文章探討的內容,我們只須要曉得在哪些時(shí)侯應當使用哪些格式,以降低網(wǎng)頁(yè)的加載時(shí)間。
1、JPG:一般用于展示景色、人物、藝術(shù)照的攝影作品。有時(shí)也用在筆記本截屏上。
2、GIF:提供的顏色較少,可用在一些對顏色要求不高的地方,比如網(wǎng)站logo、按鈕、表情等等。當然,gif的一個(gè)重要的應用是動(dòng)漫圖片。
3、PNG:PNG格式能提供透明背景,是一種專(zhuān)為網(wǎng)頁(yè)展示而發(fā)明的圖片格式。一般用于須要背景透明顯示或對圖象質(zhì)量要求較高的網(wǎng)頁(yè)上。
三、優(yōu)化CSS
CSS疊層樣式表使網(wǎng)頁(yè)加載上去更高效,瀏覽體驗也得到增強。有了CSS,表格布局的形式可以退職了。
但有時(shí)我們在寫(xiě)CSS的時(shí)侯會(huì )使用了一些比較羅嗦的句子,比如這句:
復制內容到剪貼板
代碼:
margin-top: 10px;
margin-right: 20px;
margin-bottom: 10px;
margin-left: 20px;
你可以將它簡(jiǎn)化為:
margin: 10px 20px 10px 20px;
又或則這句:
A paragraph ofdecorated text
Secondparagraph
Thirdparagraph
Forthparagraph
可以用div來(lái)包含:
A paragraph of decoratedtext
Secondparagraph
Thirdparagraph
Forthparagraph
四、網(wǎng)址后加斜杠
有些網(wǎng)址,比如當服務(wù)器收到這樣一個(gè)地址懇求的時(shí)侯,它須要耗費時(shí)間去確定這個(gè)地址的文件類(lèi)型。如果220是一個(gè)目錄,不妨在網(wǎng)址后多加一個(gè)斜杠,讓其弄成,這樣服務(wù)器才能一目了然地曉得要訪(fǎng)問(wèn)該目錄下的index或default文件,從而節約了加載時(shí)間。
五、標明高度和長(cháng)度
這點(diǎn)很重要,但很多人因為懶惰或其它緣由,總是將其忽略。當你在網(wǎng)頁(yè)上添加圖片或表格時(shí),你應當指定它們的高度和長(cháng)度,也就是height和width參數。如果瀏覽器沒(méi)有找到這兩個(gè)參數,它須要一邊下載圖片一邊估算大小,如果圖片好多,瀏覽器須要不斷地調整頁(yè)面。這不但影響速率,也影響瀏覽體驗。
下面是一個(gè)比較友好的圖片代碼:
復制內容到剪貼板
代碼:
當瀏覽器曉得了高度和長(cháng)度參數后,即使圖片暫時(shí)未能顯示,頁(yè)面上也會(huì )騰出圖片的空位,然后繼續加載前面的內容。從而加載時(shí)間快了,瀏覽體驗也更好了
六、減少http請求
當瀏覽者打開(kāi)某個(gè)網(wǎng)頁(yè),瀏覽器會(huì )發(fā)出好多對象懇求(圖像、腳本等等),視乎網(wǎng)路延時(shí)情況,每個(gè)對象加載就會(huì )有所延后。如果網(wǎng)頁(yè)上對象好多,這可以須要耗費大量的時(shí)間。
因此,要為http懇求減負。如何減負?
1、去除一些不必要的對象。
2、將臨近的兩張圖片合成一張。
3、合并CSS文件
看看下邊這段代碼,需要加載三個(gè)CSS文件:
我們可以將其合成一個(gè):
從而降低http懇求。
七、其它小技巧
1、去除不必要加載項。
2、如果在網(wǎng)頁(yè)上嵌入了其它網(wǎng)站的widget,如果有選擇余地,一定要選擇速率快的。
3、盡量用圖片取代flash,這對SEO也有用處。
4、有些內容可以靜態(tài)化就將其靜態(tài)化,以降低服務(wù)器的負擔。
5、統計代碼放到頁(yè)尾(或者使用延遲加載)。
火車(chē)頭網(wǎng)頁(yè)正則提取電話(huà) – 火車(chē)頭正則采集電話(huà)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 727 次瀏覽 ? 2020-05-25 08:01
分分鐘搞定,咱們先熟悉一下火車(chē)頭的規則。
(?<content>[\s\S]*?)
Content //代表內容
? //表示匹配0次或則1次
\s //匹配所有空白字符
\S //匹配所有非空白字符
* //修飾匹配次數為 0 次或任意次
火車(chē)頭采集手機號的正則:(?<content>1[34578]{1}[0-9]{9})
火車(chē)頭采集郵箱的正則:(?<content>[\w\-\.]+@[\w\-\.]+\.\w+)
--------------------下方是正則表達式說(shuō)明。-----------------------
表1.常用的元字符代碼說(shuō)明
. 匹配除換行符以外的任意字符
\w 匹配字母或數字或頓號或漢字
\s 匹配任意的空白符
\d 匹配數字
\b 匹配詞組的開(kāi)始或結束
^ 匹配字符串的開(kāi)始$匹配字符串的結束
表2.常用的限定符代碼/語(yǔ)法說(shuō)明
* 重復零次或更多次
+ 重復一次或更多次
? 重復零次或一次
{n} 重復n次
{n,} 重復n次或更多次
{n,m} 重復n到m次
表3.常用的反義代碼代碼/語(yǔ)法說(shuō)明
\W 匹配任意不是字母,數字,下劃線(xiàn),漢字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非數字的字符
\B 匹配不是詞組開(kāi)頭或結束的位置
[^x] 匹配不僅x以外的任意字符
[^aeiou] 匹配不僅aeiou這幾個(gè)字母以外的任意字符
常用分組句型
表5.懶惰限定符代碼/語(yǔ)法說(shuō)明
*? 重復任意次,但盡可能少重復
+? 重復1次或更多次,但盡可能少重復
?? 重復0次或1次,但盡可能少重復
{n,m}? 重復n到m次,但盡可能少重復
{n,}? 重復n次以上,但盡可能少重復
表7.尚未詳盡討論的句型代碼/語(yǔ)法說(shuō)明
\a 報案字符(打印它的療效是筆記本嘀一聲)
\b 一般是詞組分界位置,但若果在字符類(lèi)里使用代表退格
\t 制表符火車(chē)采集器 手機正則表達式,Tab
\r 回車(chē)
\v 豎向制表符
\f 換頁(yè)符
\n 換行符
\e Escape
\0nn ASCII代碼中八進(jìn)制代碼為nn的字符
\xnn ASCII代碼中十六進(jìn)制代碼為nn的字符
\unnnn Unicode代碼中十六進(jìn)制代碼為nnnn的字符
\cN ASCII控制字符。比如\cC代表Ctrl+C
\A 字符串開(kāi)頭(類(lèi)似^,但不受處理多行選項的影響)
\Z 字符串結尾或行尾(不受處理多行選項的影響)
\z 字符串結尾(類(lèi)似$火車(chē)采集器 手機正則表達式,但不受處理多行選項的影響)
\G 當前搜索的開(kāi)頭
\p{name} Unicode中命名為name的字符類(lèi),例如\p{IsGreek}
(?>exp) 貪婪子表達式(?<x>-<y>exp)平衡組
(?im-nsx:exp) 在子表達式exp中改變處理選項
(?im-nsx) 為表達式旁邊的部份改變處理選項
(?(exp)yes|no) 把exp當成零寬正向先行斷定,如果在這個(gè)位置能匹配,使用yes作為此組的表達式;否則使用no(?(exp)yes)同上,只是使用空表達式作為no
(?(name)yes|no) 假如命名為name的組捕獲到了內容,使用yes作為表達式;否則使用no
(?(name)yes) 同上,只是使用空表達式作為no 查看全部
話(huà)說(shuō)好長(cháng)時(shí)間不用火車(chē)頭了。都有點(diǎn)蒙逼忘了。記得曾經(jīng)用火車(chē)頭采集論壇做垃圾文章網(wǎng)站,都多少年前的事情了,如今須要采集一些手機號,想想懶得寫(xiě)PHP,有現成的工具為何不用對吧,沒(méi)毛病。
分分鐘搞定,咱們先熟悉一下火車(chē)頭的規則。
(?<content>[\s\S]*?)
Content //代表內容
? //表示匹配0次或則1次
\s //匹配所有空白字符
\S //匹配所有非空白字符
* //修飾匹配次數為 0 次或任意次
火車(chē)頭采集手機號的正則:(?<content>1[34578]{1}[0-9]{9})
火車(chē)頭采集郵箱的正則:(?<content>[\w\-\.]+@[\w\-\.]+\.\w+)
--------------------下方是正則表達式說(shuō)明。-----------------------
表1.常用的元字符代碼說(shuō)明
. 匹配除換行符以外的任意字符
\w 匹配字母或數字或頓號或漢字
\s 匹配任意的空白符
\d 匹配數字
\b 匹配詞組的開(kāi)始或結束
^ 匹配字符串的開(kāi)始$匹配字符串的結束
表2.常用的限定符代碼/語(yǔ)法說(shuō)明
* 重復零次或更多次
+ 重復一次或更多次
? 重復零次或一次
{n} 重復n次
{n,} 重復n次或更多次
{n,m} 重復n到m次
表3.常用的反義代碼代碼/語(yǔ)法說(shuō)明
\W 匹配任意不是字母,數字,下劃線(xiàn),漢字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非數字的字符
\B 匹配不是詞組開(kāi)頭或結束的位置
[^x] 匹配不僅x以外的任意字符
[^aeiou] 匹配不僅aeiou這幾個(gè)字母以外的任意字符
常用分組句型
表5.懶惰限定符代碼/語(yǔ)法說(shuō)明
*? 重復任意次,但盡可能少重復
+? 重復1次或更多次,但盡可能少重復
?? 重復0次或1次,但盡可能少重復
{n,m}? 重復n到m次,但盡可能少重復
{n,}? 重復n次以上,但盡可能少重復
表7.尚未詳盡討論的句型代碼/語(yǔ)法說(shuō)明
\a 報案字符(打印它的療效是筆記本嘀一聲)
\b 一般是詞組分界位置,但若果在字符類(lèi)里使用代表退格
\t 制表符火車(chē)采集器 手機正則表達式,Tab
\r 回車(chē)
\v 豎向制表符
\f 換頁(yè)符
\n 換行符
\e Escape
\0nn ASCII代碼中八進(jìn)制代碼為nn的字符
\xnn ASCII代碼中十六進(jìn)制代碼為nn的字符
\unnnn Unicode代碼中十六進(jìn)制代碼為nnnn的字符
\cN ASCII控制字符。比如\cC代表Ctrl+C
\A 字符串開(kāi)頭(類(lèi)似^,但不受處理多行選項的影響)
\Z 字符串結尾或行尾(不受處理多行選項的影響)
\z 字符串結尾(類(lèi)似$火車(chē)采集器 手機正則表達式,但不受處理多行選項的影響)
\G 當前搜索的開(kāi)頭
\p{name} Unicode中命名為name的字符類(lèi),例如\p{IsGreek}
(?>exp) 貪婪子表達式(?<x>-<y>exp)平衡組
(?im-nsx:exp) 在子表達式exp中改變處理選項
(?im-nsx) 為表達式旁邊的部份改變處理選項
(?(exp)yes|no) 把exp當成零寬正向先行斷定,如果在這個(gè)位置能匹配,使用yes作為此組的表達式;否則使用no(?(exp)yes)同上,只是使用空表達式作為no
(?(name)yes|no) 假如命名為name的組捕獲到了內容,使用yes作為表達式;否則使用no
(?(name)yes) 同上,只是使用空表達式作為no
爬蟲(chóng)基本原理
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 371 次瀏覽 ? 2020-05-14 08:08
本文分為如下幾個(gè)部份
簡(jiǎn)單理解網(wǎng)路爬蟲(chóng)就是手動(dòng)抓取網(wǎng)頁(yè)信息的代碼,可以簡(jiǎn)單理解成取代繁雜的復制粘貼操作的手段。
首先必須申明,爬蟲(chóng)的對象必須是你早已聽(tīng)到的網(wǎng)頁(yè),比如你不能說(shuō)你想找到知乎上那個(gè)用戶(hù)的關(guān)注人數最多,就希望通過(guò)寫(xiě)一個(gè)爬蟲(chóng)來(lái)幫你爬到答案。你必須明晰地曉得這個(gè)人,找到他的主頁(yè),然后才會(huì )用爬蟲(chóng)來(lái)抓取他頁(yè)面上的信息。
下面我們用一個(gè)簡(jiǎn)單的事例來(lái)展示爬蟲(chóng)的工作流程。感覺(jué)多數教程第一篇都使用的是豆瓣top250,我們這兒換一個(gè),抓取CSDN首頁(yè)的文章標題,鏈接在這里,頁(yè)面樣子是這樣的
抓取標題完整代碼如下
import requests # 導入網(wǎng)頁(yè)請求庫
from bs4 import BeautifulSoup # 導入網(wǎng)頁(yè)解析庫
# 傳入URL
r = requests.get('https://www.csdn.net/')
# 解析URL
soup = BeautifulSoup(r.text, 'html.parser')
content_list = soup.find_all('div', attrs = {'class': 'title'})
for content in content_list:
print(content.h2.a.text)
這樣才會(huì )復印出所有標題,展示一部分如下
上述過(guò)程是一個(gè)最簡(jiǎn)單的完整爬蟲(chóng)流程,可以看出它的功能就是把這些標題復制粘貼到一起,免不僅自動(dòng)操作的冗長(cháng)。其實(shí)爬蟲(chóng)通常就是做這些事的,比如我們須要用鏈家的數據進(jìn)行剖析,看到鏈家的頁(yè)面是這樣的
我們想獲取每位房屋的標題、幾室幾廳、多少平米、朝向、裝修、價(jià)格等等數組(即指標),就可以通過(guò)爬蟲(chóng)進(jìn)行定位,自動(dòng)化抓取這100頁(yè)所有房屋的那些數組信息。比如100頁(yè)里有2000個(gè)房屋,總共抓取10個(gè)數組,爬蟲(chóng)運行結束就可以得到一個(gè)2000行10列的excel表格。
注:如果還沒(méi)有安裝里面兩個(gè)庫的讀者可以在命令行下分別運行下邊兩行命令完成安裝
pip install requests
pip install beautifulsoup4
知道了爬蟲(chóng)是拿來(lái)干哪些的以后,我們來(lái)介紹一些最常見(jiàn)到的概念
1.URL
URL英文稱(chēng)為統一資源定位符,其實(shí)可以理解成網(wǎng)頁(yè)的鏈接,比如前面的就是一個(gè)URL。
但是更廣義的URL不只是我們常聽(tīng)到的網(wǎng)頁(yè)資源鏈接,而是資源在網(wǎng)頁(yè)中的定位標示。我們一般說(shuō)的網(wǎng)頁(yè)是一個(gè)資源,網(wǎng)頁(yè)中加載的每一張圖片也是一個(gè)資源,它們在互聯(lián)網(wǎng)中也有惟一的定位URL。比如我們從CSDN網(wǎng)頁(yè)上隨意找一張圖片
這個(gè)鏈接就是這個(gè)圖片資源的定位符,將這個(gè)鏈接輸入瀏覽器中都會(huì )顯示出這張圖片網(wǎng)頁(yè)爬蟲(chóng),所以說(shuō)這張圖片也對應一個(gè)URL。
不過(guò)曉得如此回事就好,我們一般所說(shuō)的傳入URL指的就是把網(wǎng)頁(yè)的鏈接傳進(jìn)去。上面代碼中
r = requests.get('https://www.csdn.net/')
就是在將URL傳入懇求函數。
2.網(wǎng)頁(yè)懇求
說(shuō)到網(wǎng)頁(yè)懇求,就有必要講一下我們平時(shí)瀏覽網(wǎng)頁(yè)時(shí),信息交互的模式大約是什么樣的。我們平時(shí)用瀏覽器瀏覽網(wǎng)頁(yè)的時(shí)侯,鼠標點(diǎn)了一個(gè)鏈接,比如你如今點(diǎn)擊這兒,其實(shí)瀏覽器幫你向這個(gè)網(wǎng)頁(yè)發(fā)送了懇求(request),維護網(wǎng)頁(yè)的服務(wù)器(可以理解為CSDN公司里的一臺筆記本,在維護這CSDN上的各個(gè)網(wǎng)頁(yè))收到了這個(gè)懇求,判定這個(gè)懇求是有效的,于是返回了一些響應信息(response)到瀏覽器,瀏覽器將這種信息進(jìn)行渲染(可以理解成 處理成人能讀懂的樣子),就是你看見(jiàn)的網(wǎng)頁(yè)的樣子了。發(fā)送懇求與接收懇求的過(guò)程就和 發(fā)陌陌和收到回復的過(guò)程類(lèi)似。
而如今我們要用代碼來(lái)模擬滑鼠點(diǎn)擊的過(guò)程。上面的requests.get就是使代碼幫你向這個(gè)網(wǎng)頁(yè)發(fā)送了這個(gè)懇求,如果懇求被判斷為有效,網(wǎng)頁(yè)的服務(wù)器也會(huì )把信息傳送給你,傳送回去的這種信息就被形參到變量r之中。所以這個(gè)變量r里就包含有我們想要的信息了,也包括這些我們想要提取的標題。
我們可以print(r.text)看一下上面有哪些東西
我們再看一下網(wǎng)頁(yè)的源代碼(如何讀懂這個(gè)源碼,以及這個(gè)源碼如何查看下一節HTML會(huì )詳盡提到)
源代碼和r.text雖然是一模一樣的東西。r.text雖然就是一個(gè)字符串,字符串中有我們剛才抓取到的所有標題,我們只要通過(guò)字符串匹配方式(比如正則表達式)將她們提取下來(lái)就可以了。這樣說(shuō)是不是覺(jué)得爬蟲(chóng)十分簡(jiǎn)單呢?只要這樣傻蛋操作
r = requests.get('https://www.csdn.net/')
再直接從r.text字符串中提取信息即可。其實(shí)爬蟲(chóng)就是那么簡(jiǎn)單。
但是解析是如何回事呢,為什么剛才不直接用正則而要用bs4呢?因為便捷,但是正則也是完全可以的,只是相對麻煩一些、需要寫(xiě)更多的代碼而已。
3.網(wǎng)頁(yè)解析
網(wǎng)頁(yè)解析雖然就從網(wǎng)頁(yè)服務(wù)器返回給我們的信息中提取我們想要數據的過(guò)程。其實(shí)使用正則表達式提取我們要的標題的過(guò)程也可以稱(chēng)為網(wǎng)頁(yè)解析。
因為當前絕大多數網(wǎng)頁(yè)源代碼都是用HTML語(yǔ)言寫(xiě)的,而HTML語(yǔ)言時(shí)特別有規律性的,比如我們要的所有文章標題都具有相同結構,也就是說(shuō)它周?chē)淖址际鞘诸?lèi)似的,這樣我們能夠批量獲取。所以就有大鱷專(zhuān)門(mén)封裝了怎樣從HTML代碼中提取特定文本的庫,也就是我們平常說(shuō)的網(wǎng)頁(yè)解析庫,如bs4 lxml pyquery等,其實(shí)把她們當作處理字符串的就可以了。
為了更清楚地了解怎樣對網(wǎng)頁(yè)進(jìn)行解析,我們須要先簡(jiǎn)略把握HTML代碼的結構。
引用維基百科中的一段話(huà)來(lái)介紹HTML
超文本標記語(yǔ)言(英語(yǔ):HyperText Markup Language,簡(jiǎn)稱(chēng):HTML)是一種用于創(chuàng )建網(wǎng)頁(yè)的標準標記語(yǔ)言。HTML是一種基礎技術(shù),常與CSS、JavaScript一起被諸多網(wǎng)站用于設計令人賞心悅目的網(wǎng)頁(yè)、網(wǎng)頁(yè)應用程序以及移動(dòng)應用程序的用戶(hù)界面[1]。網(wǎng)頁(yè)瀏覽器可以讀取HTML文件,并將其渲染成可視化網(wǎng)頁(yè)。
為了使讀者對HTML有更清楚的認識,我們來(lái)寫(xiě)一點(diǎn)簡(jiǎn)單的HTML代碼。用文本編輯器(記事本也可以)創(chuàng )建一個(gè)名子為a.html的文件,在里面寫(xiě)下如下代碼
<!DOCTYPE html>
<html>
<head>
<title>爬蟲(chóng)基本原理</title>
</head>
<body>
<h1>HTML介紹</h1>
<p>第一段</p>
<p>第二段</p>
</body>
</html>
保存,然后你雙擊這個(gè)文件,就會(huì )手動(dòng)用瀏覽器打開(kāi),然后你還能見(jiàn)到下邊這個(gè)樣子的頁(yè)面
你若果根據我的操作來(lái)做的話(huà),你已然創(chuàng )建了一個(gè)簡(jiǎn)單的網(wǎng)頁(yè),現在你看見(jiàn)的所有網(wǎng)頁(yè)都是這樣設計的,只是比你的復雜一點(diǎn)而已,不信你去瞧瞧剛剛截圖出來(lái)的網(wǎng)頁(yè)源代碼圖片。
接下來(lái),我們來(lái)看一下HTML語(yǔ)言的特性。最重要的一點(diǎn)是網(wǎng)頁(yè)爬蟲(chóng),文本都是被標簽(h1標簽 p標簽)夾在中間的,而這種標簽都是特定的,有專(zhuān)門(mén)用途的。比如<h1>就表示一級標題,包在上面的文本自然會(huì )被放大顯示;而<p>標簽則表示段落。
再看里面的源代碼截圖,head meta script title div li每一個(gè)都是標簽,層層嵌套。我們完全不需要曉得總共有什么種標簽,也不需要曉得這種標簽都是拿來(lái)干哪些的,我們只要找到我們要的信息包含在哪些標簽里就行了。比如使用正則表達式就直接用<p>(.*?)</p>就可以把上面的內容提取下來(lái)了。
但是事實(shí)似乎沒(méi)有這么簡(jiǎn)單,看里面的截圖標簽如何是這樣的<nav id="nav" class="clearfix">?其實(shí)這是一個(gè)<nav>標簽,后面的id class是這個(gè)標簽的屬性。
為什么要給標簽設置屬性呢?我們先考慮這樣一個(gè)問(wèn)題:我們看見(jiàn)的網(wǎng)頁(yè)千差萬(wàn)別,文字的顏色字體等都不一樣,這是如何設置的呢?答案是使用css樣式。
css句子類(lèi)似這樣
h1 {
color: white;
text-align: center;
}
p {
font-family: verdana;
font-size: 20px;
}
即設置對應標簽的顏色、字體、大小、居中等。而當有的段落使用這個(gè)字體,有的段落使用哪個(gè)字體如何辦呢?css這樣設置
p.test1 {
font-size: 20px;
}
p.test2 {
font-size: 15px;
}
在HTML代碼中則這樣寫(xiě)
<p class="test1">20px大小的字</p>
<p class="test2">15px大小的字</p>
所以不同屬性就是為了分辨相同標簽用的,這相當于給標簽進(jìn)行了分類(lèi),在統一設計款式上更方便,同時(shí)對于我們依照屬性定位我們想要內容的位置雖然也是更方便了。這里要說(shuō)明一下,class id這兩個(gè)屬性比較特殊,用的也最多,所以各自弄了一個(gè)快捷鍵來(lái)表示,class用.,id用#。
做爬蟲(chóng)不需要了解剛才編撰的css代碼內容放到那里之類(lèi)的問(wèn)題,也不需要了解css代碼設置了哪些,我們只會(huì )和HTML打交道,所以只要理解HTML中屬性的作用就可以了。
如果想要更進(jìn)一步了解HTML和CSS,可以到w3school網(wǎng)站學(xué)習。
現在你就早已具備了解析網(wǎng)頁(yè)須要的全部HTML知識了。我們通常就是依據標簽名配合屬性值來(lái)定位我們想要資源的位置的,其他的都不用管。這時(shí),我們再來(lái)看爬蟲(chóng)的解析代碼
把上面的代碼再粘貼一遍如下
import requests # 導入網(wǎng)頁(yè)請求庫
from bs4 import BeautifulSoup # 導入網(wǎng)頁(yè)解析庫
# 傳入URL
r = requests.get('https://www.csdn.net/')
# 解析URL
soup = BeautifulSoup(r.text, 'html.parser')
content_list = soup.find_all('div', attrs = {'class': 'title'})
for content in content_list:
print(content.h2.a.text)
解釋一下里面代碼的過(guò)程
可以看見(jiàn)里面的代碼十分簡(jiǎn)約,思路清晰,讀者可以自己想一想假如要用正則表達式怎么匹配那些標簽,會(huì )發(fā)覺(jué)代碼冗長(cháng)好多,雖然它也有更快的優(yōu)勢。
那么我們是如何曉得要找尋什么樣屬性的div標簽,為什么要找h2 a標簽而不是其他的呢?這就要去剖析網(wǎng)頁(yè)的源代碼了。而這個(gè)過(guò)程也十分簡(jiǎn)單。
我們如今用谷歌瀏覽器打開(kāi)CSDN這個(gè)網(wǎng)站,找一個(gè)空白的位置右鍵-查看網(wǎng)頁(yè)源代碼,這時(shí)才會(huì )打開(kāi)一個(gè)新的頁(yè)面這個(gè)頁(yè)面就是這個(gè)網(wǎng)站的HTML源代碼了,我們可以通過(guò)這個(gè)頁(yè)面來(lái)看我們要的信息在那里,但是覺(jué)得十分不便捷,因為有太多無(wú)用的信息做干擾,我們難以快速掌控網(wǎng)頁(yè)的結構。所以我們可以用另一種形式查看源代碼。
用谷歌瀏覽器打開(kāi)CSDN這個(gè)網(wǎng)站,找一個(gè)空白的位置右鍵-檢查,就會(huì )彈出一個(gè)框,如下圖所示
?。ㄈ绻麤](méi)有聽(tīng)到這個(gè)界面,注意要切換到Element中)
這個(gè)頁(yè)面最大的用處是通過(guò)折疊來(lái)使人更快探求出網(wǎng)頁(yè)的結構。
其中的這些代碼就是HTML代碼,該頁(yè)面的一個(gè)個(gè)標題就存在這一個(gè)個(gè)li上面。點(diǎn)擊li后面的三角就可以展開(kāi)具體的代碼內容,如下圖所示
可以看見(jiàn)文章的標題(打造一個(gè)高性能、易落地的公鏈開(kāi)發(fā)平臺)就在這個(gè)源代碼之中,也就是說(shuō)在我們剛才獲得的r.text字符串之中。而我們代碼定位路徑也一目了然了,因為每位li上面還會(huì )有一個(gè)<div class="title">而每一個(gè)div上面還會(huì )有一個(gè)h2 里面有一個(gè)a,a中包含我們要的標題名稱(chēng)。所以我們就用find_all找到所有這樣的div標簽,存儲為一個(gè)list,再對list進(jìn)行循環(huán),對每一個(gè)元素提取h2 a 再提取標簽中的內容。
當然我們也可以find_all最外邊的li標簽,再一層層往里找,都是一樣的。只要找到定位信息的惟一標示(標簽或則屬性)就可以了。
雖然在這里看源代碼可以折疊一些沒(méi)用的代碼,但是雖然還有一些更好用的工具來(lái)輔助我們找到我們要的信息在網(wǎng)頁(yè)源碼中的位置。比如下邊這個(gè)鍵盤(pán)符號。
在所有代碼都折疊上去的情況下,點(diǎn)擊這個(gè)鍵盤(pán),之后再去點(diǎn)擊網(wǎng)頁(yè)中的元素,瀏覽器都會(huì )手動(dòng)幫你把你點(diǎn)擊的元素選中下來(lái),其實(shí)你鍵盤(pán)懸在一個(gè)元素前面的時(shí)侯,就早已幫你定位了,如下圖所示
當我們要爬一個(gè)網(wǎng)頁(yè)的時(shí)侯,只須要如下流程
現在,對于一些沒(méi)有絲毫反爬舉措的網(wǎng)站我們都可以游刃有余了。至于抓取多個(gè)數組的數據怎么組織在一起、抓取多頁(yè)(URL有規律的情況下)的代碼怎樣設計,就不是爬蟲(chóng)知識范疇了,這是用python基礎知識就可以解決的。下一系列文章就主要講這一部分。接下來(lái)給幾個(gè)當前可以練手的網(wǎng)站
如果使用BeautifulSoup的定位的過(guò)程中遇見(jiàn)困難,可以直接到網(wǎng)上搜教程,也可以等我們這個(gè)專(zhuān)題前面更新的BeautifulSoup詳盡介紹。
如果你去抓取其他網(wǎng)站,最好先看一下r.text是不是和網(wǎng)站源代碼一模一樣,如果不是,說(shuō)明你對方服務(wù)器沒(méi)有把真正的信息給你,說(shuō)明他可能看出你是爬蟲(chóng)了(進(jìn)行網(wǎng)頁(yè)懇求的時(shí)侯,瀏覽器和requests.get都相當于帶著(zhù)一堆資格證去敲門(mén),對方會(huì )檢測你這種資格證,瀏覽器的資格證通常是可以通過(guò)的,而代碼的資格證就可能不合格,因為代碼的資格證可能有一些比較固定的特征,對方服務(wù)器預先設定好,資格證是這樣的懇求一律拒絕,因為她們一定是爬蟲(chóng),這就是反爬蟲(chóng)機制),這時(shí)就須要懂一些反反爬舉措就能獲得真正的信息,反反爬方式的學(xué)習是一個(gè)積累的過(guò)程,我們前面再講。讀者假如遇見(jiàn)一些反爬機制,可以到網(wǎng)上查這個(gè)網(wǎng)站的爬蟲(chóng),估計都能查到一些博客講怎么破解,甚至直接貼出代碼。
在這篇的基礎上抓取多頁(yè)以及代碼設計的改進(jìn)看下邊這三篇續集
爬蟲(chóng)代碼改進(jìn)(一)
爬蟲(chóng)代碼改進(jìn)(二)
爬蟲(chóng)代碼改進(jìn)(三)
專(zhuān)欄主頁(yè):python編程
專(zhuān)欄目錄:目錄
爬蟲(chóng)目錄:爬蟲(chóng)系列目錄
版本說(shuō)明:軟件及包版本說(shuō)明 查看全部
這篇文章的定位是,給有一些python基礎,但是對爬蟲(chóng)一無(wú)所知的人寫(xiě)的。文中只會(huì )涉及到爬蟲(chóng)最核心的部份,完全避免莫名其妙的坑或概念,讓讀者認為爬蟲(chóng)是一件極其簡(jiǎn)單的事情,而事實(shí)上爬蟲(chóng)確實(shí)是一件極其簡(jiǎn)單的事情(如果你不是以爬蟲(chóng)為工作的話(huà))。
本文分為如下幾個(gè)部份
簡(jiǎn)單理解網(wǎng)路爬蟲(chóng)就是手動(dòng)抓取網(wǎng)頁(yè)信息的代碼,可以簡(jiǎn)單理解成取代繁雜的復制粘貼操作的手段。
首先必須申明,爬蟲(chóng)的對象必須是你早已聽(tīng)到的網(wǎng)頁(yè),比如你不能說(shuō)你想找到知乎上那個(gè)用戶(hù)的關(guān)注人數最多,就希望通過(guò)寫(xiě)一個(gè)爬蟲(chóng)來(lái)幫你爬到答案。你必須明晰地曉得這個(gè)人,找到他的主頁(yè),然后才會(huì )用爬蟲(chóng)來(lái)抓取他頁(yè)面上的信息。
下面我們用一個(gè)簡(jiǎn)單的事例來(lái)展示爬蟲(chóng)的工作流程。感覺(jué)多數教程第一篇都使用的是豆瓣top250,我們這兒換一個(gè),抓取CSDN首頁(yè)的文章標題,鏈接在這里,頁(yè)面樣子是這樣的

抓取標題完整代碼如下
import requests # 導入網(wǎng)頁(yè)請求庫
from bs4 import BeautifulSoup # 導入網(wǎng)頁(yè)解析庫
# 傳入URL
r = requests.get('https://www.csdn.net/')
# 解析URL
soup = BeautifulSoup(r.text, 'html.parser')
content_list = soup.find_all('div', attrs = {'class': 'title'})
for content in content_list:
print(content.h2.a.text)
這樣才會(huì )復印出所有標題,展示一部分如下

上述過(guò)程是一個(gè)最簡(jiǎn)單的完整爬蟲(chóng)流程,可以看出它的功能就是把這些標題復制粘貼到一起,免不僅自動(dòng)操作的冗長(cháng)。其實(shí)爬蟲(chóng)通常就是做這些事的,比如我們須要用鏈家的數據進(jìn)行剖析,看到鏈家的頁(yè)面是這樣的

我們想獲取每位房屋的標題、幾室幾廳、多少平米、朝向、裝修、價(jià)格等等數組(即指標),就可以通過(guò)爬蟲(chóng)進(jìn)行定位,自動(dòng)化抓取這100頁(yè)所有房屋的那些數組信息。比如100頁(yè)里有2000個(gè)房屋,總共抓取10個(gè)數組,爬蟲(chóng)運行結束就可以得到一個(gè)2000行10列的excel表格。
注:如果還沒(méi)有安裝里面兩個(gè)庫的讀者可以在命令行下分別運行下邊兩行命令完成安裝
pip install requests
pip install beautifulsoup4
知道了爬蟲(chóng)是拿來(lái)干哪些的以后,我們來(lái)介紹一些最常見(jiàn)到的概念
1.URL
URL英文稱(chēng)為統一資源定位符,其實(shí)可以理解成網(wǎng)頁(yè)的鏈接,比如前面的就是一個(gè)URL。
但是更廣義的URL不只是我們常聽(tīng)到的網(wǎng)頁(yè)資源鏈接,而是資源在網(wǎng)頁(yè)中的定位標示。我們一般說(shuō)的網(wǎng)頁(yè)是一個(gè)資源,網(wǎng)頁(yè)中加載的每一張圖片也是一個(gè)資源,它們在互聯(lián)網(wǎng)中也有惟一的定位URL。比如我們從CSDN網(wǎng)頁(yè)上隨意找一張圖片

這個(gè)鏈接就是這個(gè)圖片資源的定位符,將這個(gè)鏈接輸入瀏覽器中都會(huì )顯示出這張圖片網(wǎng)頁(yè)爬蟲(chóng),所以說(shuō)這張圖片也對應一個(gè)URL。
不過(guò)曉得如此回事就好,我們一般所說(shuō)的傳入URL指的就是把網(wǎng)頁(yè)的鏈接傳進(jìn)去。上面代碼中
r = requests.get('https://www.csdn.net/')
就是在將URL傳入懇求函數。
2.網(wǎng)頁(yè)懇求
說(shuō)到網(wǎng)頁(yè)懇求,就有必要講一下我們平時(shí)瀏覽網(wǎng)頁(yè)時(shí),信息交互的模式大約是什么樣的。我們平時(shí)用瀏覽器瀏覽網(wǎng)頁(yè)的時(shí)侯,鼠標點(diǎn)了一個(gè)鏈接,比如你如今點(diǎn)擊這兒,其實(shí)瀏覽器幫你向這個(gè)網(wǎng)頁(yè)發(fā)送了懇求(request),維護網(wǎng)頁(yè)的服務(wù)器(可以理解為CSDN公司里的一臺筆記本,在維護這CSDN上的各個(gè)網(wǎng)頁(yè))收到了這個(gè)懇求,判定這個(gè)懇求是有效的,于是返回了一些響應信息(response)到瀏覽器,瀏覽器將這種信息進(jìn)行渲染(可以理解成 處理成人能讀懂的樣子),就是你看見(jiàn)的網(wǎng)頁(yè)的樣子了。發(fā)送懇求與接收懇求的過(guò)程就和 發(fā)陌陌和收到回復的過(guò)程類(lèi)似。
而如今我們要用代碼來(lái)模擬滑鼠點(diǎn)擊的過(guò)程。上面的requests.get就是使代碼幫你向這個(gè)網(wǎng)頁(yè)發(fā)送了這個(gè)懇求,如果懇求被判斷為有效,網(wǎng)頁(yè)的服務(wù)器也會(huì )把信息傳送給你,傳送回去的這種信息就被形參到變量r之中。所以這個(gè)變量r里就包含有我們想要的信息了,也包括這些我們想要提取的標題。
我們可以print(r.text)看一下上面有哪些東西

我們再看一下網(wǎng)頁(yè)的源代碼(如何讀懂這個(gè)源碼,以及這個(gè)源碼如何查看下一節HTML會(huì )詳盡提到)

源代碼和r.text雖然是一模一樣的東西。r.text雖然就是一個(gè)字符串,字符串中有我們剛才抓取到的所有標題,我們只要通過(guò)字符串匹配方式(比如正則表達式)將她們提取下來(lái)就可以了。這樣說(shuō)是不是覺(jué)得爬蟲(chóng)十分簡(jiǎn)單呢?只要這樣傻蛋操作
r = requests.get('https://www.csdn.net/')
再直接從r.text字符串中提取信息即可。其實(shí)爬蟲(chóng)就是那么簡(jiǎn)單。
但是解析是如何回事呢,為什么剛才不直接用正則而要用bs4呢?因為便捷,但是正則也是完全可以的,只是相對麻煩一些、需要寫(xiě)更多的代碼而已。
3.網(wǎng)頁(yè)解析
網(wǎng)頁(yè)解析雖然就從網(wǎng)頁(yè)服務(wù)器返回給我們的信息中提取我們想要數據的過(guò)程。其實(shí)使用正則表達式提取我們要的標題的過(guò)程也可以稱(chēng)為網(wǎng)頁(yè)解析。
因為當前絕大多數網(wǎng)頁(yè)源代碼都是用HTML語(yǔ)言寫(xiě)的,而HTML語(yǔ)言時(shí)特別有規律性的,比如我們要的所有文章標題都具有相同結構,也就是說(shuō)它周?chē)淖址际鞘诸?lèi)似的,這樣我們能夠批量獲取。所以就有大鱷專(zhuān)門(mén)封裝了怎樣從HTML代碼中提取特定文本的庫,也就是我們平常說(shuō)的網(wǎng)頁(yè)解析庫,如bs4 lxml pyquery等,其實(shí)把她們當作處理字符串的就可以了。
為了更清楚地了解怎樣對網(wǎng)頁(yè)進(jìn)行解析,我們須要先簡(jiǎn)略把握HTML代碼的結構。
引用維基百科中的一段話(huà)來(lái)介紹HTML
超文本標記語(yǔ)言(英語(yǔ):HyperText Markup Language,簡(jiǎn)稱(chēng):HTML)是一種用于創(chuàng )建網(wǎng)頁(yè)的標準標記語(yǔ)言。HTML是一種基礎技術(shù),常與CSS、JavaScript一起被諸多網(wǎng)站用于設計令人賞心悅目的網(wǎng)頁(yè)、網(wǎng)頁(yè)應用程序以及移動(dòng)應用程序的用戶(hù)界面[1]。網(wǎng)頁(yè)瀏覽器可以讀取HTML文件,并將其渲染成可視化網(wǎng)頁(yè)。
為了使讀者對HTML有更清楚的認識,我們來(lái)寫(xiě)一點(diǎn)簡(jiǎn)單的HTML代碼。用文本編輯器(記事本也可以)創(chuàng )建一個(gè)名子為a.html的文件,在里面寫(xiě)下如下代碼
<!DOCTYPE html>
<html>
<head>
<title>爬蟲(chóng)基本原理</title>
</head>
<body>
<h1>HTML介紹</h1>
<p>第一段</p>
<p>第二段</p>
</body>
</html>
保存,然后你雙擊這個(gè)文件,就會(huì )手動(dòng)用瀏覽器打開(kāi),然后你還能見(jiàn)到下邊這個(gè)樣子的頁(yè)面

你若果根據我的操作來(lái)做的話(huà),你已然創(chuàng )建了一個(gè)簡(jiǎn)單的網(wǎng)頁(yè),現在你看見(jiàn)的所有網(wǎng)頁(yè)都是這樣設計的,只是比你的復雜一點(diǎn)而已,不信你去瞧瞧剛剛截圖出來(lái)的網(wǎng)頁(yè)源代碼圖片。
接下來(lái),我們來(lái)看一下HTML語(yǔ)言的特性。最重要的一點(diǎn)是網(wǎng)頁(yè)爬蟲(chóng),文本都是被標簽(h1標簽 p標簽)夾在中間的,而這種標簽都是特定的,有專(zhuān)門(mén)用途的。比如<h1>就表示一級標題,包在上面的文本自然會(huì )被放大顯示;而<p>標簽則表示段落。
再看里面的源代碼截圖,head meta script title div li每一個(gè)都是標簽,層層嵌套。我們完全不需要曉得總共有什么種標簽,也不需要曉得這種標簽都是拿來(lái)干哪些的,我們只要找到我們要的信息包含在哪些標簽里就行了。比如使用正則表達式就直接用<p>(.*?)</p>就可以把上面的內容提取下來(lái)了。
但是事實(shí)似乎沒(méi)有這么簡(jiǎn)單,看里面的截圖標簽如何是這樣的<nav id="nav" class="clearfix">?其實(shí)這是一個(gè)<nav>標簽,后面的id class是這個(gè)標簽的屬性。
為什么要給標簽設置屬性呢?我們先考慮這樣一個(gè)問(wèn)題:我們看見(jiàn)的網(wǎng)頁(yè)千差萬(wàn)別,文字的顏色字體等都不一樣,這是如何設置的呢?答案是使用css樣式。
css句子類(lèi)似這樣
h1 {
color: white;
text-align: center;
}
p {
font-family: verdana;
font-size: 20px;
}
即設置對應標簽的顏色、字體、大小、居中等。而當有的段落使用這個(gè)字體,有的段落使用哪個(gè)字體如何辦呢?css這樣設置
p.test1 {
font-size: 20px;
}
p.test2 {
font-size: 15px;
}
在HTML代碼中則這樣寫(xiě)
<p class="test1">20px大小的字</p>
<p class="test2">15px大小的字</p>
所以不同屬性就是為了分辨相同標簽用的,這相當于給標簽進(jìn)行了分類(lèi),在統一設計款式上更方便,同時(shí)對于我們依照屬性定位我們想要內容的位置雖然也是更方便了。這里要說(shuō)明一下,class id這兩個(gè)屬性比較特殊,用的也最多,所以各自弄了一個(gè)快捷鍵來(lái)表示,class用.,id用#。
做爬蟲(chóng)不需要了解剛才編撰的css代碼內容放到那里之類(lèi)的問(wèn)題,也不需要了解css代碼設置了哪些,我們只會(huì )和HTML打交道,所以只要理解HTML中屬性的作用就可以了。
如果想要更進(jìn)一步了解HTML和CSS,可以到w3school網(wǎng)站學(xué)習。
現在你就早已具備了解析網(wǎng)頁(yè)須要的全部HTML知識了。我們通常就是依據標簽名配合屬性值來(lái)定位我們想要資源的位置的,其他的都不用管。這時(shí),我們再來(lái)看爬蟲(chóng)的解析代碼
把上面的代碼再粘貼一遍如下
import requests # 導入網(wǎng)頁(yè)請求庫
from bs4 import BeautifulSoup # 導入網(wǎng)頁(yè)解析庫
# 傳入URL
r = requests.get('https://www.csdn.net/')
# 解析URL
soup = BeautifulSoup(r.text, 'html.parser')
content_list = soup.find_all('div', attrs = {'class': 'title'})
for content in content_list:
print(content.h2.a.text)
解釋一下里面代碼的過(guò)程
可以看見(jiàn)里面的代碼十分簡(jiǎn)約,思路清晰,讀者可以自己想一想假如要用正則表達式怎么匹配那些標簽,會(huì )發(fā)覺(jué)代碼冗長(cháng)好多,雖然它也有更快的優(yōu)勢。
那么我們是如何曉得要找尋什么樣屬性的div標簽,為什么要找h2 a標簽而不是其他的呢?這就要去剖析網(wǎng)頁(yè)的源代碼了。而這個(gè)過(guò)程也十分簡(jiǎn)單。
我們如今用谷歌瀏覽器打開(kāi)CSDN這個(gè)網(wǎng)站,找一個(gè)空白的位置右鍵-查看網(wǎng)頁(yè)源代碼,這時(shí)才會(huì )打開(kāi)一個(gè)新的頁(yè)面這個(gè)頁(yè)面就是這個(gè)網(wǎng)站的HTML源代碼了,我們可以通過(guò)這個(gè)頁(yè)面來(lái)看我們要的信息在那里,但是覺(jué)得十分不便捷,因為有太多無(wú)用的信息做干擾,我們難以快速掌控網(wǎng)頁(yè)的結構。所以我們可以用另一種形式查看源代碼。
用谷歌瀏覽器打開(kāi)CSDN這個(gè)網(wǎng)站,找一個(gè)空白的位置右鍵-檢查,就會(huì )彈出一個(gè)框,如下圖所示

?。ㄈ绻麤](méi)有聽(tīng)到這個(gè)界面,注意要切換到Element中)
這個(gè)頁(yè)面最大的用處是通過(guò)折疊來(lái)使人更快探求出網(wǎng)頁(yè)的結構。
其中的這些代碼就是HTML代碼,該頁(yè)面的一個(gè)個(gè)標題就存在這一個(gè)個(gè)li上面。點(diǎn)擊li后面的三角就可以展開(kāi)具體的代碼內容,如下圖所示

可以看見(jiàn)文章的標題(打造一個(gè)高性能、易落地的公鏈開(kāi)發(fā)平臺)就在這個(gè)源代碼之中,也就是說(shuō)在我們剛才獲得的r.text字符串之中。而我們代碼定位路徑也一目了然了,因為每位li上面還會(huì )有一個(gè)<div class="title">而每一個(gè)div上面還會(huì )有一個(gè)h2 里面有一個(gè)a,a中包含我們要的標題名稱(chēng)。所以我們就用find_all找到所有這樣的div標簽,存儲為一個(gè)list,再對list進(jìn)行循環(huán),對每一個(gè)元素提取h2 a 再提取標簽中的內容。
當然我們也可以find_all最外邊的li標簽,再一層層往里找,都是一樣的。只要找到定位信息的惟一標示(標簽或則屬性)就可以了。
雖然在這里看源代碼可以折疊一些沒(méi)用的代碼,但是雖然還有一些更好用的工具來(lái)輔助我們找到我們要的信息在網(wǎng)頁(yè)源碼中的位置。比如下邊這個(gè)鍵盤(pán)符號。

在所有代碼都折疊上去的情況下,點(diǎn)擊這個(gè)鍵盤(pán),之后再去點(diǎn)擊網(wǎng)頁(yè)中的元素,瀏覽器都會(huì )手動(dòng)幫你把你點(diǎn)擊的元素選中下來(lái),其實(shí)你鍵盤(pán)懸在一個(gè)元素前面的時(shí)侯,就早已幫你定位了,如下圖所示

當我們要爬一個(gè)網(wǎng)頁(yè)的時(shí)侯,只須要如下流程
現在,對于一些沒(méi)有絲毫反爬舉措的網(wǎng)站我們都可以游刃有余了。至于抓取多個(gè)數組的數據怎么組織在一起、抓取多頁(yè)(URL有規律的情況下)的代碼怎樣設計,就不是爬蟲(chóng)知識范疇了,這是用python基礎知識就可以解決的。下一系列文章就主要講這一部分。接下來(lái)給幾個(gè)當前可以練手的網(wǎng)站
如果使用BeautifulSoup的定位的過(guò)程中遇見(jiàn)困難,可以直接到網(wǎng)上搜教程,也可以等我們這個(gè)專(zhuān)題前面更新的BeautifulSoup詳盡介紹。
如果你去抓取其他網(wǎng)站,最好先看一下r.text是不是和網(wǎng)站源代碼一模一樣,如果不是,說(shuō)明你對方服務(wù)器沒(méi)有把真正的信息給你,說(shuō)明他可能看出你是爬蟲(chóng)了(進(jìn)行網(wǎng)頁(yè)懇求的時(shí)侯,瀏覽器和requests.get都相當于帶著(zhù)一堆資格證去敲門(mén),對方會(huì )檢測你這種資格證,瀏覽器的資格證通常是可以通過(guò)的,而代碼的資格證就可能不合格,因為代碼的資格證可能有一些比較固定的特征,對方服務(wù)器預先設定好,資格證是這樣的懇求一律拒絕,因為她們一定是爬蟲(chóng),這就是反爬蟲(chóng)機制),這時(shí)就須要懂一些反反爬舉措就能獲得真正的信息,反反爬方式的學(xué)習是一個(gè)積累的過(guò)程,我們前面再講。讀者假如遇見(jiàn)一些反爬機制,可以到網(wǎng)上查這個(gè)網(wǎng)站的爬蟲(chóng),估計都能查到一些博客講怎么破解,甚至直接貼出代碼。
在這篇的基礎上抓取多頁(yè)以及代碼設計的改進(jìn)看下邊這三篇續集
爬蟲(chóng)代碼改進(jìn)(一)
爬蟲(chóng)代碼改進(jìn)(二)
爬蟲(chóng)代碼改進(jìn)(三)
專(zhuān)欄主頁(yè):python編程
專(zhuān)欄目錄:目錄
爬蟲(chóng)目錄:爬蟲(chóng)系列目錄
版本說(shuō)明:軟件及包版本說(shuō)明
DISCUZ X3.2 采集教程 – 火車(chē)頭采集器 V7.6 WEB發(fā)布配置管理
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 871 次瀏覽 ? 2020-04-23 11:04
1. 打開(kāi)WEB發(fā)布配置管理
打開(kāi)火車(chē)頭采集器 v7.6 - 工具 - Web發(fā)布配置管理
2. 新建規則
3. 網(wǎng)站自動(dòng)登入配置
彈出一個(gè)新窗口,我們一個(gè)一個(gè)配置,先來(lái)這個(gè)登入配置,點(diǎn)擊手動(dòng)抓取登錄數據包
4. 獲取發(fā)布數據包
在以后彈出的窗口中輸入 Discuz 論壇的地址(Forece 用的本地測試),然后登錄你注冊過(guò)的用戶(hù)。在 Post 數據框那兒應當可以看見(jiàn)數據,然后點(diǎn)擊確定。當然若果有的網(wǎng)站無(wú)法使用手動(dòng)登入獲取 POST 數據的話(huà),你可以用 Fiddler 來(lái)獲取 Post 數據。然后在上一個(gè)窗口中,選擇粘貼 Post 數據。
Post 數據通常是長(cháng)這個(gè)樣的:
fastloginfield=username&username=forece&password=xxxxxxxxxxxxxx&quickforward=yes&handlekey=ls
復制代碼
點(diǎn)擊確定后,你可以聽(tīng)到大部分表格都早已填寫(xiě)完畢了
我們還須要再做一下更改,需要將 username 和 password 的表單值改為 [用戶(hù)名] 和 [密碼],另外還須要加一個(gè)登錄失敗標志碼碼和登錄成功標志碼。
登陸失敗標志碼
登錄失敗
登陸成功標志碼
<script type="text/javascript" reload="1">
復制代碼
最后截圖如下:
5. 網(wǎng)頁(yè)隨機值獲取
然后我們步入下一個(gè) Tab ,網(wǎng)頁(yè)隨機值獲取。獲取這個(gè)數值的誘因是因為 Discuz 有一個(gè)稱(chēng)作 formhash 的東西。這玩意還不是固定的,每次都變。
然后依次填入以下數據:
獲取頁(yè)面:
/forum.php?mod=post&action=newthread&fid=2
復制代碼
來(lái)源頁(yè)面
/forum.php?mod=post&action=newthread&fid=2
復制代碼
隨機值前字符串
name="formhash" value="
復制代碼
隨機值后字符串
然后將 每次懇求都使用第一次獲取的網(wǎng)頁(yè)隨機值 的選項關(guān)閉。
PS: 獲取頁(yè)面和來(lái)源頁(yè)面是你發(fā)布貼子的頁(yè)面。大家聽(tīng)到我旁邊的 fid=2 是我的版塊名稱(chēng),請依照自己 Discuz 論壇的情況配置。
最后設置截圖如下:
6. 內容發(fā)布參數
內容發(fā)布參數的設置和登錄的有點(diǎn)類(lèi)似,也是須要獲取 Post 數據
登陸進(jìn)峰會(huì ) - 選擇發(fā)貼 - 填寫(xiě)標題 - 內容 - 按發(fā)貼 - 獲取 Post 數據 - 按確定
Post 數據應當是這樣的:
formhash=9c552f8e&posttime=1507576154&wysiwyg=1&subject=%E7%81%AB%E8%BD%A6%E5%A4%B4%E8%8E%B7%E5%8F%96+Post+%E6%95%B0%E6%8D%AE%E6%B5%8B%E8%AF%95%E5%B8%96&message=by+Forece&replycredit_extcredits=0&replycredit_times=1&replycredit_membertimes=1&replycredit_random=100&readperm=&price=&tags=&rushreplyfrom=&rushreplyto=&rewardfloor=&replylimit=&stopfloor=&creditlimit=&allownoticeauthor=1&usesig=1&save=
復制代碼
按完確定后,表單數據獲取完畢,我們還是須要更改一些表單。
formhash: [網(wǎng)頁(yè)隨機值1] posttime: [系統時(shí)間戳] subject: [標簽:標題] message: [標簽:內容]
發(fā)表錯誤標志碼
抱歉,您的懇求來(lái)路不正確或表單驗證串不符,無(wú)法遞交
抱歉,您仍未輸入標題或內容
成功標志碼
帖子地址復制成功
最后截圖如下:
7. HTML 轉換為 UBB 標簽
其實(shí)到現今這個(gè)Web發(fā)布規則早已配置完畢,但是由于 Discuz 用的是 UBB 標簽而不是 HTML 標簽,所以我們再稍為讓這個(gè)發(fā)布規則更完美一些。進(jìn)入中級功能,選擇操作類(lèi)型,標簽填寫(xiě) [標簽:內容] ,CMS 選擇 Discuz , 按確定。
然后回到內容發(fā)布規則里,將表單message里面的值替換成{0}
8. 命名規則
9. 保存配置
按照自己的情況來(lái)配置,是 UTF-8 就填寫(xiě) UTF-8,是 GBK 就填寫(xiě) GBK 別搞混了。
PS: 不知道為何保存完規則后網(wǎng)頁(yè)隨機值消失不見(jiàn)了,我測試的時(shí)侯仍然未能發(fā)布內容,重新把網(wǎng)頁(yè)隨機值加進(jìn)去就好了。 查看全部
1. 打開(kāi)WEB發(fā)布配置管理
打開(kāi)火車(chē)頭采集器 v7.6 - 工具 - Web發(fā)布配置管理

2. 新建規則

3. 網(wǎng)站自動(dòng)登入配置
彈出一個(gè)新窗口,我們一個(gè)一個(gè)配置,先來(lái)這個(gè)登入配置,點(diǎn)擊手動(dòng)抓取登錄數據包

4. 獲取發(fā)布數據包
在以后彈出的窗口中輸入 Discuz 論壇的地址(Forece 用的本地測試),然后登錄你注冊過(guò)的用戶(hù)。在 Post 數據框那兒應當可以看見(jiàn)數據,然后點(diǎn)擊確定。當然若果有的網(wǎng)站無(wú)法使用手動(dòng)登入獲取 POST 數據的話(huà),你可以用 Fiddler 來(lái)獲取 Post 數據。然后在上一個(gè)窗口中,選擇粘貼 Post 數據。

Post 數據通常是長(cháng)這個(gè)樣的:
fastloginfield=username&username=forece&password=xxxxxxxxxxxxxx&quickforward=yes&handlekey=ls
復制代碼
點(diǎn)擊確定后,你可以聽(tīng)到大部分表格都早已填寫(xiě)完畢了

我們還須要再做一下更改,需要將 username 和 password 的表單值改為 [用戶(hù)名] 和 [密碼],另外還須要加一個(gè)登錄失敗標志碼碼和登錄成功標志碼。
登陸失敗標志碼
登錄失敗
登陸成功標志碼
<script type="text/javascript" reload="1">
復制代碼
最后截圖如下:

5. 網(wǎng)頁(yè)隨機值獲取
然后我們步入下一個(gè) Tab ,網(wǎng)頁(yè)隨機值獲取。獲取這個(gè)數值的誘因是因為 Discuz 有一個(gè)稱(chēng)作 formhash 的東西。這玩意還不是固定的,每次都變。

然后依次填入以下數據:
獲取頁(yè)面:
/forum.php?mod=post&action=newthread&fid=2
復制代碼
來(lái)源頁(yè)面
/forum.php?mod=post&action=newthread&fid=2
復制代碼
隨機值前字符串
name="formhash" value="
復制代碼
隨機值后字符串
然后將 每次懇求都使用第一次獲取的網(wǎng)頁(yè)隨機值 的選項關(guān)閉。
PS: 獲取頁(yè)面和來(lái)源頁(yè)面是你發(fā)布貼子的頁(yè)面。大家聽(tīng)到我旁邊的 fid=2 是我的版塊名稱(chēng),請依照自己 Discuz 論壇的情況配置。
最后設置截圖如下:

6. 內容發(fā)布參數
內容發(fā)布參數的設置和登錄的有點(diǎn)類(lèi)似,也是須要獲取 Post 數據

登陸進(jìn)峰會(huì ) - 選擇發(fā)貼 - 填寫(xiě)標題 - 內容 - 按發(fā)貼 - 獲取 Post 數據 - 按確定

Post 數據應當是這樣的:
formhash=9c552f8e&posttime=1507576154&wysiwyg=1&subject=%E7%81%AB%E8%BD%A6%E5%A4%B4%E8%8E%B7%E5%8F%96+Post+%E6%95%B0%E6%8D%AE%E6%B5%8B%E8%AF%95%E5%B8%96&message=by+Forece&replycredit_extcredits=0&replycredit_times=1&replycredit_membertimes=1&replycredit_random=100&readperm=&price=&tags=&rushreplyfrom=&rushreplyto=&rewardfloor=&replylimit=&stopfloor=&creditlimit=&allownoticeauthor=1&usesig=1&save=
復制代碼
按完確定后,表單數據獲取完畢,我們還是須要更改一些表單。


formhash: [網(wǎng)頁(yè)隨機值1] posttime: [系統時(shí)間戳] subject: [標簽:標題] message: [標簽:內容]
發(fā)表錯誤標志碼
抱歉,您的懇求來(lái)路不正確或表單驗證串不符,無(wú)法遞交
抱歉,您仍未輸入標題或內容
成功標志碼
帖子地址復制成功
最后截圖如下:

7. HTML 轉換為 UBB 標簽
其實(shí)到現今這個(gè)Web發(fā)布規則早已配置完畢,但是由于 Discuz 用的是 UBB 標簽而不是 HTML 標簽,所以我們再稍為讓這個(gè)發(fā)布規則更完美一些。進(jìn)入中級功能,選擇操作類(lèi)型,標簽填寫(xiě) [標簽:內容] ,CMS 選擇 Discuz , 按確定。

然后回到內容發(fā)布規則里,將表單message里面的值替換成{0}

8. 命名規則

9. 保存配置
按照自己的情況來(lái)配置,是 UTF-8 就填寫(xiě) UTF-8,是 GBK 就填寫(xiě) GBK 別搞混了。

PS: 不知道為何保存完規則后網(wǎng)頁(yè)隨機值消失不見(jiàn)了,我測試的時(shí)侯仍然未能發(fā)布內容,重新把網(wǎng)頁(yè)隨機值加進(jìn)去就好了。
網(wǎng)站打開(kāi)速率慢的緣由,排查方式及優(yōu)化方式
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 312 次瀏覽 ? 2020-07-26 08:01
排查網(wǎng)站打開(kāi)速率慢的緣由:
1 網(wǎng)站服務(wù)器速率或租用空間所在服務(wù)器速率
服務(wù)器空間速率是網(wǎng)站打開(kāi)速率快的硬件基礎,也是先決條件。否則縱使你網(wǎng)站頁(yè)面設計的特別"苗條",網(wǎng)站打開(kāi)速率也會(huì )打折扣。解決辦法:要找你的空間商解決或換空間商。
如何測量服務(wù)器速率快慢呢?
方法一: ping命令看聯(lián)接到服務(wù)器的時(shí)間和丟包情況。
1>單擊“開(kāi)始”鍵并選擇運行;接著(zhù)在“運行”對話(huà)框中輸入cmd
注:有的可能是輸入command,也有可能有的windows不帶DOS系統。
2>鍵入Ping和您要測試的網(wǎng)址(比如:Ping -t)。然后回車(chē),便得到你訪(fǎng)問(wèn)服務(wù)器的回時(shí)間。
一般,“PING”命令會(huì )手動(dòng)進(jìn)行下去,直到你使它中止,如敲“ctrl +C”。如果你熟悉使用Telnet中PING的功能,并且你具有在不同網(wǎng)路上的Telnet賬號,你就可以以不同的網(wǎng)路為基礎,對其他的主機(IP地址或域名)進(jìn)行PING的測試,你可以比較在不同的訪(fǎng)問(wèn)點(diǎn)那些被訪(fǎng)問(wèn)主機的回應時(shí)間,并得到“丟包率”、平均回應時(shí)間等測試結果。
time:顯示了信息包抵達遠程主機后返回的時(shí)間。計算定位為微秒。數值越小速率越快。
lost:丟包情況。
TTL:生存時(shí)間 指定數據包被路由器遺棄之前容許通過(guò)的網(wǎng)關(guān)數目。
一個(gè)速率好的機房,首先丟包率不能超過(guò)1%,最好是1000個(gè)沒(méi)有一個(gè)丟包,這種是最理想的,但是這個(gè)不是絕對值,只要高于1%的都屬于不錯的路由情況了。
其次ping值要小,同城的聯(lián)通adsl ping平均值絕對不能超過(guò)20,一般在10,跨省的adsl ping平均值應當在20-40屬于正常。
第三點(diǎn)是ping值要均勻,如果最小的ping值只有4,但是不時(shí)的有幾十,最大有79的出現,這個(gè)就是路由不穩定的表現,同樣的聯(lián)通的adsl,盡管最小也有8,但是最大也只有9,就說(shuō)明路由穩定。
方法二: 查看登臺服務(wù)器上其它網(wǎng)站的打開(kāi)速率。
相同IP地址站點(diǎn)查詢(xún)網(wǎng)址:
通過(guò)前面的查詢(xún)工具可以看見(jiàn)和自已在同一臺服務(wù)器上的網(wǎng)站個(gè)數和網(wǎng)址??梢郧魄破渌W(wǎng)站是否打開(kāi)也慢呢。
2 電信和移動(dòng)互訪(fǎng)困局問(wèn)題。
如果空間打開(kāi)的速率時(shí)快時(shí)慢,甚至有時(shí)候打不開(kāi),那就是空間不穩定的誘因。要找你的空間商解決或換空間商了;如果是在有的地方打開(kāi)速率快,有的地方打開(kāi)速率慢,那應當是網(wǎng)路線(xiàn)路的問(wèn)題。電信線(xiàn)路用戶(hù)訪(fǎng)問(wèn)放到移動(dòng)服務(wù)器的網(wǎng)站,聯(lián)通線(xiàn)路用戶(hù)訪(fǎng)問(wèn)置于聯(lián)通服務(wù)器上的網(wǎng)站,相對來(lái)說(shuō)打開(kāi)速率肯定是比較慢。
解決辦法:如果選購空間的話(huà),建議訂購雙線(xiàn)空間或多線(xiàn)空間。這已不是新鮮的概念,大部分的虛擬主機商都有兩線(xiàn)或多線(xiàn)空間,價(jià)格高一些,但是從用戶(hù)體驗角度來(lái)說(shuō)是物有所值的。
3 從網(wǎng)站本身找問(wèn)題,網(wǎng)站的問(wèn)題包括網(wǎng)站程序設計,網(wǎng)頁(yè)設計結構,網(wǎng)頁(yè)內容三個(gè)部份。
網(wǎng)站程序設計:
1>網(wǎng)頁(yè)中若果有幻燈片播放療效的代碼,需要審查一下,是否嚴重拖慢網(wǎng)站打開(kāi)速率。
2>如果排除各方面緣由,可以找搞程序設計的相關(guān)專(zhuān)業(yè)人士,查看程序的設計結構是否合理。
網(wǎng)頁(yè)設計結構:
1>如果是table布局的網(wǎng)站,查看是否嵌套次數多很,或是一個(gè)大表格之后分成多個(gè)表格這樣的網(wǎng)頁(yè)布局。解決辦法:建議用div布局,配合css ,這樣除了打開(kāi)速率快,也有利于更改。
2>如果網(wǎng)站中有統計代碼,在線(xiàn)客服或是其它js代碼,看看是否放在了網(wǎng)頁(yè)代碼的最前面。解決辦法:最好盡可能的放在網(wǎng)頁(yè)代碼最后,當網(wǎng)站代碼加載完畢,才執行這種代碼。
3>可能有錯誤的代碼
一種情況是查看一下網(wǎng)頁(yè)代碼是否有不存在的圖片或文件路徑代碼。(如上圖所示用firebug聽(tīng)到20.jpg這個(gè)圖片,紅色顯示表示實(shí)際不存在,代碼中有調用它的代碼)因為本身圖片在空間中不存在,可是在執行代碼的時(shí)侯網(wǎng)站打開(kāi)速度慢 如何優(yōu)化,執行到這一行時(shí),卻要始終加載這個(gè)圖片,在細微程度上是會(huì )影響到網(wǎng)站的速率的。
另一種情況是從別的網(wǎng)站轉抄的特效javascript代碼,可能轉載不全,有許多網(wǎng)頁(yè)錯誤,造成網(wǎng)站打開(kāi)速率慢。解決辦法:修正網(wǎng)站上代碼錯誤。
4>盡量減低javascript的特效的使用。
如:鼠標特效、欄目特效、狀態(tài)欄特效等,這些特效的原理是先由服務(wù)器下載到你本地的機器,然后在本地機器上運行形成,如果觀(guān)看你網(wǎng)站的網(wǎng)友機器配置低的話(huà),要運行一段時(shí)間就能完成。
網(wǎng)頁(yè)內容:
1>查看網(wǎng)頁(yè)中是否有許多規格大的圖片存在,如果非要圖片療效來(lái)抒發(fā)的話(huà),可以把大圖片切分成多個(gè)小圖片。圖片進(jìn)行減重處理,可以讓字節數顯得較小,否則好多的圖片會(huì )占用好多空間又讓網(wǎng)站打開(kāi)速率顯得太慢??梢杂胮hotoshop、fireworks等畫(huà)圖軟件將圖片規格縮小,使圖片的質(zhì)量稍為減少一下,在圖片質(zhì)量和圖片大小之間找尋一個(gè)最佳的比列。
2>查看網(wǎng)頁(yè)中是否有規格大的flash文件存在,排除抒發(fā)療效外,盡量少用小型flash。
3>有的同學(xué)喜歡在網(wǎng)頁(yè)中加音樂(lè ),用戶(hù)一打開(kāi)網(wǎng)站,就有背景音樂(lè )播放,這樣的事情盡量不要做。
4>內容中過(guò)多地引用了其它網(wǎng)站的內容。如引用其他網(wǎng)站的圖片或其它內容,如果哪個(gè)網(wǎng)站的速率慢,或者那種網(wǎng)站的頁(yè)面早已不存在了,打開(kāi)的速率都會(huì )更慢。解決辦法:這樣問(wèn)題常見(jiàn)的情況是,友情鏈接交換中圖片鏈接真接鏈接別的網(wǎng)站的logo圖片,建議先把對方的logo圖片上傳到自已的網(wǎng)站空間中,然后加上鏈接。第二種情況是許多同學(xué)喜歡用iframe嵌套別的網(wǎng)站上的搜索,查ip等小功能模塊,建議少用這些方法。
查看網(wǎng)站中圖片、代碼等加載情況可以用 firefox瀏覽器的插件工具firebug 工具查看。
優(yōu)化加載速率的方式:
一、優(yōu)化圖片
幾乎沒(méi)有那個(gè)網(wǎng)頁(yè)上是沒(méi)有圖片的。如果你經(jīng)歷過(guò)56K狗的年代,你一定不會(huì )很喜歡有大量圖片的網(wǎng)站。因為加載那樣一個(gè)網(wǎng)頁(yè)會(huì )耗費大量的時(shí)間。
即使在現今,網(wǎng)絡(luò )帶寬有了好多的提升,56K狗漸漸淡出,優(yōu)化圖片以推動(dòng)網(wǎng)頁(yè)速率還是太有必要的。
優(yōu)化圖片包括降低圖片數、降低圖象質(zhì)量、使用恰當的格式。
1、減少圖片數:去除不必要的圖片。
2、降低圖象質(zhì)量:如果不是太必要,嘗試減少圖象的質(zhì)量,尤其是jpg格式,降低5%的質(zhì)量看起來(lái)變化不是很大,但文大小的變化是比較大的。
3、常識使用腳本文件取代療效:
比如一些web2.0的款式,如果使用ps制做,每個(gè)圖片基本會(huì )降低%5-%25的大小成本.
相反,使用javascript代碼來(lái)實(shí)現療效,僅僅只降低幾個(gè)字節.
二、圖像格式的選擇
一般在網(wǎng)頁(yè)上使用的圖片格式有三種,jpg、png、gif。三種格式的具體技術(shù)指標不是這篇文章探討的內容,我們只須要曉得在哪些時(shí)侯應當使用哪些格式,以降低網(wǎng)頁(yè)的加載時(shí)間。
1、JPG:一般用于展示景色、人物、藝術(shù)照的攝影作品。有時(shí)也用在筆記本截屏上。
2、GIF:提供的顏色較少,可用在一些對顏色要求不高的地方,比如網(wǎng)站logo、按鈕、表情等等。當然,gif的一個(gè)重要的應用是動(dòng)漫圖片。
3、PNG:PNG格式能提供透明背景,是一種專(zhuān)為網(wǎng)頁(yè)展示而發(fā)明的圖片格式。一般用于須要背景透明顯示或對圖象質(zhì)量要求較高的網(wǎng)頁(yè)上。
三、優(yōu)化CSS
CSS疊層樣式表使網(wǎng)頁(yè)加載上去更高效,瀏覽體驗也得到增強。有了CSS,表格布局的形式可以退職了。
但有時(shí)我們在寫(xiě)CSS的時(shí)侯會(huì )使用了一些比較羅嗦的句子,比如這句:
復制內容到剪貼板
代碼:
margin-top: 10px;
margin-right: 20px;
margin-bottom: 10px;
margin-left: 20px;
你可以將它簡(jiǎn)化為:
margin: 10px 20px 10px 20px;
又或則這句:
A paragraph ofdecorated text
Secondparagraph
Thirdparagraph
Forthparagraph
可以用div來(lái)包含:
A paragraph of decoratedtext
Secondparagraph
Thirdparagraph
Forthparagraph
四、網(wǎng)址后加斜杠
有些網(wǎng)址,比如當服務(wù)器收到這樣一個(gè)地址懇求的時(shí)侯,它須要耗費時(shí)間去確定這個(gè)地址的文件類(lèi)型。如果220是一個(gè)目錄,不妨在網(wǎng)址后多加一個(gè)斜杠,讓其弄成,這樣服務(wù)器才能一目了然地曉得要訪(fǎng)問(wèn)該目錄下的index或default文件,從而節約了加載時(shí)間。
五、標明高度和長(cháng)度
這點(diǎn)很重要,但很多人因為懶惰或其它緣由,總是將其忽略。當你在網(wǎng)頁(yè)上添加圖片或表格時(shí),你應當指定它們的高度和長(cháng)度,也就是height和width參數。如果瀏覽器沒(méi)有找到這兩個(gè)參數,它須要一邊下載圖片一邊估算大小,如果圖片好多,瀏覽器須要不斷地調整頁(yè)面。這不但影響速率,也影響瀏覽體驗。
下面是一個(gè)比較友好的圖片代碼:
復制內容到剪貼板
代碼:
當瀏覽器曉得了高度和長(cháng)度參數后,即使圖片暫時(shí)未能顯示,頁(yè)面上也會(huì )騰出圖片的空位,然后繼續加載前面的內容。從而加載時(shí)間快了,瀏覽體驗也更好了
六、減少http請求
當瀏覽者打開(kāi)某個(gè)網(wǎng)頁(yè),瀏覽器會(huì )發(fā)出好多對象懇求(圖像、腳本等等),視乎網(wǎng)路延時(shí)情況,每個(gè)對象加載就會(huì )有所延后。如果網(wǎng)頁(yè)上對象好多,這可以須要耗費大量的時(shí)間。
因此,要為http懇求減負。如何減負?
1、去除一些不必要的對象。
2、將臨近的兩張圖片合成一張。
3、合并CSS文件
看看下邊這段代碼,需要加載三個(gè)CSS文件:
我們可以將其合成一個(gè):
從而降低http懇求。
七、其它小技巧
1、去除不必要加載項。
2、如果在網(wǎng)頁(yè)上嵌入了其它網(wǎng)站的widget,如果有選擇余地,一定要選擇速率快的。
3、盡量用圖片取代flash,這對SEO也有用處。
4、有些內容可以靜態(tài)化就將其靜態(tài)化,以降低服務(wù)器的負擔。
5、統計代碼放到頁(yè)尾(或者使用延遲加載)。 查看全部
如果你的網(wǎng)站打開(kāi)速率過(guò)慢網(wǎng)站打開(kāi)速度慢 如何優(yōu)化,而你又不知道該怎么解決,那么這篇文章是非看不可了。手把手的教你怎么排查網(wǎng)站打開(kāi)慢的緣由,以及優(yōu)化方式。
排查網(wǎng)站打開(kāi)速率慢的緣由:
1 網(wǎng)站服務(wù)器速率或租用空間所在服務(wù)器速率
服務(wù)器空間速率是網(wǎng)站打開(kāi)速率快的硬件基礎,也是先決條件。否則縱使你網(wǎng)站頁(yè)面設計的特別"苗條",網(wǎng)站打開(kāi)速率也會(huì )打折扣。解決辦法:要找你的空間商解決或換空間商。
如何測量服務(wù)器速率快慢呢?
方法一: ping命令看聯(lián)接到服務(wù)器的時(shí)間和丟包情況。
1>單擊“開(kāi)始”鍵并選擇運行;接著(zhù)在“運行”對話(huà)框中輸入cmd
注:有的可能是輸入command,也有可能有的windows不帶DOS系統。
2>鍵入Ping和您要測試的網(wǎng)址(比如:Ping -t)。然后回車(chē),便得到你訪(fǎng)問(wèn)服務(wù)器的回時(shí)間。
一般,“PING”命令會(huì )手動(dòng)進(jìn)行下去,直到你使它中止,如敲“ctrl +C”。如果你熟悉使用Telnet中PING的功能,并且你具有在不同網(wǎng)路上的Telnet賬號,你就可以以不同的網(wǎng)路為基礎,對其他的主機(IP地址或域名)進(jìn)行PING的測試,你可以比較在不同的訪(fǎng)問(wèn)點(diǎn)那些被訪(fǎng)問(wèn)主機的回應時(shí)間,并得到“丟包率”、平均回應時(shí)間等測試結果。
time:顯示了信息包抵達遠程主機后返回的時(shí)間。計算定位為微秒。數值越小速率越快。
lost:丟包情況。
TTL:生存時(shí)間 指定數據包被路由器遺棄之前容許通過(guò)的網(wǎng)關(guān)數目。
一個(gè)速率好的機房,首先丟包率不能超過(guò)1%,最好是1000個(gè)沒(méi)有一個(gè)丟包,這種是最理想的,但是這個(gè)不是絕對值,只要高于1%的都屬于不錯的路由情況了。
其次ping值要小,同城的聯(lián)通adsl ping平均值絕對不能超過(guò)20,一般在10,跨省的adsl ping平均值應當在20-40屬于正常。
第三點(diǎn)是ping值要均勻,如果最小的ping值只有4,但是不時(shí)的有幾十,最大有79的出現,這個(gè)就是路由不穩定的表現,同樣的聯(lián)通的adsl,盡管最小也有8,但是最大也只有9,就說(shuō)明路由穩定。
方法二: 查看登臺服務(wù)器上其它網(wǎng)站的打開(kāi)速率。
相同IP地址站點(diǎn)查詢(xún)網(wǎng)址:
通過(guò)前面的查詢(xún)工具可以看見(jiàn)和自已在同一臺服務(wù)器上的網(wǎng)站個(gè)數和網(wǎng)址??梢郧魄破渌W(wǎng)站是否打開(kāi)也慢呢。
2 電信和移動(dòng)互訪(fǎng)困局問(wèn)題。
如果空間打開(kāi)的速率時(shí)快時(shí)慢,甚至有時(shí)候打不開(kāi),那就是空間不穩定的誘因。要找你的空間商解決或換空間商了;如果是在有的地方打開(kāi)速率快,有的地方打開(kāi)速率慢,那應當是網(wǎng)路線(xiàn)路的問(wèn)題。電信線(xiàn)路用戶(hù)訪(fǎng)問(wèn)放到移動(dòng)服務(wù)器的網(wǎng)站,聯(lián)通線(xiàn)路用戶(hù)訪(fǎng)問(wèn)置于聯(lián)通服務(wù)器上的網(wǎng)站,相對來(lái)說(shuō)打開(kāi)速率肯定是比較慢。
解決辦法:如果選購空間的話(huà),建議訂購雙線(xiàn)空間或多線(xiàn)空間。這已不是新鮮的概念,大部分的虛擬主機商都有兩線(xiàn)或多線(xiàn)空間,價(jià)格高一些,但是從用戶(hù)體驗角度來(lái)說(shuō)是物有所值的。
3 從網(wǎng)站本身找問(wèn)題,網(wǎng)站的問(wèn)題包括網(wǎng)站程序設計,網(wǎng)頁(yè)設計結構,網(wǎng)頁(yè)內容三個(gè)部份。
網(wǎng)站程序設計:
1>網(wǎng)頁(yè)中若果有幻燈片播放療效的代碼,需要審查一下,是否嚴重拖慢網(wǎng)站打開(kāi)速率。
2>如果排除各方面緣由,可以找搞程序設計的相關(guān)專(zhuān)業(yè)人士,查看程序的設計結構是否合理。
網(wǎng)頁(yè)設計結構:
1>如果是table布局的網(wǎng)站,查看是否嵌套次數多很,或是一個(gè)大表格之后分成多個(gè)表格這樣的網(wǎng)頁(yè)布局。解決辦法:建議用div布局,配合css ,這樣除了打開(kāi)速率快,也有利于更改。
2>如果網(wǎng)站中有統計代碼,在線(xiàn)客服或是其它js代碼,看看是否放在了網(wǎng)頁(yè)代碼的最前面。解決辦法:最好盡可能的放在網(wǎng)頁(yè)代碼最后,當網(wǎng)站代碼加載完畢,才執行這種代碼。
3>可能有錯誤的代碼
一種情況是查看一下網(wǎng)頁(yè)代碼是否有不存在的圖片或文件路徑代碼。(如上圖所示用firebug聽(tīng)到20.jpg這個(gè)圖片,紅色顯示表示實(shí)際不存在,代碼中有調用它的代碼)因為本身圖片在空間中不存在,可是在執行代碼的時(shí)侯網(wǎng)站打開(kāi)速度慢 如何優(yōu)化,執行到這一行時(shí),卻要始終加載這個(gè)圖片,在細微程度上是會(huì )影響到網(wǎng)站的速率的。
另一種情況是從別的網(wǎng)站轉抄的特效javascript代碼,可能轉載不全,有許多網(wǎng)頁(yè)錯誤,造成網(wǎng)站打開(kāi)速率慢。解決辦法:修正網(wǎng)站上代碼錯誤。
4>盡量減低javascript的特效的使用。
如:鼠標特效、欄目特效、狀態(tài)欄特效等,這些特效的原理是先由服務(wù)器下載到你本地的機器,然后在本地機器上運行形成,如果觀(guān)看你網(wǎng)站的網(wǎng)友機器配置低的話(huà),要運行一段時(shí)間就能完成。
網(wǎng)頁(yè)內容:
1>查看網(wǎng)頁(yè)中是否有許多規格大的圖片存在,如果非要圖片療效來(lái)抒發(fā)的話(huà),可以把大圖片切分成多個(gè)小圖片。圖片進(jìn)行減重處理,可以讓字節數顯得較小,否則好多的圖片會(huì )占用好多空間又讓網(wǎng)站打開(kāi)速率顯得太慢??梢杂胮hotoshop、fireworks等畫(huà)圖軟件將圖片規格縮小,使圖片的質(zhì)量稍為減少一下,在圖片質(zhì)量和圖片大小之間找尋一個(gè)最佳的比列。
2>查看網(wǎng)頁(yè)中是否有規格大的flash文件存在,排除抒發(fā)療效外,盡量少用小型flash。
3>有的同學(xué)喜歡在網(wǎng)頁(yè)中加音樂(lè ),用戶(hù)一打開(kāi)網(wǎng)站,就有背景音樂(lè )播放,這樣的事情盡量不要做。
4>內容中過(guò)多地引用了其它網(wǎng)站的內容。如引用其他網(wǎng)站的圖片或其它內容,如果哪個(gè)網(wǎng)站的速率慢,或者那種網(wǎng)站的頁(yè)面早已不存在了,打開(kāi)的速率都會(huì )更慢。解決辦法:這樣問(wèn)題常見(jiàn)的情況是,友情鏈接交換中圖片鏈接真接鏈接別的網(wǎng)站的logo圖片,建議先把對方的logo圖片上傳到自已的網(wǎng)站空間中,然后加上鏈接。第二種情況是許多同學(xué)喜歡用iframe嵌套別的網(wǎng)站上的搜索,查ip等小功能模塊,建議少用這些方法。
查看網(wǎng)站中圖片、代碼等加載情況可以用 firefox瀏覽器的插件工具firebug 工具查看。
優(yōu)化加載速率的方式:
一、優(yōu)化圖片
幾乎沒(méi)有那個(gè)網(wǎng)頁(yè)上是沒(méi)有圖片的。如果你經(jīng)歷過(guò)56K狗的年代,你一定不會(huì )很喜歡有大量圖片的網(wǎng)站。因為加載那樣一個(gè)網(wǎng)頁(yè)會(huì )耗費大量的時(shí)間。
即使在現今,網(wǎng)絡(luò )帶寬有了好多的提升,56K狗漸漸淡出,優(yōu)化圖片以推動(dòng)網(wǎng)頁(yè)速率還是太有必要的。
優(yōu)化圖片包括降低圖片數、降低圖象質(zhì)量、使用恰當的格式。
1、減少圖片數:去除不必要的圖片。
2、降低圖象質(zhì)量:如果不是太必要,嘗試減少圖象的質(zhì)量,尤其是jpg格式,降低5%的質(zhì)量看起來(lái)變化不是很大,但文大小的變化是比較大的。
3、常識使用腳本文件取代療效:
比如一些web2.0的款式,如果使用ps制做,每個(gè)圖片基本會(huì )降低%5-%25的大小成本.
相反,使用javascript代碼來(lái)實(shí)現療效,僅僅只降低幾個(gè)字節.
二、圖像格式的選擇
一般在網(wǎng)頁(yè)上使用的圖片格式有三種,jpg、png、gif。三種格式的具體技術(shù)指標不是這篇文章探討的內容,我們只須要曉得在哪些時(shí)侯應當使用哪些格式,以降低網(wǎng)頁(yè)的加載時(shí)間。
1、JPG:一般用于展示景色、人物、藝術(shù)照的攝影作品。有時(shí)也用在筆記本截屏上。
2、GIF:提供的顏色較少,可用在一些對顏色要求不高的地方,比如網(wǎng)站logo、按鈕、表情等等。當然,gif的一個(gè)重要的應用是動(dòng)漫圖片。
3、PNG:PNG格式能提供透明背景,是一種專(zhuān)為網(wǎng)頁(yè)展示而發(fā)明的圖片格式。一般用于須要背景透明顯示或對圖象質(zhì)量要求較高的網(wǎng)頁(yè)上。
三、優(yōu)化CSS
CSS疊層樣式表使網(wǎng)頁(yè)加載上去更高效,瀏覽體驗也得到增強。有了CSS,表格布局的形式可以退職了。
但有時(shí)我們在寫(xiě)CSS的時(shí)侯會(huì )使用了一些比較羅嗦的句子,比如這句:
復制內容到剪貼板
代碼:
margin-top: 10px;
margin-right: 20px;
margin-bottom: 10px;
margin-left: 20px;
你可以將它簡(jiǎn)化為:
margin: 10px 20px 10px 20px;
又或則這句:
A paragraph ofdecorated text
Secondparagraph
Thirdparagraph
Forthparagraph
可以用div來(lái)包含:
A paragraph of decoratedtext
Secondparagraph
Thirdparagraph
Forthparagraph
四、網(wǎng)址后加斜杠
有些網(wǎng)址,比如當服務(wù)器收到這樣一個(gè)地址懇求的時(shí)侯,它須要耗費時(shí)間去確定這個(gè)地址的文件類(lèi)型。如果220是一個(gè)目錄,不妨在網(wǎng)址后多加一個(gè)斜杠,讓其弄成,這樣服務(wù)器才能一目了然地曉得要訪(fǎng)問(wèn)該目錄下的index或default文件,從而節約了加載時(shí)間。
五、標明高度和長(cháng)度
這點(diǎn)很重要,但很多人因為懶惰或其它緣由,總是將其忽略。當你在網(wǎng)頁(yè)上添加圖片或表格時(shí),你應當指定它們的高度和長(cháng)度,也就是height和width參數。如果瀏覽器沒(méi)有找到這兩個(gè)參數,它須要一邊下載圖片一邊估算大小,如果圖片好多,瀏覽器須要不斷地調整頁(yè)面。這不但影響速率,也影響瀏覽體驗。
下面是一個(gè)比較友好的圖片代碼:
復制內容到剪貼板
代碼:
當瀏覽器曉得了高度和長(cháng)度參數后,即使圖片暫時(shí)未能顯示,頁(yè)面上也會(huì )騰出圖片的空位,然后繼續加載前面的內容。從而加載時(shí)間快了,瀏覽體驗也更好了
六、減少http請求
當瀏覽者打開(kāi)某個(gè)網(wǎng)頁(yè),瀏覽器會(huì )發(fā)出好多對象懇求(圖像、腳本等等),視乎網(wǎng)路延時(shí)情況,每個(gè)對象加載就會(huì )有所延后。如果網(wǎng)頁(yè)上對象好多,這可以須要耗費大量的時(shí)間。
因此,要為http懇求減負。如何減負?
1、去除一些不必要的對象。
2、將臨近的兩張圖片合成一張。
3、合并CSS文件
看看下邊這段代碼,需要加載三個(gè)CSS文件:
我們可以將其合成一個(gè):
從而降低http懇求。
七、其它小技巧
1、去除不必要加載項。
2、如果在網(wǎng)頁(yè)上嵌入了其它網(wǎng)站的widget,如果有選擇余地,一定要選擇速率快的。
3、盡量用圖片取代flash,這對SEO也有用處。
4、有些內容可以靜態(tài)化就將其靜態(tài)化,以降低服務(wù)器的負擔。
5、統計代碼放到頁(yè)尾(或者使用延遲加載)。
火車(chē)頭網(wǎng)頁(yè)正則提取電話(huà) – 火車(chē)頭正則采集電話(huà)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 727 次瀏覽 ? 2020-05-25 08:01
分分鐘搞定,咱們先熟悉一下火車(chē)頭的規則。
(?<content>[\s\S]*?)
Content //代表內容
? //表示匹配0次或則1次
\s //匹配所有空白字符
\S //匹配所有非空白字符
* //修飾匹配次數為 0 次或任意次
火車(chē)頭采集手機號的正則:(?<content>1[34578]{1}[0-9]{9})
火車(chē)頭采集郵箱的正則:(?<content>[\w\-\.]+@[\w\-\.]+\.\w+)
--------------------下方是正則表達式說(shuō)明。-----------------------
表1.常用的元字符代碼說(shuō)明
. 匹配除換行符以外的任意字符
\w 匹配字母或數字或頓號或漢字
\s 匹配任意的空白符
\d 匹配數字
\b 匹配詞組的開(kāi)始或結束
^ 匹配字符串的開(kāi)始$匹配字符串的結束
表2.常用的限定符代碼/語(yǔ)法說(shuō)明
* 重復零次或更多次
+ 重復一次或更多次
? 重復零次或一次
{n} 重復n次
{n,} 重復n次或更多次
{n,m} 重復n到m次
表3.常用的反義代碼代碼/語(yǔ)法說(shuō)明
\W 匹配任意不是字母,數字,下劃線(xiàn),漢字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非數字的字符
\B 匹配不是詞組開(kāi)頭或結束的位置
[^x] 匹配不僅x以外的任意字符
[^aeiou] 匹配不僅aeiou這幾個(gè)字母以外的任意字符
常用分組句型
表5.懶惰限定符代碼/語(yǔ)法說(shuō)明
*? 重復任意次,但盡可能少重復
+? 重復1次或更多次,但盡可能少重復
?? 重復0次或1次,但盡可能少重復
{n,m}? 重復n到m次,但盡可能少重復
{n,}? 重復n次以上,但盡可能少重復
表7.尚未詳盡討論的句型代碼/語(yǔ)法說(shuō)明
\a 報案字符(打印它的療效是筆記本嘀一聲)
\b 一般是詞組分界位置,但若果在字符類(lèi)里使用代表退格
\t 制表符火車(chē)采集器 手機正則表達式,Tab
\r 回車(chē)
\v 豎向制表符
\f 換頁(yè)符
\n 換行符
\e Escape
\0nn ASCII代碼中八進(jìn)制代碼為nn的字符
\xnn ASCII代碼中十六進(jìn)制代碼為nn的字符
\unnnn Unicode代碼中十六進(jìn)制代碼為nnnn的字符
\cN ASCII控制字符。比如\cC代表Ctrl+C
\A 字符串開(kāi)頭(類(lèi)似^,但不受處理多行選項的影響)
\Z 字符串結尾或行尾(不受處理多行選項的影響)
\z 字符串結尾(類(lèi)似$火車(chē)采集器 手機正則表達式,但不受處理多行選項的影響)
\G 當前搜索的開(kāi)頭
\p{name} Unicode中命名為name的字符類(lèi),例如\p{IsGreek}
(?>exp) 貪婪子表達式(?<x>-<y>exp)平衡組
(?im-nsx:exp) 在子表達式exp中改變處理選項
(?im-nsx) 為表達式旁邊的部份改變處理選項
(?(exp)yes|no) 把exp當成零寬正向先行斷定,如果在這個(gè)位置能匹配,使用yes作為此組的表達式;否則使用no(?(exp)yes)同上,只是使用空表達式作為no
(?(name)yes|no) 假如命名為name的組捕獲到了內容,使用yes作為表達式;否則使用no
(?(name)yes) 同上,只是使用空表達式作為no 查看全部
話(huà)說(shuō)好長(cháng)時(shí)間不用火車(chē)頭了。都有點(diǎn)蒙逼忘了。記得曾經(jīng)用火車(chē)頭采集論壇做垃圾文章網(wǎng)站,都多少年前的事情了,如今須要采集一些手機號,想想懶得寫(xiě)PHP,有現成的工具為何不用對吧,沒(méi)毛病。
分分鐘搞定,咱們先熟悉一下火車(chē)頭的規則。
(?<content>[\s\S]*?)
Content //代表內容
? //表示匹配0次或則1次
\s //匹配所有空白字符
\S //匹配所有非空白字符
* //修飾匹配次數為 0 次或任意次
火車(chē)頭采集手機號的正則:(?<content>1[34578]{1}[0-9]{9})
火車(chē)頭采集郵箱的正則:(?<content>[\w\-\.]+@[\w\-\.]+\.\w+)
--------------------下方是正則表達式說(shuō)明。-----------------------
表1.常用的元字符代碼說(shuō)明
. 匹配除換行符以外的任意字符
\w 匹配字母或數字或頓號或漢字
\s 匹配任意的空白符
\d 匹配數字
\b 匹配詞組的開(kāi)始或結束
^ 匹配字符串的開(kāi)始$匹配字符串的結束
表2.常用的限定符代碼/語(yǔ)法說(shuō)明
* 重復零次或更多次
+ 重復一次或更多次
? 重復零次或一次
{n} 重復n次
{n,} 重復n次或更多次
{n,m} 重復n到m次
表3.常用的反義代碼代碼/語(yǔ)法說(shuō)明
\W 匹配任意不是字母,數字,下劃線(xiàn),漢字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非數字的字符
\B 匹配不是詞組開(kāi)頭或結束的位置
[^x] 匹配不僅x以外的任意字符
[^aeiou] 匹配不僅aeiou這幾個(gè)字母以外的任意字符
常用分組句型
表5.懶惰限定符代碼/語(yǔ)法說(shuō)明
*? 重復任意次,但盡可能少重復
+? 重復1次或更多次,但盡可能少重復
?? 重復0次或1次,但盡可能少重復
{n,m}? 重復n到m次,但盡可能少重復
{n,}? 重復n次以上,但盡可能少重復
表7.尚未詳盡討論的句型代碼/語(yǔ)法說(shuō)明
\a 報案字符(打印它的療效是筆記本嘀一聲)
\b 一般是詞組分界位置,但若果在字符類(lèi)里使用代表退格
\t 制表符火車(chē)采集器 手機正則表達式,Tab
\r 回車(chē)
\v 豎向制表符
\f 換頁(yè)符
\n 換行符
\e Escape
\0nn ASCII代碼中八進(jìn)制代碼為nn的字符
\xnn ASCII代碼中十六進(jìn)制代碼為nn的字符
\unnnn Unicode代碼中十六進(jìn)制代碼為nnnn的字符
\cN ASCII控制字符。比如\cC代表Ctrl+C
\A 字符串開(kāi)頭(類(lèi)似^,但不受處理多行選項的影響)
\Z 字符串結尾或行尾(不受處理多行選項的影響)
\z 字符串結尾(類(lèi)似$火車(chē)采集器 手機正則表達式,但不受處理多行選項的影響)
\G 當前搜索的開(kāi)頭
\p{name} Unicode中命名為name的字符類(lèi),例如\p{IsGreek}
(?>exp) 貪婪子表達式(?<x>-<y>exp)平衡組
(?im-nsx:exp) 在子表達式exp中改變處理選項
(?im-nsx) 為表達式旁邊的部份改變處理選項
(?(exp)yes|no) 把exp當成零寬正向先行斷定,如果在這個(gè)位置能匹配,使用yes作為此組的表達式;否則使用no(?(exp)yes)同上,只是使用空表達式作為no
(?(name)yes|no) 假如命名為name的組捕獲到了內容,使用yes作為表達式;否則使用no
(?(name)yes) 同上,只是使用空表達式作為no
爬蟲(chóng)基本原理
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 371 次瀏覽 ? 2020-05-14 08:08
本文分為如下幾個(gè)部份
簡(jiǎn)單理解網(wǎng)路爬蟲(chóng)就是手動(dòng)抓取網(wǎng)頁(yè)信息的代碼,可以簡(jiǎn)單理解成取代繁雜的復制粘貼操作的手段。
首先必須申明,爬蟲(chóng)的對象必須是你早已聽(tīng)到的網(wǎng)頁(yè),比如你不能說(shuō)你想找到知乎上那個(gè)用戶(hù)的關(guān)注人數最多,就希望通過(guò)寫(xiě)一個(gè)爬蟲(chóng)來(lái)幫你爬到答案。你必須明晰地曉得這個(gè)人,找到他的主頁(yè),然后才會(huì )用爬蟲(chóng)來(lái)抓取他頁(yè)面上的信息。
下面我們用一個(gè)簡(jiǎn)單的事例來(lái)展示爬蟲(chóng)的工作流程。感覺(jué)多數教程第一篇都使用的是豆瓣top250,我們這兒換一個(gè),抓取CSDN首頁(yè)的文章標題,鏈接在這里,頁(yè)面樣子是這樣的
抓取標題完整代碼如下
import requests # 導入網(wǎng)頁(yè)請求庫
from bs4 import BeautifulSoup # 導入網(wǎng)頁(yè)解析庫
# 傳入URL
r = requests.get('https://www.csdn.net/')
# 解析URL
soup = BeautifulSoup(r.text, 'html.parser')
content_list = soup.find_all('div', attrs = {'class': 'title'})
for content in content_list:
print(content.h2.a.text)
這樣才會(huì )復印出所有標題,展示一部分如下
上述過(guò)程是一個(gè)最簡(jiǎn)單的完整爬蟲(chóng)流程,可以看出它的功能就是把這些標題復制粘貼到一起,免不僅自動(dòng)操作的冗長(cháng)。其實(shí)爬蟲(chóng)通常就是做這些事的,比如我們須要用鏈家的數據進(jìn)行剖析,看到鏈家的頁(yè)面是這樣的
我們想獲取每位房屋的標題、幾室幾廳、多少平米、朝向、裝修、價(jià)格等等數組(即指標),就可以通過(guò)爬蟲(chóng)進(jìn)行定位,自動(dòng)化抓取這100頁(yè)所有房屋的那些數組信息。比如100頁(yè)里有2000個(gè)房屋,總共抓取10個(gè)數組,爬蟲(chóng)運行結束就可以得到一個(gè)2000行10列的excel表格。
注:如果還沒(méi)有安裝里面兩個(gè)庫的讀者可以在命令行下分別運行下邊兩行命令完成安裝
pip install requests
pip install beautifulsoup4
知道了爬蟲(chóng)是拿來(lái)干哪些的以后,我們來(lái)介紹一些最常見(jiàn)到的概念
1.URL
URL英文稱(chēng)為統一資源定位符,其實(shí)可以理解成網(wǎng)頁(yè)的鏈接,比如前面的就是一個(gè)URL。
但是更廣義的URL不只是我們常聽(tīng)到的網(wǎng)頁(yè)資源鏈接,而是資源在網(wǎng)頁(yè)中的定位標示。我們一般說(shuō)的網(wǎng)頁(yè)是一個(gè)資源,網(wǎng)頁(yè)中加載的每一張圖片也是一個(gè)資源,它們在互聯(lián)網(wǎng)中也有惟一的定位URL。比如我們從CSDN網(wǎng)頁(yè)上隨意找一張圖片
這個(gè)鏈接就是這個(gè)圖片資源的定位符,將這個(gè)鏈接輸入瀏覽器中都會(huì )顯示出這張圖片網(wǎng)頁(yè)爬蟲(chóng),所以說(shuō)這張圖片也對應一個(gè)URL。
不過(guò)曉得如此回事就好,我們一般所說(shuō)的傳入URL指的就是把網(wǎng)頁(yè)的鏈接傳進(jìn)去。上面代碼中
r = requests.get('https://www.csdn.net/')
就是在將URL傳入懇求函數。
2.網(wǎng)頁(yè)懇求
說(shuō)到網(wǎng)頁(yè)懇求,就有必要講一下我們平時(shí)瀏覽網(wǎng)頁(yè)時(shí),信息交互的模式大約是什么樣的。我們平時(shí)用瀏覽器瀏覽網(wǎng)頁(yè)的時(shí)侯,鼠標點(diǎn)了一個(gè)鏈接,比如你如今點(diǎn)擊這兒,其實(shí)瀏覽器幫你向這個(gè)網(wǎng)頁(yè)發(fā)送了懇求(request),維護網(wǎng)頁(yè)的服務(wù)器(可以理解為CSDN公司里的一臺筆記本,在維護這CSDN上的各個(gè)網(wǎng)頁(yè))收到了這個(gè)懇求,判定這個(gè)懇求是有效的,于是返回了一些響應信息(response)到瀏覽器,瀏覽器將這種信息進(jìn)行渲染(可以理解成 處理成人能讀懂的樣子),就是你看見(jiàn)的網(wǎng)頁(yè)的樣子了。發(fā)送懇求與接收懇求的過(guò)程就和 發(fā)陌陌和收到回復的過(guò)程類(lèi)似。
而如今我們要用代碼來(lái)模擬滑鼠點(diǎn)擊的過(guò)程。上面的requests.get就是使代碼幫你向這個(gè)網(wǎng)頁(yè)發(fā)送了這個(gè)懇求,如果懇求被判斷為有效,網(wǎng)頁(yè)的服務(wù)器也會(huì )把信息傳送給你,傳送回去的這種信息就被形參到變量r之中。所以這個(gè)變量r里就包含有我們想要的信息了,也包括這些我們想要提取的標題。
我們可以print(r.text)看一下上面有哪些東西
我們再看一下網(wǎng)頁(yè)的源代碼(如何讀懂這個(gè)源碼,以及這個(gè)源碼如何查看下一節HTML會(huì )詳盡提到)
源代碼和r.text雖然是一模一樣的東西。r.text雖然就是一個(gè)字符串,字符串中有我們剛才抓取到的所有標題,我們只要通過(guò)字符串匹配方式(比如正則表達式)將她們提取下來(lái)就可以了。這樣說(shuō)是不是覺(jué)得爬蟲(chóng)十分簡(jiǎn)單呢?只要這樣傻蛋操作
r = requests.get('https://www.csdn.net/')
再直接從r.text字符串中提取信息即可。其實(shí)爬蟲(chóng)就是那么簡(jiǎn)單。
但是解析是如何回事呢,為什么剛才不直接用正則而要用bs4呢?因為便捷,但是正則也是完全可以的,只是相對麻煩一些、需要寫(xiě)更多的代碼而已。
3.網(wǎng)頁(yè)解析
網(wǎng)頁(yè)解析雖然就從網(wǎng)頁(yè)服務(wù)器返回給我們的信息中提取我們想要數據的過(guò)程。其實(shí)使用正則表達式提取我們要的標題的過(guò)程也可以稱(chēng)為網(wǎng)頁(yè)解析。
因為當前絕大多數網(wǎng)頁(yè)源代碼都是用HTML語(yǔ)言寫(xiě)的,而HTML語(yǔ)言時(shí)特別有規律性的,比如我們要的所有文章標題都具有相同結構,也就是說(shuō)它周?chē)淖址际鞘诸?lèi)似的,這樣我們能夠批量獲取。所以就有大鱷專(zhuān)門(mén)封裝了怎樣從HTML代碼中提取特定文本的庫,也就是我們平常說(shuō)的網(wǎng)頁(yè)解析庫,如bs4 lxml pyquery等,其實(shí)把她們當作處理字符串的就可以了。
為了更清楚地了解怎樣對網(wǎng)頁(yè)進(jìn)行解析,我們須要先簡(jiǎn)略把握HTML代碼的結構。
引用維基百科中的一段話(huà)來(lái)介紹HTML
超文本標記語(yǔ)言(英語(yǔ):HyperText Markup Language,簡(jiǎn)稱(chēng):HTML)是一種用于創(chuàng )建網(wǎng)頁(yè)的標準標記語(yǔ)言。HTML是一種基礎技術(shù),常與CSS、JavaScript一起被諸多網(wǎng)站用于設計令人賞心悅目的網(wǎng)頁(yè)、網(wǎng)頁(yè)應用程序以及移動(dòng)應用程序的用戶(hù)界面[1]。網(wǎng)頁(yè)瀏覽器可以讀取HTML文件,并將其渲染成可視化網(wǎng)頁(yè)。
為了使讀者對HTML有更清楚的認識,我們來(lái)寫(xiě)一點(diǎn)簡(jiǎn)單的HTML代碼。用文本編輯器(記事本也可以)創(chuàng )建一個(gè)名子為a.html的文件,在里面寫(xiě)下如下代碼
<!DOCTYPE html>
<html>
<head>
<title>爬蟲(chóng)基本原理</title>
</head>
<body>
<h1>HTML介紹</h1>
<p>第一段</p>
<p>第二段</p>
</body>
</html>
保存,然后你雙擊這個(gè)文件,就會(huì )手動(dòng)用瀏覽器打開(kāi),然后你還能見(jiàn)到下邊這個(gè)樣子的頁(yè)面
你若果根據我的操作來(lái)做的話(huà),你已然創(chuàng )建了一個(gè)簡(jiǎn)單的網(wǎng)頁(yè),現在你看見(jiàn)的所有網(wǎng)頁(yè)都是這樣設計的,只是比你的復雜一點(diǎn)而已,不信你去瞧瞧剛剛截圖出來(lái)的網(wǎng)頁(yè)源代碼圖片。
接下來(lái),我們來(lái)看一下HTML語(yǔ)言的特性。最重要的一點(diǎn)是網(wǎng)頁(yè)爬蟲(chóng),文本都是被標簽(h1標簽 p標簽)夾在中間的,而這種標簽都是特定的,有專(zhuān)門(mén)用途的。比如<h1>就表示一級標題,包在上面的文本自然會(huì )被放大顯示;而<p>標簽則表示段落。
再看里面的源代碼截圖,head meta script title div li每一個(gè)都是標簽,層層嵌套。我們完全不需要曉得總共有什么種標簽,也不需要曉得這種標簽都是拿來(lái)干哪些的,我們只要找到我們要的信息包含在哪些標簽里就行了。比如使用正則表達式就直接用<p>(.*?)</p>就可以把上面的內容提取下來(lái)了。
但是事實(shí)似乎沒(méi)有這么簡(jiǎn)單,看里面的截圖標簽如何是這樣的<nav id="nav" class="clearfix">?其實(shí)這是一個(gè)<nav>標簽,后面的id class是這個(gè)標簽的屬性。
為什么要給標簽設置屬性呢?我們先考慮這樣一個(gè)問(wèn)題:我們看見(jiàn)的網(wǎng)頁(yè)千差萬(wàn)別,文字的顏色字體等都不一樣,這是如何設置的呢?答案是使用css樣式。
css句子類(lèi)似這樣
h1 {
color: white;
text-align: center;
}
p {
font-family: verdana;
font-size: 20px;
}
即設置對應標簽的顏色、字體、大小、居中等。而當有的段落使用這個(gè)字體,有的段落使用哪個(gè)字體如何辦呢?css這樣設置
p.test1 {
font-size: 20px;
}
p.test2 {
font-size: 15px;
}
在HTML代碼中則這樣寫(xiě)
<p class="test1">20px大小的字</p>
<p class="test2">15px大小的字</p>
所以不同屬性就是為了分辨相同標簽用的,這相當于給標簽進(jìn)行了分類(lèi),在統一設計款式上更方便,同時(shí)對于我們依照屬性定位我們想要內容的位置雖然也是更方便了。這里要說(shuō)明一下,class id這兩個(gè)屬性比較特殊,用的也最多,所以各自弄了一個(gè)快捷鍵來(lái)表示,class用.,id用#。
做爬蟲(chóng)不需要了解剛才編撰的css代碼內容放到那里之類(lèi)的問(wèn)題,也不需要了解css代碼設置了哪些,我們只會(huì )和HTML打交道,所以只要理解HTML中屬性的作用就可以了。
如果想要更進(jìn)一步了解HTML和CSS,可以到w3school網(wǎng)站學(xué)習。
現在你就早已具備了解析網(wǎng)頁(yè)須要的全部HTML知識了。我們通常就是依據標簽名配合屬性值來(lái)定位我們想要資源的位置的,其他的都不用管。這時(shí),我們再來(lái)看爬蟲(chóng)的解析代碼
把上面的代碼再粘貼一遍如下
import requests # 導入網(wǎng)頁(yè)請求庫
from bs4 import BeautifulSoup # 導入網(wǎng)頁(yè)解析庫
# 傳入URL
r = requests.get('https://www.csdn.net/')
# 解析URL
soup = BeautifulSoup(r.text, 'html.parser')
content_list = soup.find_all('div', attrs = {'class': 'title'})
for content in content_list:
print(content.h2.a.text)
解釋一下里面代碼的過(guò)程
可以看見(jiàn)里面的代碼十分簡(jiǎn)約,思路清晰,讀者可以自己想一想假如要用正則表達式怎么匹配那些標簽,會(huì )發(fā)覺(jué)代碼冗長(cháng)好多,雖然它也有更快的優(yōu)勢。
那么我們是如何曉得要找尋什么樣屬性的div標簽,為什么要找h2 a標簽而不是其他的呢?這就要去剖析網(wǎng)頁(yè)的源代碼了。而這個(gè)過(guò)程也十分簡(jiǎn)單。
我們如今用谷歌瀏覽器打開(kāi)CSDN這個(gè)網(wǎng)站,找一個(gè)空白的位置右鍵-查看網(wǎng)頁(yè)源代碼,這時(shí)才會(huì )打開(kāi)一個(gè)新的頁(yè)面這個(gè)頁(yè)面就是這個(gè)網(wǎng)站的HTML源代碼了,我們可以通過(guò)這個(gè)頁(yè)面來(lái)看我們要的信息在那里,但是覺(jué)得十分不便捷,因為有太多無(wú)用的信息做干擾,我們難以快速掌控網(wǎng)頁(yè)的結構。所以我們可以用另一種形式查看源代碼。
用谷歌瀏覽器打開(kāi)CSDN這個(gè)網(wǎng)站,找一個(gè)空白的位置右鍵-檢查,就會(huì )彈出一個(gè)框,如下圖所示
?。ㄈ绻麤](méi)有聽(tīng)到這個(gè)界面,注意要切換到Element中)
這個(gè)頁(yè)面最大的用處是通過(guò)折疊來(lái)使人更快探求出網(wǎng)頁(yè)的結構。
其中的這些代碼就是HTML代碼,該頁(yè)面的一個(gè)個(gè)標題就存在這一個(gè)個(gè)li上面。點(diǎn)擊li后面的三角就可以展開(kāi)具體的代碼內容,如下圖所示
可以看見(jiàn)文章的標題(打造一個(gè)高性能、易落地的公鏈開(kāi)發(fā)平臺)就在這個(gè)源代碼之中,也就是說(shuō)在我們剛才獲得的r.text字符串之中。而我們代碼定位路徑也一目了然了,因為每位li上面還會(huì )有一個(gè)<div class="title">而每一個(gè)div上面還會(huì )有一個(gè)h2 里面有一個(gè)a,a中包含我們要的標題名稱(chēng)。所以我們就用find_all找到所有這樣的div標簽,存儲為一個(gè)list,再對list進(jìn)行循環(huán),對每一個(gè)元素提取h2 a 再提取標簽中的內容。
當然我們也可以find_all最外邊的li標簽,再一層層往里找,都是一樣的。只要找到定位信息的惟一標示(標簽或則屬性)就可以了。
雖然在這里看源代碼可以折疊一些沒(méi)用的代碼,但是雖然還有一些更好用的工具來(lái)輔助我們找到我們要的信息在網(wǎng)頁(yè)源碼中的位置。比如下邊這個(gè)鍵盤(pán)符號。
在所有代碼都折疊上去的情況下,點(diǎn)擊這個(gè)鍵盤(pán),之后再去點(diǎn)擊網(wǎng)頁(yè)中的元素,瀏覽器都會(huì )手動(dòng)幫你把你點(diǎn)擊的元素選中下來(lái),其實(shí)你鍵盤(pán)懸在一個(gè)元素前面的時(shí)侯,就早已幫你定位了,如下圖所示
當我們要爬一個(gè)網(wǎng)頁(yè)的時(shí)侯,只須要如下流程
現在,對于一些沒(méi)有絲毫反爬舉措的網(wǎng)站我們都可以游刃有余了。至于抓取多個(gè)數組的數據怎么組織在一起、抓取多頁(yè)(URL有規律的情況下)的代碼怎樣設計,就不是爬蟲(chóng)知識范疇了,這是用python基礎知識就可以解決的。下一系列文章就主要講這一部分。接下來(lái)給幾個(gè)當前可以練手的網(wǎng)站
如果使用BeautifulSoup的定位的過(guò)程中遇見(jiàn)困難,可以直接到網(wǎng)上搜教程,也可以等我們這個(gè)專(zhuān)題前面更新的BeautifulSoup詳盡介紹。
如果你去抓取其他網(wǎng)站,最好先看一下r.text是不是和網(wǎng)站源代碼一模一樣,如果不是,說(shuō)明你對方服務(wù)器沒(méi)有把真正的信息給你,說(shuō)明他可能看出你是爬蟲(chóng)了(進(jìn)行網(wǎng)頁(yè)懇求的時(shí)侯,瀏覽器和requests.get都相當于帶著(zhù)一堆資格證去敲門(mén),對方會(huì )檢測你這種資格證,瀏覽器的資格證通常是可以通過(guò)的,而代碼的資格證就可能不合格,因為代碼的資格證可能有一些比較固定的特征,對方服務(wù)器預先設定好,資格證是這樣的懇求一律拒絕,因為她們一定是爬蟲(chóng),這就是反爬蟲(chóng)機制),這時(shí)就須要懂一些反反爬舉措就能獲得真正的信息,反反爬方式的學(xué)習是一個(gè)積累的過(guò)程,我們前面再講。讀者假如遇見(jiàn)一些反爬機制,可以到網(wǎng)上查這個(gè)網(wǎng)站的爬蟲(chóng),估計都能查到一些博客講怎么破解,甚至直接貼出代碼。
在這篇的基礎上抓取多頁(yè)以及代碼設計的改進(jìn)看下邊這三篇續集
爬蟲(chóng)代碼改進(jìn)(一)
爬蟲(chóng)代碼改進(jìn)(二)
爬蟲(chóng)代碼改進(jìn)(三)
專(zhuān)欄主頁(yè):python編程
專(zhuān)欄目錄:目錄
爬蟲(chóng)目錄:爬蟲(chóng)系列目錄
版本說(shuō)明:軟件及包版本說(shuō)明 查看全部
這篇文章的定位是,給有一些python基礎,但是對爬蟲(chóng)一無(wú)所知的人寫(xiě)的。文中只會(huì )涉及到爬蟲(chóng)最核心的部份,完全避免莫名其妙的坑或概念,讓讀者認為爬蟲(chóng)是一件極其簡(jiǎn)單的事情,而事實(shí)上爬蟲(chóng)確實(shí)是一件極其簡(jiǎn)單的事情(如果你不是以爬蟲(chóng)為工作的話(huà))。
本文分為如下幾個(gè)部份
簡(jiǎn)單理解網(wǎng)路爬蟲(chóng)就是手動(dòng)抓取網(wǎng)頁(yè)信息的代碼,可以簡(jiǎn)單理解成取代繁雜的復制粘貼操作的手段。
首先必須申明,爬蟲(chóng)的對象必須是你早已聽(tīng)到的網(wǎng)頁(yè),比如你不能說(shuō)你想找到知乎上那個(gè)用戶(hù)的關(guān)注人數最多,就希望通過(guò)寫(xiě)一個(gè)爬蟲(chóng)來(lái)幫你爬到答案。你必須明晰地曉得這個(gè)人,找到他的主頁(yè),然后才會(huì )用爬蟲(chóng)來(lái)抓取他頁(yè)面上的信息。
下面我們用一個(gè)簡(jiǎn)單的事例來(lái)展示爬蟲(chóng)的工作流程。感覺(jué)多數教程第一篇都使用的是豆瓣top250,我們這兒換一個(gè),抓取CSDN首頁(yè)的文章標題,鏈接在這里,頁(yè)面樣子是這樣的

抓取標題完整代碼如下
import requests # 導入網(wǎng)頁(yè)請求庫
from bs4 import BeautifulSoup # 導入網(wǎng)頁(yè)解析庫
# 傳入URL
r = requests.get('https://www.csdn.net/')
# 解析URL
soup = BeautifulSoup(r.text, 'html.parser')
content_list = soup.find_all('div', attrs = {'class': 'title'})
for content in content_list:
print(content.h2.a.text)
這樣才會(huì )復印出所有標題,展示一部分如下

上述過(guò)程是一個(gè)最簡(jiǎn)單的完整爬蟲(chóng)流程,可以看出它的功能就是把這些標題復制粘貼到一起,免不僅自動(dòng)操作的冗長(cháng)。其實(shí)爬蟲(chóng)通常就是做這些事的,比如我們須要用鏈家的數據進(jìn)行剖析,看到鏈家的頁(yè)面是這樣的

我們想獲取每位房屋的標題、幾室幾廳、多少平米、朝向、裝修、價(jià)格等等數組(即指標),就可以通過(guò)爬蟲(chóng)進(jìn)行定位,自動(dòng)化抓取這100頁(yè)所有房屋的那些數組信息。比如100頁(yè)里有2000個(gè)房屋,總共抓取10個(gè)數組,爬蟲(chóng)運行結束就可以得到一個(gè)2000行10列的excel表格。
注:如果還沒(méi)有安裝里面兩個(gè)庫的讀者可以在命令行下分別運行下邊兩行命令完成安裝
pip install requests
pip install beautifulsoup4
知道了爬蟲(chóng)是拿來(lái)干哪些的以后,我們來(lái)介紹一些最常見(jiàn)到的概念
1.URL
URL英文稱(chēng)為統一資源定位符,其實(shí)可以理解成網(wǎng)頁(yè)的鏈接,比如前面的就是一個(gè)URL。
但是更廣義的URL不只是我們常聽(tīng)到的網(wǎng)頁(yè)資源鏈接,而是資源在網(wǎng)頁(yè)中的定位標示。我們一般說(shuō)的網(wǎng)頁(yè)是一個(gè)資源,網(wǎng)頁(yè)中加載的每一張圖片也是一個(gè)資源,它們在互聯(lián)網(wǎng)中也有惟一的定位URL。比如我們從CSDN網(wǎng)頁(yè)上隨意找一張圖片

這個(gè)鏈接就是這個(gè)圖片資源的定位符,將這個(gè)鏈接輸入瀏覽器中都會(huì )顯示出這張圖片網(wǎng)頁(yè)爬蟲(chóng),所以說(shuō)這張圖片也對應一個(gè)URL。
不過(guò)曉得如此回事就好,我們一般所說(shuō)的傳入URL指的就是把網(wǎng)頁(yè)的鏈接傳進(jìn)去。上面代碼中
r = requests.get('https://www.csdn.net/')
就是在將URL傳入懇求函數。
2.網(wǎng)頁(yè)懇求
說(shuō)到網(wǎng)頁(yè)懇求,就有必要講一下我們平時(shí)瀏覽網(wǎng)頁(yè)時(shí),信息交互的模式大約是什么樣的。我們平時(shí)用瀏覽器瀏覽網(wǎng)頁(yè)的時(shí)侯,鼠標點(diǎn)了一個(gè)鏈接,比如你如今點(diǎn)擊這兒,其實(shí)瀏覽器幫你向這個(gè)網(wǎng)頁(yè)發(fā)送了懇求(request),維護網(wǎng)頁(yè)的服務(wù)器(可以理解為CSDN公司里的一臺筆記本,在維護這CSDN上的各個(gè)網(wǎng)頁(yè))收到了這個(gè)懇求,判定這個(gè)懇求是有效的,于是返回了一些響應信息(response)到瀏覽器,瀏覽器將這種信息進(jìn)行渲染(可以理解成 處理成人能讀懂的樣子),就是你看見(jiàn)的網(wǎng)頁(yè)的樣子了。發(fā)送懇求與接收懇求的過(guò)程就和 發(fā)陌陌和收到回復的過(guò)程類(lèi)似。
而如今我們要用代碼來(lái)模擬滑鼠點(diǎn)擊的過(guò)程。上面的requests.get就是使代碼幫你向這個(gè)網(wǎng)頁(yè)發(fā)送了這個(gè)懇求,如果懇求被判斷為有效,網(wǎng)頁(yè)的服務(wù)器也會(huì )把信息傳送給你,傳送回去的這種信息就被形參到變量r之中。所以這個(gè)變量r里就包含有我們想要的信息了,也包括這些我們想要提取的標題。
我們可以print(r.text)看一下上面有哪些東西

我們再看一下網(wǎng)頁(yè)的源代碼(如何讀懂這個(gè)源碼,以及這個(gè)源碼如何查看下一節HTML會(huì )詳盡提到)

源代碼和r.text雖然是一模一樣的東西。r.text雖然就是一個(gè)字符串,字符串中有我們剛才抓取到的所有標題,我們只要通過(guò)字符串匹配方式(比如正則表達式)將她們提取下來(lái)就可以了。這樣說(shuō)是不是覺(jué)得爬蟲(chóng)十分簡(jiǎn)單呢?只要這樣傻蛋操作
r = requests.get('https://www.csdn.net/')
再直接從r.text字符串中提取信息即可。其實(shí)爬蟲(chóng)就是那么簡(jiǎn)單。
但是解析是如何回事呢,為什么剛才不直接用正則而要用bs4呢?因為便捷,但是正則也是完全可以的,只是相對麻煩一些、需要寫(xiě)更多的代碼而已。
3.網(wǎng)頁(yè)解析
網(wǎng)頁(yè)解析雖然就從網(wǎng)頁(yè)服務(wù)器返回給我們的信息中提取我們想要數據的過(guò)程。其實(shí)使用正則表達式提取我們要的標題的過(guò)程也可以稱(chēng)為網(wǎng)頁(yè)解析。
因為當前絕大多數網(wǎng)頁(yè)源代碼都是用HTML語(yǔ)言寫(xiě)的,而HTML語(yǔ)言時(shí)特別有規律性的,比如我們要的所有文章標題都具有相同結構,也就是說(shuō)它周?chē)淖址际鞘诸?lèi)似的,這樣我們能夠批量獲取。所以就有大鱷專(zhuān)門(mén)封裝了怎樣從HTML代碼中提取特定文本的庫,也就是我們平常說(shuō)的網(wǎng)頁(yè)解析庫,如bs4 lxml pyquery等,其實(shí)把她們當作處理字符串的就可以了。
為了更清楚地了解怎樣對網(wǎng)頁(yè)進(jìn)行解析,我們須要先簡(jiǎn)略把握HTML代碼的結構。
引用維基百科中的一段話(huà)來(lái)介紹HTML
超文本標記語(yǔ)言(英語(yǔ):HyperText Markup Language,簡(jiǎn)稱(chēng):HTML)是一種用于創(chuàng )建網(wǎng)頁(yè)的標準標記語(yǔ)言。HTML是一種基礎技術(shù),常與CSS、JavaScript一起被諸多網(wǎng)站用于設計令人賞心悅目的網(wǎng)頁(yè)、網(wǎng)頁(yè)應用程序以及移動(dòng)應用程序的用戶(hù)界面[1]。網(wǎng)頁(yè)瀏覽器可以讀取HTML文件,并將其渲染成可視化網(wǎng)頁(yè)。
為了使讀者對HTML有更清楚的認識,我們來(lái)寫(xiě)一點(diǎn)簡(jiǎn)單的HTML代碼。用文本編輯器(記事本也可以)創(chuàng )建一個(gè)名子為a.html的文件,在里面寫(xiě)下如下代碼
<!DOCTYPE html>
<html>
<head>
<title>爬蟲(chóng)基本原理</title>
</head>
<body>
<h1>HTML介紹</h1>
<p>第一段</p>
<p>第二段</p>
</body>
</html>
保存,然后你雙擊這個(gè)文件,就會(huì )手動(dòng)用瀏覽器打開(kāi),然后你還能見(jiàn)到下邊這個(gè)樣子的頁(yè)面

你若果根據我的操作來(lái)做的話(huà),你已然創(chuàng )建了一個(gè)簡(jiǎn)單的網(wǎng)頁(yè),現在你看見(jiàn)的所有網(wǎng)頁(yè)都是這樣設計的,只是比你的復雜一點(diǎn)而已,不信你去瞧瞧剛剛截圖出來(lái)的網(wǎng)頁(yè)源代碼圖片。
接下來(lái),我們來(lái)看一下HTML語(yǔ)言的特性。最重要的一點(diǎn)是網(wǎng)頁(yè)爬蟲(chóng),文本都是被標簽(h1標簽 p標簽)夾在中間的,而這種標簽都是特定的,有專(zhuān)門(mén)用途的。比如<h1>就表示一級標題,包在上面的文本自然會(huì )被放大顯示;而<p>標簽則表示段落。
再看里面的源代碼截圖,head meta script title div li每一個(gè)都是標簽,層層嵌套。我們完全不需要曉得總共有什么種標簽,也不需要曉得這種標簽都是拿來(lái)干哪些的,我們只要找到我們要的信息包含在哪些標簽里就行了。比如使用正則表達式就直接用<p>(.*?)</p>就可以把上面的內容提取下來(lái)了。
但是事實(shí)似乎沒(méi)有這么簡(jiǎn)單,看里面的截圖標簽如何是這樣的<nav id="nav" class="clearfix">?其實(shí)這是一個(gè)<nav>標簽,后面的id class是這個(gè)標簽的屬性。
為什么要給標簽設置屬性呢?我們先考慮這樣一個(gè)問(wèn)題:我們看見(jiàn)的網(wǎng)頁(yè)千差萬(wàn)別,文字的顏色字體等都不一樣,這是如何設置的呢?答案是使用css樣式。
css句子類(lèi)似這樣
h1 {
color: white;
text-align: center;
}
p {
font-family: verdana;
font-size: 20px;
}
即設置對應標簽的顏色、字體、大小、居中等。而當有的段落使用這個(gè)字體,有的段落使用哪個(gè)字體如何辦呢?css這樣設置
p.test1 {
font-size: 20px;
}
p.test2 {
font-size: 15px;
}
在HTML代碼中則這樣寫(xiě)
<p class="test1">20px大小的字</p>
<p class="test2">15px大小的字</p>
所以不同屬性就是為了分辨相同標簽用的,這相當于給標簽進(jìn)行了分類(lèi),在統一設計款式上更方便,同時(shí)對于我們依照屬性定位我們想要內容的位置雖然也是更方便了。這里要說(shuō)明一下,class id這兩個(gè)屬性比較特殊,用的也最多,所以各自弄了一個(gè)快捷鍵來(lái)表示,class用.,id用#。
做爬蟲(chóng)不需要了解剛才編撰的css代碼內容放到那里之類(lèi)的問(wèn)題,也不需要了解css代碼設置了哪些,我們只會(huì )和HTML打交道,所以只要理解HTML中屬性的作用就可以了。
如果想要更進(jìn)一步了解HTML和CSS,可以到w3school網(wǎng)站學(xué)習。
現在你就早已具備了解析網(wǎng)頁(yè)須要的全部HTML知識了。我們通常就是依據標簽名配合屬性值來(lái)定位我們想要資源的位置的,其他的都不用管。這時(shí),我們再來(lái)看爬蟲(chóng)的解析代碼
把上面的代碼再粘貼一遍如下
import requests # 導入網(wǎng)頁(yè)請求庫
from bs4 import BeautifulSoup # 導入網(wǎng)頁(yè)解析庫
# 傳入URL
r = requests.get('https://www.csdn.net/')
# 解析URL
soup = BeautifulSoup(r.text, 'html.parser')
content_list = soup.find_all('div', attrs = {'class': 'title'})
for content in content_list:
print(content.h2.a.text)
解釋一下里面代碼的過(guò)程
可以看見(jiàn)里面的代碼十分簡(jiǎn)約,思路清晰,讀者可以自己想一想假如要用正則表達式怎么匹配那些標簽,會(huì )發(fā)覺(jué)代碼冗長(cháng)好多,雖然它也有更快的優(yōu)勢。
那么我們是如何曉得要找尋什么樣屬性的div標簽,為什么要找h2 a標簽而不是其他的呢?這就要去剖析網(wǎng)頁(yè)的源代碼了。而這個(gè)過(guò)程也十分簡(jiǎn)單。
我們如今用谷歌瀏覽器打開(kāi)CSDN這個(gè)網(wǎng)站,找一個(gè)空白的位置右鍵-查看網(wǎng)頁(yè)源代碼,這時(shí)才會(huì )打開(kāi)一個(gè)新的頁(yè)面這個(gè)頁(yè)面就是這個(gè)網(wǎng)站的HTML源代碼了,我們可以通過(guò)這個(gè)頁(yè)面來(lái)看我們要的信息在那里,但是覺(jué)得十分不便捷,因為有太多無(wú)用的信息做干擾,我們難以快速掌控網(wǎng)頁(yè)的結構。所以我們可以用另一種形式查看源代碼。
用谷歌瀏覽器打開(kāi)CSDN這個(gè)網(wǎng)站,找一個(gè)空白的位置右鍵-檢查,就會(huì )彈出一個(gè)框,如下圖所示

?。ㄈ绻麤](méi)有聽(tīng)到這個(gè)界面,注意要切換到Element中)
這個(gè)頁(yè)面最大的用處是通過(guò)折疊來(lái)使人更快探求出網(wǎng)頁(yè)的結構。
其中的這些代碼就是HTML代碼,該頁(yè)面的一個(gè)個(gè)標題就存在這一個(gè)個(gè)li上面。點(diǎn)擊li后面的三角就可以展開(kāi)具體的代碼內容,如下圖所示

可以看見(jiàn)文章的標題(打造一個(gè)高性能、易落地的公鏈開(kāi)發(fā)平臺)就在這個(gè)源代碼之中,也就是說(shuō)在我們剛才獲得的r.text字符串之中。而我們代碼定位路徑也一目了然了,因為每位li上面還會(huì )有一個(gè)<div class="title">而每一個(gè)div上面還會(huì )有一個(gè)h2 里面有一個(gè)a,a中包含我們要的標題名稱(chēng)。所以我們就用find_all找到所有這樣的div標簽,存儲為一個(gè)list,再對list進(jìn)行循環(huán),對每一個(gè)元素提取h2 a 再提取標簽中的內容。
當然我們也可以find_all最外邊的li標簽,再一層層往里找,都是一樣的。只要找到定位信息的惟一標示(標簽或則屬性)就可以了。
雖然在這里看源代碼可以折疊一些沒(méi)用的代碼,但是雖然還有一些更好用的工具來(lái)輔助我們找到我們要的信息在網(wǎng)頁(yè)源碼中的位置。比如下邊這個(gè)鍵盤(pán)符號。

在所有代碼都折疊上去的情況下,點(diǎn)擊這個(gè)鍵盤(pán),之后再去點(diǎn)擊網(wǎng)頁(yè)中的元素,瀏覽器都會(huì )手動(dòng)幫你把你點(diǎn)擊的元素選中下來(lái),其實(shí)你鍵盤(pán)懸在一個(gè)元素前面的時(shí)侯,就早已幫你定位了,如下圖所示

當我們要爬一個(gè)網(wǎng)頁(yè)的時(shí)侯,只須要如下流程
現在,對于一些沒(méi)有絲毫反爬舉措的網(wǎng)站我們都可以游刃有余了。至于抓取多個(gè)數組的數據怎么組織在一起、抓取多頁(yè)(URL有規律的情況下)的代碼怎樣設計,就不是爬蟲(chóng)知識范疇了,這是用python基礎知識就可以解決的。下一系列文章就主要講這一部分。接下來(lái)給幾個(gè)當前可以練手的網(wǎng)站
如果使用BeautifulSoup的定位的過(guò)程中遇見(jiàn)困難,可以直接到網(wǎng)上搜教程,也可以等我們這個(gè)專(zhuān)題前面更新的BeautifulSoup詳盡介紹。
如果你去抓取其他網(wǎng)站,最好先看一下r.text是不是和網(wǎng)站源代碼一模一樣,如果不是,說(shuō)明你對方服務(wù)器沒(méi)有把真正的信息給你,說(shuō)明他可能看出你是爬蟲(chóng)了(進(jìn)行網(wǎng)頁(yè)懇求的時(shí)侯,瀏覽器和requests.get都相當于帶著(zhù)一堆資格證去敲門(mén),對方會(huì )檢測你這種資格證,瀏覽器的資格證通常是可以通過(guò)的,而代碼的資格證就可能不合格,因為代碼的資格證可能有一些比較固定的特征,對方服務(wù)器預先設定好,資格證是這樣的懇求一律拒絕,因為她們一定是爬蟲(chóng),這就是反爬蟲(chóng)機制),這時(shí)就須要懂一些反反爬舉措就能獲得真正的信息,反反爬方式的學(xué)習是一個(gè)積累的過(guò)程,我們前面再講。讀者假如遇見(jiàn)一些反爬機制,可以到網(wǎng)上查這個(gè)網(wǎng)站的爬蟲(chóng),估計都能查到一些博客講怎么破解,甚至直接貼出代碼。
在這篇的基礎上抓取多頁(yè)以及代碼設計的改進(jìn)看下邊這三篇續集
爬蟲(chóng)代碼改進(jìn)(一)
爬蟲(chóng)代碼改進(jìn)(二)
爬蟲(chóng)代碼改進(jìn)(三)
專(zhuān)欄主頁(yè):python編程
專(zhuān)欄目錄:目錄
爬蟲(chóng)目錄:爬蟲(chóng)系列目錄
版本說(shuō)明:軟件及包版本說(shuō)明
DISCUZ X3.2 采集教程 – 火車(chē)頭采集器 V7.6 WEB發(fā)布配置管理
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 871 次瀏覽 ? 2020-04-23 11:04
1. 打開(kāi)WEB發(fā)布配置管理
打開(kāi)火車(chē)頭采集器 v7.6 - 工具 - Web發(fā)布配置管理
2. 新建規則
3. 網(wǎng)站自動(dòng)登入配置
彈出一個(gè)新窗口,我們一個(gè)一個(gè)配置,先來(lái)這個(gè)登入配置,點(diǎn)擊手動(dòng)抓取登錄數據包
4. 獲取發(fā)布數據包
在以后彈出的窗口中輸入 Discuz 論壇的地址(Forece 用的本地測試),然后登錄你注冊過(guò)的用戶(hù)。在 Post 數據框那兒應當可以看見(jiàn)數據,然后點(diǎn)擊確定。當然若果有的網(wǎng)站無(wú)法使用手動(dòng)登入獲取 POST 數據的話(huà),你可以用 Fiddler 來(lái)獲取 Post 數據。然后在上一個(gè)窗口中,選擇粘貼 Post 數據。
Post 數據通常是長(cháng)這個(gè)樣的:
fastloginfield=username&username=forece&password=xxxxxxxxxxxxxx&quickforward=yes&handlekey=ls
復制代碼
點(diǎn)擊確定后,你可以聽(tīng)到大部分表格都早已填寫(xiě)完畢了
我們還須要再做一下更改,需要將 username 和 password 的表單值改為 [用戶(hù)名] 和 [密碼],另外還須要加一個(gè)登錄失敗標志碼碼和登錄成功標志碼。
登陸失敗標志碼
登錄失敗
登陸成功標志碼
<script type="text/javascript" reload="1">
復制代碼
最后截圖如下:
5. 網(wǎng)頁(yè)隨機值獲取
然后我們步入下一個(gè) Tab ,網(wǎng)頁(yè)隨機值獲取。獲取這個(gè)數值的誘因是因為 Discuz 有一個(gè)稱(chēng)作 formhash 的東西。這玩意還不是固定的,每次都變。
然后依次填入以下數據:
獲取頁(yè)面:
/forum.php?mod=post&action=newthread&fid=2
復制代碼
來(lái)源頁(yè)面
/forum.php?mod=post&action=newthread&fid=2
復制代碼
隨機值前字符串
name="formhash" value="
復制代碼
隨機值后字符串
然后將 每次懇求都使用第一次獲取的網(wǎng)頁(yè)隨機值 的選項關(guān)閉。
PS: 獲取頁(yè)面和來(lái)源頁(yè)面是你發(fā)布貼子的頁(yè)面。大家聽(tīng)到我旁邊的 fid=2 是我的版塊名稱(chēng),請依照自己 Discuz 論壇的情況配置。
最后設置截圖如下:
6. 內容發(fā)布參數
內容發(fā)布參數的設置和登錄的有點(diǎn)類(lèi)似,也是須要獲取 Post 數據
登陸進(jìn)峰會(huì ) - 選擇發(fā)貼 - 填寫(xiě)標題 - 內容 - 按發(fā)貼 - 獲取 Post 數據 - 按確定
Post 數據應當是這樣的:
formhash=9c552f8e&posttime=1507576154&wysiwyg=1&subject=%E7%81%AB%E8%BD%A6%E5%A4%B4%E8%8E%B7%E5%8F%96+Post+%E6%95%B0%E6%8D%AE%E6%B5%8B%E8%AF%95%E5%B8%96&message=by+Forece&replycredit_extcredits=0&replycredit_times=1&replycredit_membertimes=1&replycredit_random=100&readperm=&price=&tags=&rushreplyfrom=&rushreplyto=&rewardfloor=&replylimit=&stopfloor=&creditlimit=&allownoticeauthor=1&usesig=1&save=
復制代碼
按完確定后,表單數據獲取完畢,我們還是須要更改一些表單。
formhash: [網(wǎng)頁(yè)隨機值1] posttime: [系統時(shí)間戳] subject: [標簽:標題] message: [標簽:內容]
發(fā)表錯誤標志碼
抱歉,您的懇求來(lái)路不正確或表單驗證串不符,無(wú)法遞交
抱歉,您仍未輸入標題或內容
成功標志碼
帖子地址復制成功
最后截圖如下:
7. HTML 轉換為 UBB 標簽
其實(shí)到現今這個(gè)Web發(fā)布規則早已配置完畢,但是由于 Discuz 用的是 UBB 標簽而不是 HTML 標簽,所以我們再稍為讓這個(gè)發(fā)布規則更完美一些。進(jìn)入中級功能,選擇操作類(lèi)型,標簽填寫(xiě) [標簽:內容] ,CMS 選擇 Discuz , 按確定。
然后回到內容發(fā)布規則里,將表單message里面的值替換成{0}
8. 命名規則
9. 保存配置
按照自己的情況來(lái)配置,是 UTF-8 就填寫(xiě) UTF-8,是 GBK 就填寫(xiě) GBK 別搞混了。
PS: 不知道為何保存完規則后網(wǎng)頁(yè)隨機值消失不見(jiàn)了,我測試的時(shí)侯仍然未能發(fā)布內容,重新把網(wǎng)頁(yè)隨機值加進(jìn)去就好了。 查看全部
1. 打開(kāi)WEB發(fā)布配置管理
打開(kāi)火車(chē)頭采集器 v7.6 - 工具 - Web發(fā)布配置管理

2. 新建規則

3. 網(wǎng)站自動(dòng)登入配置
彈出一個(gè)新窗口,我們一個(gè)一個(gè)配置,先來(lái)這個(gè)登入配置,點(diǎn)擊手動(dòng)抓取登錄數據包

4. 獲取發(fā)布數據包
在以后彈出的窗口中輸入 Discuz 論壇的地址(Forece 用的本地測試),然后登錄你注冊過(guò)的用戶(hù)。在 Post 數據框那兒應當可以看見(jiàn)數據,然后點(diǎn)擊確定。當然若果有的網(wǎng)站無(wú)法使用手動(dòng)登入獲取 POST 數據的話(huà),你可以用 Fiddler 來(lái)獲取 Post 數據。然后在上一個(gè)窗口中,選擇粘貼 Post 數據。

Post 數據通常是長(cháng)這個(gè)樣的:
fastloginfield=username&username=forece&password=xxxxxxxxxxxxxx&quickforward=yes&handlekey=ls
復制代碼
點(diǎn)擊確定后,你可以聽(tīng)到大部分表格都早已填寫(xiě)完畢了

我們還須要再做一下更改,需要將 username 和 password 的表單值改為 [用戶(hù)名] 和 [密碼],另外還須要加一個(gè)登錄失敗標志碼碼和登錄成功標志碼。
登陸失敗標志碼
登錄失敗
登陸成功標志碼
<script type="text/javascript" reload="1">
復制代碼
最后截圖如下:

5. 網(wǎng)頁(yè)隨機值獲取
然后我們步入下一個(gè) Tab ,網(wǎng)頁(yè)隨機值獲取。獲取這個(gè)數值的誘因是因為 Discuz 有一個(gè)稱(chēng)作 formhash 的東西。這玩意還不是固定的,每次都變。

然后依次填入以下數據:
獲取頁(yè)面:
/forum.php?mod=post&action=newthread&fid=2
復制代碼
來(lái)源頁(yè)面
/forum.php?mod=post&action=newthread&fid=2
復制代碼
隨機值前字符串
name="formhash" value="
復制代碼
隨機值后字符串
然后將 每次懇求都使用第一次獲取的網(wǎng)頁(yè)隨機值 的選項關(guān)閉。
PS: 獲取頁(yè)面和來(lái)源頁(yè)面是你發(fā)布貼子的頁(yè)面。大家聽(tīng)到我旁邊的 fid=2 是我的版塊名稱(chēng),請依照自己 Discuz 論壇的情況配置。
最后設置截圖如下:

6. 內容發(fā)布參數
內容發(fā)布參數的設置和登錄的有點(diǎn)類(lèi)似,也是須要獲取 Post 數據

登陸進(jìn)峰會(huì ) - 選擇發(fā)貼 - 填寫(xiě)標題 - 內容 - 按發(fā)貼 - 獲取 Post 數據 - 按確定

Post 數據應當是這樣的:
formhash=9c552f8e&posttime=1507576154&wysiwyg=1&subject=%E7%81%AB%E8%BD%A6%E5%A4%B4%E8%8E%B7%E5%8F%96+Post+%E6%95%B0%E6%8D%AE%E6%B5%8B%E8%AF%95%E5%B8%96&message=by+Forece&replycredit_extcredits=0&replycredit_times=1&replycredit_membertimes=1&replycredit_random=100&readperm=&price=&tags=&rushreplyfrom=&rushreplyto=&rewardfloor=&replylimit=&stopfloor=&creditlimit=&allownoticeauthor=1&usesig=1&save=
復制代碼
按完確定后,表單數據獲取完畢,我們還是須要更改一些表單。


formhash: [網(wǎng)頁(yè)隨機值1] posttime: [系統時(shí)間戳] subject: [標簽:標題] message: [標簽:內容]
發(fā)表錯誤標志碼
抱歉,您的懇求來(lái)路不正確或表單驗證串不符,無(wú)法遞交
抱歉,您仍未輸入標題或內容
成功標志碼
帖子地址復制成功
最后截圖如下:

7. HTML 轉換為 UBB 標簽
其實(shí)到現今這個(gè)Web發(fā)布規則早已配置完畢,但是由于 Discuz 用的是 UBB 標簽而不是 HTML 標簽,所以我們再稍為讓這個(gè)發(fā)布規則更完美一些。進(jìn)入中級功能,選擇操作類(lèi)型,標簽填寫(xiě) [標簽:內容] ,CMS 選擇 Discuz , 按確定。

然后回到內容發(fā)布規則里,將表單message里面的值替換成{0}

8. 命名規則

9. 保存配置
按照自己的情況來(lái)配置,是 UTF-8 就填寫(xiě) UTF-8,是 GBK 就填寫(xiě) GBK 別搞混了。

PS: 不知道為何保存完規則后網(wǎng)頁(yè)隨機值消失不見(jiàn)了,我測試的時(shí)侯仍然未能發(fā)布內容,重新把網(wǎng)頁(yè)隨機值加進(jìn)去就好了。


