c爬蟲(chóng)抓取網(wǎng)頁(yè)數據
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(爬蟲(chóng)在數據分析領(lǐng)域的應用,如何幫助我們提升數據分析質(zhì)量)
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 243 次瀏覽 ? 2022-03-14 12:15
在當今信息化和數字化的時(shí)代,人們離不開(kāi)網(wǎng)絡(luò )搜索,但想想看,在搜索過(guò)程中,你真的可以得到相關(guān)信息,因為有人在幫你過(guò)濾相關(guān)內容,呈現在你面前。
就像在餐館里一樣,你點(diǎn)了土豆然后得到它們,因為有人幫你在土豆、蘿卜、西紅柿等中找到它們,然后有人把它們帶到你的餐桌上。在網(wǎng)上,這兩個(gè)動(dòng)作是一個(gè)叫爬蟲(chóng)的同學(xué)為你實(shí)現的。
也就是說(shuō),沒(méi)有爬蟲(chóng),就沒(méi)有今天的檢索,就無(wú)法準確查找信息和高效獲取數據。今天DataHunter就來(lái)談?wù)勁老x(chóng)在數據分析領(lǐng)域的應用,以及它如何幫助我們提高數據分析的質(zhì)量。
一、數據時(shí)代,爬蟲(chóng)的本質(zhì)是提高效率
網(wǎng)絡(luò )爬蟲(chóng),又稱(chēng)網(wǎng)絡(luò )機器人,可以代替人自動(dòng)瀏覽網(wǎng)絡(luò )信息,采集和組織數據。
它是一個(gè)程序,其基本原理是向網(wǎng)站/網(wǎng)絡(luò )發(fā)起請求,獲取資源后分析提取有用數據。從技術(shù)上講,就是通過(guò)程序模擬瀏覽器請求站點(diǎn)的行為,將站點(diǎn)返回的HTML代碼/JSON數據/二進(jìn)制數據(圖片、視頻)爬取到本地,然后提取您需要的數據并將其存儲以供使用。
每個(gè)程序都有自己的規則,網(wǎng)絡(luò )爬蟲(chóng)也不例外。它穿梭于世界各地的各種網(wǎng)站之間,根據人們強加的規則將采集信息。我們稱(chēng)這些規則為網(wǎng)絡(luò )爬蟲(chóng)算法。規則是人定的,是人根據自己的目的和需要設計的。因此,根據用戶(hù)的目的,爬蟲(chóng)可以有不同的功能。但所有爬蟲(chóng)的本質(zhì)是方便人們在海量的互聯(lián)網(wǎng)信息中找到并下載自己想要的信息類(lèi)型,從而提高信息獲取效率。
二、爬蟲(chóng)的應用:搜索并幫助企業(yè)做強業(yè)務(wù)
1.搜索引擎:爬取網(wǎng)站為網(wǎng)絡(luò )用戶(hù)提供便利
在互聯(lián)網(wǎng)的早期,能夠提供全球范圍內信息的網(wǎng)站并不多,用戶(hù)也不多。Internet 只是文件傳輸協(xié)議 (FTP) 站點(diǎn)的集合,用戶(hù)可以在其中導航以查找特定的共享文件,并查找和組合 Internet 上可用的分布式數據,創(chuàng )建了一個(gè)稱(chēng)為網(wǎng)絡(luò )爬蟲(chóng)的自動(dòng)化程序 /Robot,它可以爬取網(wǎng)絡(luò )上的所有網(wǎng)頁(yè),然后將所有頁(yè)面的內容復制到數據庫中進(jìn)行索引。這也是最早的搜索引擎。
如今,隨著(zhù)互聯(lián)網(wǎng)的飛速發(fā)展,我們可以在任何搜索引擎中看到來(lái)自世界各地各種網(wǎng)站的信息。百度搜索引擎的爬蟲(chóng)叫百度蜘蛛,360的爬蟲(chóng)叫360Spider,搜狗的爬蟲(chóng)叫搜狗蜘蛛,必應的爬蟲(chóng)叫Bingbot。搜索引擎離不開(kāi)爬蟲(chóng)。
比如百度蜘蛛每天都會(huì )抓取大量的互聯(lián)網(wǎng)信息,抓取優(yōu)質(zhì)信息和收錄。當用戶(hù)在百度搜索引擎上搜索對應的關(guān)鍵詞時(shí),百度會(huì )對關(guān)鍵詞進(jìn)行分析處理,從收錄的網(wǎng)頁(yè)中找出相關(guān)網(wǎng)頁(yè),按照一定的排名規則和結果展示給用戶(hù),工作原理如圖?,F在,我們可以大膽地說(shuō),你每天都在免費享受爬蟲(chóng)的好處。
2.企業(yè):監控輿情,高效獲取有價(jià)值信息
我們說(shuō)過(guò)爬蟲(chóng)的本質(zhì)是提高效率,而爬蟲(chóng)的規則是由人決定的;那么企業(yè)就可以根據自己的業(yè)務(wù)需求設計爬蟲(chóng),第一時(shí)間獲取網(wǎng)絡(luò )上的相關(guān)信息,進(jìn)行清理整合。
在大數據時(shí)代進(jìn)行數據分析,首先要有數據源,網(wǎng)絡(luò )爬蟲(chóng)可以讓我們獲取更多的數據源,同時(shí)根據我們的目的進(jìn)行采集,從而去除很多的無(wú)關(guān)數據。
例如,在進(jìn)行大數據分析或數據挖掘時(shí),可以從一些提供數據統計的網(wǎng)站s,或者從某些文檔或內部資料中獲取數據源。但是,這些獲取數據的方式有時(shí)很難滿(mǎn)足我們的數據需求。此時(shí),我們可以利用爬蟲(chóng)技術(shù)從互聯(lián)網(wǎng)上自動(dòng)獲取更多我們感興趣的數據內容,從而進(jìn)行更深入的數據分析,獲取更多有價(jià)值的信息。
此外,網(wǎng)絡(luò )爬蟲(chóng)還可用于財務(wù)分析,對財務(wù)數據進(jìn)行采集進(jìn)行投資分析;可應用于輿情監測分析、精準客戶(hù)精準營(yíng)銷(xiāo)等各個(gè)領(lǐng)域。
三、企業(yè)常用的4種網(wǎng)絡(luò )爬蟲(chóng)
網(wǎng)絡(luò )爬蟲(chóng)根據實(shí)現的技術(shù)和結構可以分為一般網(wǎng)絡(luò )爬蟲(chóng)、聚焦網(wǎng)絡(luò )爬蟲(chóng)、增量網(wǎng)絡(luò )爬蟲(chóng)和深度網(wǎng)絡(luò )爬蟲(chóng)。但由于網(wǎng)絡(luò )環(huán)境復雜,實(shí)際的網(wǎng)絡(luò )爬蟲(chóng)通常是這幾種爬蟲(chóng)的組合。
1.萬(wàn)能網(wǎng)絡(luò )爬蟲(chóng)
通用網(wǎng)絡(luò )爬蟲(chóng)也稱(chēng)為全網(wǎng)絡(luò )爬蟲(chóng)。顧名思義,要爬取的目標資源在整個(gè)互聯(lián)網(wǎng)上,要爬取的目標數據是巨大的,爬取的范圍也很大。正是因為爬取的數據是海量數據,所以對于這種爬蟲(chóng)來(lái)說(shuō),對爬取的性能要求是非常高的。這種網(wǎng)絡(luò )爬蟲(chóng)主要用于大型搜索引擎,具有很高的應用價(jià)值。
一般的網(wǎng)絡(luò )爬蟲(chóng)主要由初始URL采集、URL隊列、頁(yè)面爬取模塊、頁(yè)面分析模塊、頁(yè)面數據庫、鏈接過(guò)濾模塊等組成。一般網(wǎng)絡(luò )爬蟲(chóng)在爬取時(shí)會(huì )采用一定的爬取策略,主要包括深度優(yōu)先爬取策略和廣度優(yōu)先爬取策略。具體細節將在后面介紹。
2.專(zhuān)注于網(wǎng)絡(luò )爬蟲(chóng)
聚焦網(wǎng)絡(luò )爬蟲(chóng),也稱(chēng)為主題網(wǎng)絡(luò )爬蟲(chóng),是根據預先定義的主題有選擇地爬取網(wǎng)頁(yè)的爬蟲(chóng)。聚焦網(wǎng)絡(luò )爬蟲(chóng)主要用于爬取特定信息,主要為特定類(lèi)型的人提供服務(wù)。
聚焦網(wǎng)絡(luò )爬蟲(chóng)也是由初始URL集合、URL隊列、頁(yè)面爬取模塊、頁(yè)面分析模塊、頁(yè)面數據庫、鏈接過(guò)濾模塊、內容評價(jià)模塊、鏈接評價(jià)模塊等組成。內容評估模塊和鏈接評估模塊可以根據鏈接和內容的重要性確定優(yōu)先訪(fǎng)問(wèn)哪些頁(yè)面。專(zhuān)注于網(wǎng)絡(luò )爬蟲(chóng)的爬取策略主要有四種,如圖:
由于專(zhuān)注的網(wǎng)絡(luò )爬蟲(chóng)可以有目的地根據相應的主題進(jìn)行爬取,在實(shí)際應用過(guò)程中可以節省大量的服務(wù)器資源和寬帶資源,因此具有很強的實(shí)用性。這里我們以網(wǎng)絡(luò )爬蟲(chóng)為例來(lái)了解爬蟲(chóng)運行的工作原理和過(guò)程。
如圖所示,焦點(diǎn)網(wǎng)絡(luò )爬蟲(chóng)有一個(gè)控制中心,負責管理和監控整個(gè)爬蟲(chóng)系統,包括控制用戶(hù)交互、初始化爬蟲(chóng)、確定主題、協(xié)調各個(gè)模塊之間的工作以及控制整個(gè)爬蟲(chóng)系統。爬行過(guò)程。等等:
(1)控制中心將初始URL集合傳遞給URL隊列,頁(yè)面爬取模塊會(huì )從URL隊列中讀取第一批URL列表;
(2)根據這些URL地址,從網(wǎng)上爬取對應的頁(yè)面;爬取后,將爬取的內容發(fā)送到頁(yè)面數據庫進(jìn)行存儲;
(3)在爬取過(guò)程中,會(huì )爬取一些新的URL,此時(shí)需要使用鏈接過(guò)濾模塊,根據指定的主題過(guò)濾掉不相關(guān)的鏈接,然后使用鏈接評價(jià)模塊進(jìn)行根據主題剩余的URL鏈接?;蛘邇热菰u估模塊進(jìn)行優(yōu)先排序,完成后將新的URL地址傳遞給URL隊列,供頁(yè)面爬取模塊使用;
?。?)抓取頁(yè)面并存入頁(yè)面數據庫后,需要使用頁(yè)面分析模塊,根據主題對抓取的頁(yè)面進(jìn)行分析處理,并根據處理結果建立索引庫。當用戶(hù)檢索到相應的信息,就可以從索引數據庫中進(jìn)行相應的檢索,得到相應的結果。
3.增量網(wǎng)絡(luò )爬蟲(chóng)
這里的“incremental”對應于增量更新,意思是在更新過(guò)程中只更新變化的地方,不變的地方不更新。
增量網(wǎng)絡(luò )爬蟲(chóng),在爬取網(wǎng)頁(yè)時(shí),只爬取內容發(fā)生變化的網(wǎng)頁(yè)或新生成的網(wǎng)頁(yè),不會(huì )爬取內容未發(fā)生變化的網(wǎng)頁(yè)。增量網(wǎng)絡(luò )爬蟲(chóng)可以在一定程度上保證爬取的頁(yè)面盡可能的新。
4.深網(wǎng)爬蟲(chóng)
在互聯(lián)網(wǎng)中,網(wǎng)頁(yè)根據存在的程度可以分為表層頁(yè)面和深層頁(yè)面。表面頁(yè)面是指無(wú)需提交表單,使用靜態(tài)鏈接即可到達的靜態(tài)頁(yè)面;而深頁(yè)是提交某個(gè)關(guān)鍵詞后才能獲得的頁(yè)面。在 Internet 中,深層頁(yè)面的數量通常遠大于表面頁(yè)面的數量。
深網(wǎng)爬蟲(chóng)可以爬取互聯(lián)網(wǎng)中的深層頁(yè)面,而要爬取深層頁(yè)面,就需要想辦法自動(dòng)填寫(xiě)相應的表格。深網(wǎng)爬蟲(chóng)主要由 URL 列表、LVS 列表(LVS 指標簽/值集合,即填充表單的數據源)、爬取控制器、解析器、LVS 控制器、表單分析器、表單處理器、響應分析器組成和其他部分。
四、網(wǎng)絡(luò )爬蟲(chóng)的爬取策略
前面我們說(shuō)過(guò),網(wǎng)絡(luò )爬蟲(chóng)算法是基于人對采集信息施加的規則,由于網(wǎng)絡(luò )環(huán)境復雜,算法也多種多樣,也就是爬取策略。這里主要介紹爬取的順序和頻率。
1.爬取順序
網(wǎng)絡(luò )爬蟲(chóng)在爬取過(guò)程中,可能會(huì )出現在爬取的URL列表中的多個(gè)URL地址,因此爬蟲(chóng)會(huì )依次對這些URL地址進(jìn)行爬取。
與一般的網(wǎng)絡(luò )爬蟲(chóng)相比,爬取的順序并不那么重要。但專(zhuān)注于網(wǎng)絡(luò )爬蟲(chóng),爬取的順序與服務(wù)器資源和寬帶資源有關(guān),所以非常重要,一般由爬取策略決定。爬取策略主要包括深度優(yōu)先爬取策略、廣度優(yōu)先爬取策略、大站點(diǎn)優(yōu)先策略、反鏈策略等爬取策略。
如圖,假設有一個(gè)網(wǎng)站,ABCDEFG為站點(diǎn)下的網(wǎng)頁(yè),網(wǎng)頁(yè)的層次結構如圖所示。如果此時(shí)網(wǎng)頁(yè)ABCDEFG都在爬取隊列中,那么根據不同的爬取策略,爬取的順序是不同的。
深度優(yōu)先爬取策略:A→D→E→B→C→F→G
廣度優(yōu)先爬取策略:A→B→C→D→E→F→G
除了以上兩種爬取策略外,還可以使用大站點(diǎn)爬取策略??梢愿鶕鄳W(wǎng)頁(yè)所屬的站點(diǎn)進(jìn)行分類(lèi)。如果某個(gè)網(wǎng)站有大量的網(wǎng)頁(yè),則稱(chēng)為大站點(diǎn)。按照這個(gè)策略,網(wǎng)站擁有的網(wǎng)頁(yè)越多,則越大,優(yōu)先抓取該網(wǎng)頁(yè)在大站點(diǎn)中的URL地址。
此外,還有反向鏈接策略。一個(gè)網(wǎng)頁(yè)的反向鏈接數是指該網(wǎng)頁(yè)被其他網(wǎng)頁(yè)指向的次數。這個(gè)次數代表了該網(wǎng)頁(yè)在一定程度上被其他網(wǎng)頁(yè)推薦的次數。因此,如果按照反向鏈接策略進(jìn)行爬取,那么哪個(gè)網(wǎng)頁(yè)的反向鏈接多,就會(huì )先爬到哪個(gè)頁(yè)面。
但是,在實(shí)際情況中,如果一個(gè)網(wǎng)頁(yè)的優(yōu)先級只是簡(jiǎn)單地由反向鏈接策略來(lái)決定的話(huà),就可能會(huì )出現很多作弊的情況。因此,采用反向鏈接策略需要考慮可靠反向鏈接的數量。除了以上的爬取策略,實(shí)踐中還有很多其他的爬取策略,比如OPIC策略、Partial PageRank策略等等。
2.爬取頻率
網(wǎng)站 網(wǎng)頁(yè)經(jīng)常更新。作為爬蟲(chóng),網(wǎng)站的更新頻率越接近爬蟲(chóng)訪(fǎng)問(wèn)網(wǎng)站的頻率,效果越好。當然,在爬蟲(chóng)服務(wù)器資源有限的情況下,爬蟲(chóng)還需要根據相應的策略,讓不同的網(wǎng)頁(yè)有不同的更新優(yōu)先級。優(yōu)先級高的網(wǎng)頁(yè)會(huì )更新得更快,爬取響應也會(huì )更快。常見(jiàn)的網(wǎng)頁(yè)更新策略有以下三種:
(1)用戶(hù)體驗策略:大部分用戶(hù)使用搜索引擎查詢(xún)某個(gè)關(guān)鍵詞時(shí),只會(huì )關(guān)注排名靠前的網(wǎng)頁(yè)。因此,當爬蟲(chóng)服務(wù)器的資源處于有限,爬蟲(chóng)會(huì )優(yōu)先更新排名靠前的頁(yè)面。
(2)歷史數據策略:是指根據一個(gè)網(wǎng)頁(yè)的歷史更新數據,通過(guò)泊松過(guò)程建模等手段,預測該網(wǎng)頁(yè)下次更新時(shí)間的能力,從而確定下一次更新時(shí)間。抓取網(wǎng)頁(yè)所花費的時(shí)間。
(3)聚類(lèi)分析策略:網(wǎng)頁(yè)可能有不同的內容,但一般來(lái)說(shuō),屬性相似的網(wǎng)頁(yè)更新頻率相似,所以可以對大量的網(wǎng)頁(yè)進(jìn)行聚類(lèi)。爬取的頻率根據設置同類(lèi)型網(wǎng)頁(yè)的平均更新值。
五、網(wǎng)絡(luò )爬蟲(chóng)的實(shí)現技術(shù)
對于實(shí)現技術(shù),本文不展開(kāi),只為有興趣的同學(xué)提供幾種常用語(yǔ)言:Python、Java、PHP、Node.JS、C++、Go語(yǔ)言(另外還有很多開(kāi)發(fā)語(yǔ)言用于網(wǎng)絡(luò )爬蟲(chóng))。
Python:爬蟲(chóng)框架非常豐富,多線(xiàn)程處理能力強,而且易學(xué),代碼簡(jiǎn)潔,優(yōu)點(diǎn)很多。
Java:適合開(kāi)發(fā)大型爬蟲(chóng)項目。
PHP:后端處理能力很強,代碼很簡(jiǎn)潔,模塊豐富,但是并發(fā)能力比較弱。
Node.JS:支持高并發(fā)和多線(xiàn)程。
C++:運行速度快,適合開(kāi)發(fā)大型爬蟲(chóng)項目,成本高。
Go語(yǔ)言:同樣的高并發(fā)能力很強。
六、總結
說(shuō)到爬蟲(chóng),很多人認為它們是網(wǎng)絡(luò )世界中不可能存在的灰色地帶。恭喜你,看完這篇文章,你比很多人都知道。
因為爬蟲(chóng)分為良性爬蟲(chóng)和惡意爬蟲(chóng),比如搜索引擎爬蟲(chóng)。Goodwill爬蟲(chóng)嚴格遵守Robots協(xié)議規范爬取網(wǎng)頁(yè)數據(如URL),它的存在可以增加網(wǎng)站的曝光度,給網(wǎng)站帶來(lái)流量;
惡意爬蟲(chóng),無(wú)視Robots協(xié)議,肆意爬取網(wǎng)站中一些深度不情愿的數據,包括個(gè)人隱私或商業(yè)機密等重要信息。而惡意爬蟲(chóng)的用戶(hù)想要多次大量地從網(wǎng)站獲取信息,所以通常會(huì )在目標網(wǎng)站上投放大量爬蟲(chóng)。如果大量爬蟲(chóng)同時(shí)訪(fǎng)問(wèn)網(wǎng)站,很容易導致網(wǎng)站服務(wù)器超載或崩潰,導致網(wǎng)站算子丟失。
據統計,2017年我國42.2%的互聯(lián)網(wǎng)流量是由網(wǎng)絡(luò )機器人創(chuàng )造的,其中惡意機器(主要是惡意爬蟲(chóng))占21.80%。我們應該合法合理地使用網(wǎng)絡(luò )爬蟲(chóng),這樣才能用科技為企業(yè)帶來(lái)長(cháng)遠發(fā)展,用科學(xué)為社會(huì )創(chuàng )造更高的價(jià)值。
關(guān)于數據獵人
DataHunter是一家專(zhuān)業(yè)的數據分析和商業(yè)智能服務(wù)商,注冊于2014年,團隊核心成員來(lái)自IBM、Oracle、SAP等知名企業(yè),深耕大數據分析領(lǐng)域,擁有十余年豐富的企業(yè)服務(wù)經(jīng)驗。
DataHunter的核心產(chǎn)品Data Analytics智能數據分析平臺和數據大屏設計配置工具Data MAX在行業(yè)中形成了自己的獨特優(yōu)勢,在各行業(yè)積累了眾多標桿客戶(hù)和成功案例。
自成立以來(lái),DataHunter一直致力于為客戶(hù)提供實(shí)時(shí)、高效、智能的數據分析與展示解決方案,幫助企業(yè)查看和分析數據并改善業(yè)務(wù),成為最值得信賴(lài)的數據業(yè)務(wù)公司。 查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(爬蟲(chóng)在數據分析領(lǐng)域的應用,如何幫助我們提升數據分析質(zhì)量)
在當今信息化和數字化的時(shí)代,人們離不開(kāi)網(wǎng)絡(luò )搜索,但想想看,在搜索過(guò)程中,你真的可以得到相關(guān)信息,因為有人在幫你過(guò)濾相關(guān)內容,呈現在你面前。

就像在餐館里一樣,你點(diǎn)了土豆然后得到它們,因為有人幫你在土豆、蘿卜、西紅柿等中找到它們,然后有人把它們帶到你的餐桌上。在網(wǎng)上,這兩個(gè)動(dòng)作是一個(gè)叫爬蟲(chóng)的同學(xué)為你實(shí)現的。
也就是說(shuō),沒(méi)有爬蟲(chóng),就沒(méi)有今天的檢索,就無(wú)法準確查找信息和高效獲取數據。今天DataHunter就來(lái)談?wù)勁老x(chóng)在數據分析領(lǐng)域的應用,以及它如何幫助我們提高數據分析的質(zhì)量。
一、數據時(shí)代,爬蟲(chóng)的本質(zhì)是提高效率
網(wǎng)絡(luò )爬蟲(chóng),又稱(chēng)網(wǎng)絡(luò )機器人,可以代替人自動(dòng)瀏覽網(wǎng)絡(luò )信息,采集和組織數據。
它是一個(gè)程序,其基本原理是向網(wǎng)站/網(wǎng)絡(luò )發(fā)起請求,獲取資源后分析提取有用數據。從技術(shù)上講,就是通過(guò)程序模擬瀏覽器請求站點(diǎn)的行為,將站點(diǎn)返回的HTML代碼/JSON數據/二進(jìn)制數據(圖片、視頻)爬取到本地,然后提取您需要的數據并將其存儲以供使用。

每個(gè)程序都有自己的規則,網(wǎng)絡(luò )爬蟲(chóng)也不例外。它穿梭于世界各地的各種網(wǎng)站之間,根據人們強加的規則將采集信息。我們稱(chēng)這些規則為網(wǎng)絡(luò )爬蟲(chóng)算法。規則是人定的,是人根據自己的目的和需要設計的。因此,根據用戶(hù)的目的,爬蟲(chóng)可以有不同的功能。但所有爬蟲(chóng)的本質(zhì)是方便人們在海量的互聯(lián)網(wǎng)信息中找到并下載自己想要的信息類(lèi)型,從而提高信息獲取效率。
二、爬蟲(chóng)的應用:搜索并幫助企業(yè)做強業(yè)務(wù)
1.搜索引擎:爬取網(wǎng)站為網(wǎng)絡(luò )用戶(hù)提供便利
在互聯(lián)網(wǎng)的早期,能夠提供全球范圍內信息的網(wǎng)站并不多,用戶(hù)也不多。Internet 只是文件傳輸協(xié)議 (FTP) 站點(diǎn)的集合,用戶(hù)可以在其中導航以查找特定的共享文件,并查找和組合 Internet 上可用的分布式數據,創(chuàng )建了一個(gè)稱(chēng)為網(wǎng)絡(luò )爬蟲(chóng)的自動(dòng)化程序 /Robot,它可以爬取網(wǎng)絡(luò )上的所有網(wǎng)頁(yè),然后將所有頁(yè)面的內容復制到數據庫中進(jìn)行索引。這也是最早的搜索引擎。

如今,隨著(zhù)互聯(lián)網(wǎng)的飛速發(fā)展,我們可以在任何搜索引擎中看到來(lái)自世界各地各種網(wǎng)站的信息。百度搜索引擎的爬蟲(chóng)叫百度蜘蛛,360的爬蟲(chóng)叫360Spider,搜狗的爬蟲(chóng)叫搜狗蜘蛛,必應的爬蟲(chóng)叫Bingbot。搜索引擎離不開(kāi)爬蟲(chóng)。
比如百度蜘蛛每天都會(huì )抓取大量的互聯(lián)網(wǎng)信息,抓取優(yōu)質(zhì)信息和收錄。當用戶(hù)在百度搜索引擎上搜索對應的關(guān)鍵詞時(shí),百度會(huì )對關(guān)鍵詞進(jìn)行分析處理,從收錄的網(wǎng)頁(yè)中找出相關(guān)網(wǎng)頁(yè),按照一定的排名規則和結果展示給用戶(hù),工作原理如圖?,F在,我們可以大膽地說(shuō),你每天都在免費享受爬蟲(chóng)的好處。

2.企業(yè):監控輿情,高效獲取有價(jià)值信息
我們說(shuō)過(guò)爬蟲(chóng)的本質(zhì)是提高效率,而爬蟲(chóng)的規則是由人決定的;那么企業(yè)就可以根據自己的業(yè)務(wù)需求設計爬蟲(chóng),第一時(shí)間獲取網(wǎng)絡(luò )上的相關(guān)信息,進(jìn)行清理整合。
在大數據時(shí)代進(jìn)行數據分析,首先要有數據源,網(wǎng)絡(luò )爬蟲(chóng)可以讓我們獲取更多的數據源,同時(shí)根據我們的目的進(jìn)行采集,從而去除很多的無(wú)關(guān)數據。

例如,在進(jìn)行大數據分析或數據挖掘時(shí),可以從一些提供數據統計的網(wǎng)站s,或者從某些文檔或內部資料中獲取數據源。但是,這些獲取數據的方式有時(shí)很難滿(mǎn)足我們的數據需求。此時(shí),我們可以利用爬蟲(chóng)技術(shù)從互聯(lián)網(wǎng)上自動(dòng)獲取更多我們感興趣的數據內容,從而進(jìn)行更深入的數據分析,獲取更多有價(jià)值的信息。
此外,網(wǎng)絡(luò )爬蟲(chóng)還可用于財務(wù)分析,對財務(wù)數據進(jìn)行采集進(jìn)行投資分析;可應用于輿情監測分析、精準客戶(hù)精準營(yíng)銷(xiāo)等各個(gè)領(lǐng)域。
三、企業(yè)常用的4種網(wǎng)絡(luò )爬蟲(chóng)
網(wǎng)絡(luò )爬蟲(chóng)根據實(shí)現的技術(shù)和結構可以分為一般網(wǎng)絡(luò )爬蟲(chóng)、聚焦網(wǎng)絡(luò )爬蟲(chóng)、增量網(wǎng)絡(luò )爬蟲(chóng)和深度網(wǎng)絡(luò )爬蟲(chóng)。但由于網(wǎng)絡(luò )環(huán)境復雜,實(shí)際的網(wǎng)絡(luò )爬蟲(chóng)通常是這幾種爬蟲(chóng)的組合。
1.萬(wàn)能網(wǎng)絡(luò )爬蟲(chóng)
通用網(wǎng)絡(luò )爬蟲(chóng)也稱(chēng)為全網(wǎng)絡(luò )爬蟲(chóng)。顧名思義,要爬取的目標資源在整個(gè)互聯(lián)網(wǎng)上,要爬取的目標數據是巨大的,爬取的范圍也很大。正是因為爬取的數據是海量數據,所以對于這種爬蟲(chóng)來(lái)說(shuō),對爬取的性能要求是非常高的。這種網(wǎng)絡(luò )爬蟲(chóng)主要用于大型搜索引擎,具有很高的應用價(jià)值。

一般的網(wǎng)絡(luò )爬蟲(chóng)主要由初始URL采集、URL隊列、頁(yè)面爬取模塊、頁(yè)面分析模塊、頁(yè)面數據庫、鏈接過(guò)濾模塊等組成。一般網(wǎng)絡(luò )爬蟲(chóng)在爬取時(shí)會(huì )采用一定的爬取策略,主要包括深度優(yōu)先爬取策略和廣度優(yōu)先爬取策略。具體細節將在后面介紹。
2.專(zhuān)注于網(wǎng)絡(luò )爬蟲(chóng)
聚焦網(wǎng)絡(luò )爬蟲(chóng),也稱(chēng)為主題網(wǎng)絡(luò )爬蟲(chóng),是根據預先定義的主題有選擇地爬取網(wǎng)頁(yè)的爬蟲(chóng)。聚焦網(wǎng)絡(luò )爬蟲(chóng)主要用于爬取特定信息,主要為特定類(lèi)型的人提供服務(wù)。
聚焦網(wǎng)絡(luò )爬蟲(chóng)也是由初始URL集合、URL隊列、頁(yè)面爬取模塊、頁(yè)面分析模塊、頁(yè)面數據庫、鏈接過(guò)濾模塊、內容評價(jià)模塊、鏈接評價(jià)模塊等組成。內容評估模塊和鏈接評估模塊可以根據鏈接和內容的重要性確定優(yōu)先訪(fǎng)問(wèn)哪些頁(yè)面。專(zhuān)注于網(wǎng)絡(luò )爬蟲(chóng)的爬取策略主要有四種,如圖:

由于專(zhuān)注的網(wǎng)絡(luò )爬蟲(chóng)可以有目的地根據相應的主題進(jìn)行爬取,在實(shí)際應用過(guò)程中可以節省大量的服務(wù)器資源和寬帶資源,因此具有很強的實(shí)用性。這里我們以網(wǎng)絡(luò )爬蟲(chóng)為例來(lái)了解爬蟲(chóng)運行的工作原理和過(guò)程。

如圖所示,焦點(diǎn)網(wǎng)絡(luò )爬蟲(chóng)有一個(gè)控制中心,負責管理和監控整個(gè)爬蟲(chóng)系統,包括控制用戶(hù)交互、初始化爬蟲(chóng)、確定主題、協(xié)調各個(gè)模塊之間的工作以及控制整個(gè)爬蟲(chóng)系統。爬行過(guò)程。等等:
(1)控制中心將初始URL集合傳遞給URL隊列,頁(yè)面爬取模塊會(huì )從URL隊列中讀取第一批URL列表;
(2)根據這些URL地址,從網(wǎng)上爬取對應的頁(yè)面;爬取后,將爬取的內容發(fā)送到頁(yè)面數據庫進(jìn)行存儲;
(3)在爬取過(guò)程中,會(huì )爬取一些新的URL,此時(shí)需要使用鏈接過(guò)濾模塊,根據指定的主題過(guò)濾掉不相關(guān)的鏈接,然后使用鏈接評價(jià)模塊進(jìn)行根據主題剩余的URL鏈接?;蛘邇热菰u估模塊進(jìn)行優(yōu)先排序,完成后將新的URL地址傳遞給URL隊列,供頁(yè)面爬取模塊使用;
?。?)抓取頁(yè)面并存入頁(yè)面數據庫后,需要使用頁(yè)面分析模塊,根據主題對抓取的頁(yè)面進(jìn)行分析處理,并根據處理結果建立索引庫。當用戶(hù)檢索到相應的信息,就可以從索引數據庫中進(jìn)行相應的檢索,得到相應的結果。
3.增量網(wǎng)絡(luò )爬蟲(chóng)
這里的“incremental”對應于增量更新,意思是在更新過(guò)程中只更新變化的地方,不變的地方不更新。
增量網(wǎng)絡(luò )爬蟲(chóng),在爬取網(wǎng)頁(yè)時(shí),只爬取內容發(fā)生變化的網(wǎng)頁(yè)或新生成的網(wǎng)頁(yè),不會(huì )爬取內容未發(fā)生變化的網(wǎng)頁(yè)。增量網(wǎng)絡(luò )爬蟲(chóng)可以在一定程度上保證爬取的頁(yè)面盡可能的新。
4.深網(wǎng)爬蟲(chóng)
在互聯(lián)網(wǎng)中,網(wǎng)頁(yè)根據存在的程度可以分為表層頁(yè)面和深層頁(yè)面。表面頁(yè)面是指無(wú)需提交表單,使用靜態(tài)鏈接即可到達的靜態(tài)頁(yè)面;而深頁(yè)是提交某個(gè)關(guān)鍵詞后才能獲得的頁(yè)面。在 Internet 中,深層頁(yè)面的數量通常遠大于表面頁(yè)面的數量。

深網(wǎng)爬蟲(chóng)可以爬取互聯(lián)網(wǎng)中的深層頁(yè)面,而要爬取深層頁(yè)面,就需要想辦法自動(dòng)填寫(xiě)相應的表格。深網(wǎng)爬蟲(chóng)主要由 URL 列表、LVS 列表(LVS 指標簽/值集合,即填充表單的數據源)、爬取控制器、解析器、LVS 控制器、表單分析器、表單處理器、響應分析器組成和其他部分。
四、網(wǎng)絡(luò )爬蟲(chóng)的爬取策略
前面我們說(shuō)過(guò),網(wǎng)絡(luò )爬蟲(chóng)算法是基于人對采集信息施加的規則,由于網(wǎng)絡(luò )環(huán)境復雜,算法也多種多樣,也就是爬取策略。這里主要介紹爬取的順序和頻率。
1.爬取順序
網(wǎng)絡(luò )爬蟲(chóng)在爬取過(guò)程中,可能會(huì )出現在爬取的URL列表中的多個(gè)URL地址,因此爬蟲(chóng)會(huì )依次對這些URL地址進(jìn)行爬取。
與一般的網(wǎng)絡(luò )爬蟲(chóng)相比,爬取的順序并不那么重要。但專(zhuān)注于網(wǎng)絡(luò )爬蟲(chóng),爬取的順序與服務(wù)器資源和寬帶資源有關(guān),所以非常重要,一般由爬取策略決定。爬取策略主要包括深度優(yōu)先爬取策略、廣度優(yōu)先爬取策略、大站點(diǎn)優(yōu)先策略、反鏈策略等爬取策略。

如圖,假設有一個(gè)網(wǎng)站,ABCDEFG為站點(diǎn)下的網(wǎng)頁(yè),網(wǎng)頁(yè)的層次結構如圖所示。如果此時(shí)網(wǎng)頁(yè)ABCDEFG都在爬取隊列中,那么根據不同的爬取策略,爬取的順序是不同的。
深度優(yōu)先爬取策略:A→D→E→B→C→F→G
廣度優(yōu)先爬取策略:A→B→C→D→E→F→G
除了以上兩種爬取策略外,還可以使用大站點(diǎn)爬取策略??梢愿鶕鄳W(wǎng)頁(yè)所屬的站點(diǎn)進(jìn)行分類(lèi)。如果某個(gè)網(wǎng)站有大量的網(wǎng)頁(yè),則稱(chēng)為大站點(diǎn)。按照這個(gè)策略,網(wǎng)站擁有的網(wǎng)頁(yè)越多,則越大,優(yōu)先抓取該網(wǎng)頁(yè)在大站點(diǎn)中的URL地址。
此外,還有反向鏈接策略。一個(gè)網(wǎng)頁(yè)的反向鏈接數是指該網(wǎng)頁(yè)被其他網(wǎng)頁(yè)指向的次數。這個(gè)次數代表了該網(wǎng)頁(yè)在一定程度上被其他網(wǎng)頁(yè)推薦的次數。因此,如果按照反向鏈接策略進(jìn)行爬取,那么哪個(gè)網(wǎng)頁(yè)的反向鏈接多,就會(huì )先爬到哪個(gè)頁(yè)面。
但是,在實(shí)際情況中,如果一個(gè)網(wǎng)頁(yè)的優(yōu)先級只是簡(jiǎn)單地由反向鏈接策略來(lái)決定的話(huà),就可能會(huì )出現很多作弊的情況。因此,采用反向鏈接策略需要考慮可靠反向鏈接的數量。除了以上的爬取策略,實(shí)踐中還有很多其他的爬取策略,比如OPIC策略、Partial PageRank策略等等。
2.爬取頻率
網(wǎng)站 網(wǎng)頁(yè)經(jīng)常更新。作為爬蟲(chóng),網(wǎng)站的更新頻率越接近爬蟲(chóng)訪(fǎng)問(wèn)網(wǎng)站的頻率,效果越好。當然,在爬蟲(chóng)服務(wù)器資源有限的情況下,爬蟲(chóng)還需要根據相應的策略,讓不同的網(wǎng)頁(yè)有不同的更新優(yōu)先級。優(yōu)先級高的網(wǎng)頁(yè)會(huì )更新得更快,爬取響應也會(huì )更快。常見(jiàn)的網(wǎng)頁(yè)更新策略有以下三種:

(1)用戶(hù)體驗策略:大部分用戶(hù)使用搜索引擎查詢(xún)某個(gè)關(guān)鍵詞時(shí),只會(huì )關(guān)注排名靠前的網(wǎng)頁(yè)。因此,當爬蟲(chóng)服務(wù)器的資源處于有限,爬蟲(chóng)會(huì )優(yōu)先更新排名靠前的頁(yè)面。
(2)歷史數據策略:是指根據一個(gè)網(wǎng)頁(yè)的歷史更新數據,通過(guò)泊松過(guò)程建模等手段,預測該網(wǎng)頁(yè)下次更新時(shí)間的能力,從而確定下一次更新時(shí)間。抓取網(wǎng)頁(yè)所花費的時(shí)間。
(3)聚類(lèi)分析策略:網(wǎng)頁(yè)可能有不同的內容,但一般來(lái)說(shuō),屬性相似的網(wǎng)頁(yè)更新頻率相似,所以可以對大量的網(wǎng)頁(yè)進(jìn)行聚類(lèi)。爬取的頻率根據設置同類(lèi)型網(wǎng)頁(yè)的平均更新值。
五、網(wǎng)絡(luò )爬蟲(chóng)的實(shí)現技術(shù)
對于實(shí)現技術(shù),本文不展開(kāi),只為有興趣的同學(xué)提供幾種常用語(yǔ)言:Python、Java、PHP、Node.JS、C++、Go語(yǔ)言(另外還有很多開(kāi)發(fā)語(yǔ)言用于網(wǎng)絡(luò )爬蟲(chóng))。
Python:爬蟲(chóng)框架非常豐富,多線(xiàn)程處理能力強,而且易學(xué),代碼簡(jiǎn)潔,優(yōu)點(diǎn)很多。
Java:適合開(kāi)發(fā)大型爬蟲(chóng)項目。
PHP:后端處理能力很強,代碼很簡(jiǎn)潔,模塊豐富,但是并發(fā)能力比較弱。
Node.JS:支持高并發(fā)和多線(xiàn)程。
C++:運行速度快,適合開(kāi)發(fā)大型爬蟲(chóng)項目,成本高。
Go語(yǔ)言:同樣的高并發(fā)能力很強。
六、總結
說(shuō)到爬蟲(chóng),很多人認為它們是網(wǎng)絡(luò )世界中不可能存在的灰色地帶。恭喜你,看完這篇文章,你比很多人都知道。
因為爬蟲(chóng)分為良性爬蟲(chóng)和惡意爬蟲(chóng),比如搜索引擎爬蟲(chóng)。Goodwill爬蟲(chóng)嚴格遵守Robots協(xié)議規范爬取網(wǎng)頁(yè)數據(如URL),它的存在可以增加網(wǎng)站的曝光度,給網(wǎng)站帶來(lái)流量;

惡意爬蟲(chóng),無(wú)視Robots協(xié)議,肆意爬取網(wǎng)站中一些深度不情愿的數據,包括個(gè)人隱私或商業(yè)機密等重要信息。而惡意爬蟲(chóng)的用戶(hù)想要多次大量地從網(wǎng)站獲取信息,所以通常會(huì )在目標網(wǎng)站上投放大量爬蟲(chóng)。如果大量爬蟲(chóng)同時(shí)訪(fǎng)問(wèn)網(wǎng)站,很容易導致網(wǎng)站服務(wù)器超載或崩潰,導致網(wǎng)站算子丟失。
據統計,2017年我國42.2%的互聯(lián)網(wǎng)流量是由網(wǎng)絡(luò )機器人創(chuàng )造的,其中惡意機器(主要是惡意爬蟲(chóng))占21.80%。我們應該合法合理地使用網(wǎng)絡(luò )爬蟲(chóng),這樣才能用科技為企業(yè)帶來(lái)長(cháng)遠發(fā)展,用科學(xué)為社會(huì )創(chuàng )造更高的價(jià)值。
關(guān)于數據獵人
DataHunter是一家專(zhuān)業(yè)的數據分析和商業(yè)智能服務(wù)商,注冊于2014年,團隊核心成員來(lái)自IBM、Oracle、SAP等知名企業(yè),深耕大數據分析領(lǐng)域,擁有十余年豐富的企業(yè)服務(wù)經(jīng)驗。
DataHunter的核心產(chǎn)品Data Analytics智能數據分析平臺和數據大屏設計配置工具Data MAX在行業(yè)中形成了自己的獨特優(yōu)勢,在各行業(yè)積累了眾多標桿客戶(hù)和成功案例。

自成立以來(lái),DataHunter一直致力于為客戶(hù)提供實(shí)時(shí)、高效、智能的數據分析與展示解決方案,幫助企業(yè)查看和分析數據并改善業(yè)務(wù),成為最值得信賴(lài)的數據業(yè)務(wù)公司。
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(利用cookie技術(shù)抓取網(wǎng)頁(yè)靜態(tài)數據這是什么?(組圖))
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 68 次瀏覽 ? 2022-03-13 19:01
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據有很多種不同的方式,我用到的就有采集網(wǎng)頁(yè)靜態(tài)數據(爬蟲(chóng))采集網(wǎng)頁(yè)圖片(webdatasnippet)采集網(wǎng)頁(yè)視頻數據采集網(wǎng)頁(yè)音頻數據采集網(wǎng)頁(yè)視頻采集網(wǎng)頁(yè)圖片采集網(wǎng)頁(yè)文本采集返回的json數據采集cookie數據這種用javascrapy等方式都可以實(shí)現這個(gè)用的比較少,我們可以先思考用requests,selenium等各種庫的用法和原理,一步步的調試實(shí)現。
但是采集網(wǎng)頁(yè)靜態(tài)數據用了再多的shell,模擬用戶(hù)采集數據基本都失敗了,gg有時(shí)候回頭看看采集網(wǎng)頁(yè)靜態(tài)數據,小白用戶(hù)可能會(huì )想,剛來(lái)知乎,肯定是要采集長(cháng)得漂亮的妹子呀,那還要我來(lái)干嘛,偷懶唄。我這就是要教大家偷懶。這里我用到的javascrapy爬蟲(chóng)庫。如何利用瀏覽器ua來(lái)識別瀏覽器,在采集完一個(gè)網(wǎng)頁(yè)之后可以輕松的推斷這個(gè)網(wǎng)頁(yè)是否是正常瀏覽的,還可以實(shí)現轉碼的效果,省的再下一次下載數據了。
就好比我瀏覽某網(wǎng)站,一上來(lái)就瀏覽本站所有的大v的資料,不太好吧。利用cookie技術(shù)抓取網(wǎng)頁(yè)靜態(tài)數據這是什么?cookie技術(shù)就是用cookie在相應網(wǎng)站上存儲一個(gè)數據,從而可以收集那些已經(jīng)登錄了的網(wǎng)站上數據,然后通過(guò)數據抓取框抓取所需數據,加密后再發(fā)回來(lái),進(jìn)一步傳播給服務(wù)器。就好比有些網(wǎng)站,某些已經(jīng)登錄過(guò)的訪(fǎng)客信息是有對應的。
再說(shuō)到這個(gè)cookie技術(shù),其實(shí)就是個(gè)社工庫,看到這個(gè)名字,我能猜到你有一定的網(wǎng)絡(luò )安全常識,我就不多說(shuō)了,平時(shí)可以留意自己瀏覽網(wǎng)站的登錄信息再補充一下,在很多網(wǎng)站上,輸入一個(gè)用戶(hù)名或者密碼后,就可以獲取他所有的所有瀏覽痕跡,過(guò)去有統計過(guò),百度,豆瓣,美團等在百度被騷擾的用戶(hù)是40w大家可以腦補一下。所以一個(gè)人的賬號如果泄露出去,就會(huì )無(wú)孔不入。
我做為一個(gè)小白,也是很無(wú)奈的了,各位高手,各位大神就不要噴我了。哈哈哈(這種是最常見(jiàn)的一種套路,說(shuō)到這里你可能會(huì )大吃一驚,那么如何隱藏自己的cookie?這個(gè)其實(shí)很簡(jiǎn)單,不管是任何的采集,只要是去掉數據,都可以按照通常的方式,只留一個(gè),把輸入的密碼解出來(lái),然后把解密的結果再返回來(lái)一個(gè)簡(jiǎn)單的后綴,去掉所有的https的字眼)手機渣排版還有很多需要補充的,慢慢跟上,預計寫(xiě)十篇,手機上傳圖不易,多多點(diǎn)贊啊。 查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(利用cookie技術(shù)抓取網(wǎng)頁(yè)靜態(tài)數據這是什么?(組圖))
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據有很多種不同的方式,我用到的就有采集網(wǎng)頁(yè)靜態(tài)數據(爬蟲(chóng))采集網(wǎng)頁(yè)圖片(webdatasnippet)采集網(wǎng)頁(yè)視頻數據采集網(wǎng)頁(yè)音頻數據采集網(wǎng)頁(yè)視頻采集網(wǎng)頁(yè)圖片采集網(wǎng)頁(yè)文本采集返回的json數據采集cookie數據這種用javascrapy等方式都可以實(shí)現這個(gè)用的比較少,我們可以先思考用requests,selenium等各種庫的用法和原理,一步步的調試實(shí)現。
但是采集網(wǎng)頁(yè)靜態(tài)數據用了再多的shell,模擬用戶(hù)采集數據基本都失敗了,gg有時(shí)候回頭看看采集網(wǎng)頁(yè)靜態(tài)數據,小白用戶(hù)可能會(huì )想,剛來(lái)知乎,肯定是要采集長(cháng)得漂亮的妹子呀,那還要我來(lái)干嘛,偷懶唄。我這就是要教大家偷懶。這里我用到的javascrapy爬蟲(chóng)庫。如何利用瀏覽器ua來(lái)識別瀏覽器,在采集完一個(gè)網(wǎng)頁(yè)之后可以輕松的推斷這個(gè)網(wǎng)頁(yè)是否是正常瀏覽的,還可以實(shí)現轉碼的效果,省的再下一次下載數據了。
就好比我瀏覽某網(wǎng)站,一上來(lái)就瀏覽本站所有的大v的資料,不太好吧。利用cookie技術(shù)抓取網(wǎng)頁(yè)靜態(tài)數據這是什么?cookie技術(shù)就是用cookie在相應網(wǎng)站上存儲一個(gè)數據,從而可以收集那些已經(jīng)登錄了的網(wǎng)站上數據,然后通過(guò)數據抓取框抓取所需數據,加密后再發(fā)回來(lái),進(jìn)一步傳播給服務(wù)器。就好比有些網(wǎng)站,某些已經(jīng)登錄過(guò)的訪(fǎng)客信息是有對應的。
再說(shuō)到這個(gè)cookie技術(shù),其實(shí)就是個(gè)社工庫,看到這個(gè)名字,我能猜到你有一定的網(wǎng)絡(luò )安全常識,我就不多說(shuō)了,平時(shí)可以留意自己瀏覽網(wǎng)站的登錄信息再補充一下,在很多網(wǎng)站上,輸入一個(gè)用戶(hù)名或者密碼后,就可以獲取他所有的所有瀏覽痕跡,過(guò)去有統計過(guò),百度,豆瓣,美團等在百度被騷擾的用戶(hù)是40w大家可以腦補一下。所以一個(gè)人的賬號如果泄露出去,就會(huì )無(wú)孔不入。
我做為一個(gè)小白,也是很無(wú)奈的了,各位高手,各位大神就不要噴我了。哈哈哈(這種是最常見(jiàn)的一種套路,說(shuō)到這里你可能會(huì )大吃一驚,那么如何隱藏自己的cookie?這個(gè)其實(shí)很簡(jiǎn)單,不管是任何的采集,只要是去掉數據,都可以按照通常的方式,只留一個(gè),把輸入的密碼解出來(lái),然后把解密的結果再返回來(lái)一個(gè)簡(jiǎn)單的后綴,去掉所有的https的字眼)手機渣排版還有很多需要補充的,慢慢跟上,預計寫(xiě)十篇,手機上傳圖不易,多多點(diǎn)贊啊。
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(HTTP請求頭說(shuō)明Allow服務(wù)器支持哪些請求方法(如GET、POST等))
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 70 次瀏覽 ? 2022-03-12 02:02
HTTP 請求標頭提供有關(guān)請求、響應或其他發(fā)送實(shí)體的信息。 (直接搬菜鳥(niǎo)教程)
響應頭描述
允許
服務(wù)器支持哪些請求方式(如GET、POST等)。
內容編碼
文檔的編碼方法。 Content-Type 頭指定的內容類(lèi)型只有在解碼后才能得到。使用 gzip 壓縮文檔可以顯著(zhù)減少 HTML 文檔的下載時(shí)間。 Java 的 GZIPOutputStream 可以很方便地進(jìn)行 gzip 壓縮,但它只支持 Unix 上的 Netscape 和 Windows 上的 IE 4、IE 5。因此,servlet 應該通過(guò)查看 Accept-Encoding 標頭(即 request.getHeader("Accept-Encoding"))來(lái)檢查瀏覽器是否支持 gzip,對于支持 gzip 的瀏覽器返回 gzip 壓縮的 HTML 頁(yè)面,并返回正常其他瀏覽器頁(yè)面的頁(yè)面。
內容長(cháng)度
表示內容長(cháng)度。僅當瀏覽器使用持久 HTTP 連接時(shí)才需要此數據。如果要利用持久連接,可以將輸出文檔寫(xiě)入 ByteArrayOutputStream,完成后檢查其大小,將該值放入 Content-Length 標頭,最后通過(guò) byteArrayStream.writeTo(response .getOutputStream()。
內容類(lèi)型
指示以下文檔屬于哪種 MIME 類(lèi)型。 Servlet 默認為 text/plain,但通常需要明確指定為 text/html。由于經(jīng)常設置 Content-Type,HttpServletResponse 提供了專(zhuān)門(mén)的方法 setContentType。
日期
當前格林威治標準時(shí)間??梢杂胹etDateHeader設置這個(gè)header,避免轉換時(shí)間格式的麻煩。
過(guò)期
何時(shí)應將文檔視為過(guò)期以不再緩存?
最后修改
上次修改文檔的時(shí)間??蛻?hù)端可以通過(guò)If-Modified-Since請求頭提供日期,該請求將被視為條件GET,只返回修改時(shí)間晚于指定時(shí)間的文檔,否則返回304(未修改)狀態(tài)將被退回。 Last-Modified 也可以使用 setDateHeader 方法設置。
位置
指示客戶(hù)端應該去哪里檢索文檔。 Location 通常不是直接設置的,而是通過(guò) HttpServletResponse 的 sendRedirect 方法設置的,該方法也將狀態(tài)碼設置為 302。
刷新
表示瀏覽器刷新文檔的時(shí)間(以秒為單位)。除了刷新當前文檔,還可以使用 setHeader("Refresh", "5; URL=") 讓瀏覽器讀取指定頁(yè)面。
注意這個(gè)功能通常是通過(guò)在HTML頁(yè)面的HEAD區域設置來(lái)實(shí)現的,這是因為自動(dòng)刷新或者重定向不是對于不會(huì )使用 CGI 或 servlet 的 HTML 編寫(xiě)器的人來(lái)說(shuō)可能是非常重要的。不過(guò)對于servlet來(lái)說(shuō),直接設置Refresh header會(huì )更方便。
注意Refresh的意思是“刷新本頁(yè)或N秒后訪(fǎng)問(wèn)指定頁(yè)面”,而不是“每隔N秒刷新本頁(yè)或訪(fǎng)問(wèn)指定頁(yè)面”。因此,持續刷新需要每次發(fā)送一個(gè)Refresh頭,發(fā)送204狀態(tài)碼可以阻止瀏覽器繼續刷新,無(wú)論是使用Refresh頭還是。
注意刷新頭不是HTTP官方規范的一部分1.1,而是一個(gè)擴展,但是Netscape和IE都支持。
服務(wù)器
服務(wù)器名稱(chēng)。 Servlet一般不設置這個(gè)值,而是由Web服務(wù)器自己設置的。
設置-Cookie
設置與頁(yè)面關(guān)聯(lián)的cookie。 Servlet 不應使用 response.setHeader("Set-Cookie", ...),而應使用 HttpServletResponse 提供的專(zhuān)用方法 addCookie。請參閱下面關(guān)于 cookie 設置的討論。
WWW-認證
客戶(hù)端應該在 Authorization 標頭中提供什么類(lèi)型的授權信息?在收錄 401(未授權)狀態(tài)行的響應中需要此標頭。例如 response.setHeader("WWW-Authenticate", "BASIC realm=\"executives\"")。
請注意,servlet 通常不處理此問(wèn)題,而是允許 Web 服務(wù)器的專(zhuān)用機制來(lái)控制對受密碼保護的頁(yè)面(例如 .htaccess)的訪(fǎng)問(wèn)。
1.5 個(gè) Cookie
指存儲在用戶(hù)本地終端上的一些數據(通常是加密的),用于識別用戶(hù)身份和跟蹤會(huì )話(huà)。
cookie 是存儲在計算機瀏覽器目錄中的文本文件。當瀏覽器運行時(shí),它存儲在 RAM 中以發(fā)揮作用(這種 cookie 稱(chēng)為會(huì )話(huà) cookie)。一旦用戶(hù)訪(fǎng)問(wèn) 網(wǎng)站 或服務(wù)器被注銷(xiāo),cookie 就可以存儲在用戶(hù)的本地硬盤(pán)上(這種 cookie 稱(chēng)為 Persistent Cookies)
1.6 認證
一般來(lái)說(shuō),爬蟲(chóng)在抓取和訪(fǎng)問(wèn)網(wǎng)頁(yè)時(shí),會(huì )通過(guò)HTTP請求中的User Agent字段告知自己的身份信息。
1.7 阿賈克斯
Ajax 代表“AsynchronousJavascriptAndXML”(異步 JavaScript 和 XML),它指的是一種用于創(chuàng )建交互式 Web 應用程序的 Web 開(kāi)發(fā)技術(shù)。 Ajax 可以通過(guò)在后臺與服務(wù)器交換少量數據來(lái)異步更新網(wǎng)頁(yè)。這意味著(zhù)可以在不重新加載整個(gè)頁(yè)面的情況下更新頁(yè)面的某些部分。
因為Ajax技術(shù),我們在爬取的時(shí)候,有時(shí)候會(huì )發(fā)現get()的結果并沒(méi)有我們想要的內容,因為在加載頁(yè)面的時(shí)候只有少量的數據交換,而我們得到了什么用爬蟲(chóng)只是第一次。 HTML,然后你需要在開(kāi)發(fā)者工具中找到你想要的數據。等有例子再詳細分析。
1.8 代理
在使用爬蟲(chóng)的過(guò)程中,難免會(huì )遇到帶有反爬蟲(chóng)的網(wǎng)站。這時(shí)候,我們需要一個(gè)代理ip。
使用代理IP,我們可以先從代理獲取代理網(wǎng)站,然后驗證IP是否可用。 查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(HTTP請求頭說(shuō)明Allow服務(wù)器支持哪些請求方法(如GET、POST等))
HTTP 請求標頭提供有關(guān)請求、響應或其他發(fā)送實(shí)體的信息。 (直接搬菜鳥(niǎo)教程)
響應頭描述
允許
服務(wù)器支持哪些請求方式(如GET、POST等)。
內容編碼
文檔的編碼方法。 Content-Type 頭指定的內容類(lèi)型只有在解碼后才能得到。使用 gzip 壓縮文檔可以顯著(zhù)減少 HTML 文檔的下載時(shí)間。 Java 的 GZIPOutputStream 可以很方便地進(jìn)行 gzip 壓縮,但它只支持 Unix 上的 Netscape 和 Windows 上的 IE 4、IE 5。因此,servlet 應該通過(guò)查看 Accept-Encoding 標頭(即 request.getHeader("Accept-Encoding"))來(lái)檢查瀏覽器是否支持 gzip,對于支持 gzip 的瀏覽器返回 gzip 壓縮的 HTML 頁(yè)面,并返回正常其他瀏覽器頁(yè)面的頁(yè)面。
內容長(cháng)度
表示內容長(cháng)度。僅當瀏覽器使用持久 HTTP 連接時(shí)才需要此數據。如果要利用持久連接,可以將輸出文檔寫(xiě)入 ByteArrayOutputStream,完成后檢查其大小,將該值放入 Content-Length 標頭,最后通過(guò) byteArrayStream.writeTo(response .getOutputStream()。
內容類(lèi)型
指示以下文檔屬于哪種 MIME 類(lèi)型。 Servlet 默認為 text/plain,但通常需要明確指定為 text/html。由于經(jīng)常設置 Content-Type,HttpServletResponse 提供了專(zhuān)門(mén)的方法 setContentType。
日期
當前格林威治標準時(shí)間??梢杂胹etDateHeader設置這個(gè)header,避免轉換時(shí)間格式的麻煩。
過(guò)期
何時(shí)應將文檔視為過(guò)期以不再緩存?
最后修改
上次修改文檔的時(shí)間??蛻?hù)端可以通過(guò)If-Modified-Since請求頭提供日期,該請求將被視為條件GET,只返回修改時(shí)間晚于指定時(shí)間的文檔,否則返回304(未修改)狀態(tài)將被退回。 Last-Modified 也可以使用 setDateHeader 方法設置。
位置
指示客戶(hù)端應該去哪里檢索文檔。 Location 通常不是直接設置的,而是通過(guò) HttpServletResponse 的 sendRedirect 方法設置的,該方法也將狀態(tài)碼設置為 302。
刷新
表示瀏覽器刷新文檔的時(shí)間(以秒為單位)。除了刷新當前文檔,還可以使用 setHeader("Refresh", "5; URL=") 讓瀏覽器讀取指定頁(yè)面。
注意這個(gè)功能通常是通過(guò)在HTML頁(yè)面的HEAD區域設置來(lái)實(shí)現的,這是因為自動(dòng)刷新或者重定向不是對于不會(huì )使用 CGI 或 servlet 的 HTML 編寫(xiě)器的人來(lái)說(shuō)可能是非常重要的。不過(guò)對于servlet來(lái)說(shuō),直接設置Refresh header會(huì )更方便。
注意Refresh的意思是“刷新本頁(yè)或N秒后訪(fǎng)問(wèn)指定頁(yè)面”,而不是“每隔N秒刷新本頁(yè)或訪(fǎng)問(wèn)指定頁(yè)面”。因此,持續刷新需要每次發(fā)送一個(gè)Refresh頭,發(fā)送204狀態(tài)碼可以阻止瀏覽器繼續刷新,無(wú)論是使用Refresh頭還是。
注意刷新頭不是HTTP官方規范的一部分1.1,而是一個(gè)擴展,但是Netscape和IE都支持。
服務(wù)器
服務(wù)器名稱(chēng)。 Servlet一般不設置這個(gè)值,而是由Web服務(wù)器自己設置的。
設置-Cookie
設置與頁(yè)面關(guān)聯(lián)的cookie。 Servlet 不應使用 response.setHeader("Set-Cookie", ...),而應使用 HttpServletResponse 提供的專(zhuān)用方法 addCookie。請參閱下面關(guān)于 cookie 設置的討論。
WWW-認證
客戶(hù)端應該在 Authorization 標頭中提供什么類(lèi)型的授權信息?在收錄 401(未授權)狀態(tài)行的響應中需要此標頭。例如 response.setHeader("WWW-Authenticate", "BASIC realm=\"executives\"")。
請注意,servlet 通常不處理此問(wèn)題,而是允許 Web 服務(wù)器的專(zhuān)用機制來(lái)控制對受密碼保護的頁(yè)面(例如 .htaccess)的訪(fǎng)問(wèn)。
1.5 個(gè) Cookie
指存儲在用戶(hù)本地終端上的一些數據(通常是加密的),用于識別用戶(hù)身份和跟蹤會(huì )話(huà)。
cookie 是存儲在計算機瀏覽器目錄中的文本文件。當瀏覽器運行時(shí),它存儲在 RAM 中以發(fā)揮作用(這種 cookie 稱(chēng)為會(huì )話(huà) cookie)。一旦用戶(hù)訪(fǎng)問(wèn) 網(wǎng)站 或服務(wù)器被注銷(xiāo),cookie 就可以存儲在用戶(hù)的本地硬盤(pán)上(這種 cookie 稱(chēng)為 Persistent Cookies)
1.6 認證
一般來(lái)說(shuō),爬蟲(chóng)在抓取和訪(fǎng)問(wèn)網(wǎng)頁(yè)時(shí),會(huì )通過(guò)HTTP請求中的User Agent字段告知自己的身份信息。
1.7 阿賈克斯
Ajax 代表“AsynchronousJavascriptAndXML”(異步 JavaScript 和 XML),它指的是一種用于創(chuàng )建交互式 Web 應用程序的 Web 開(kāi)發(fā)技術(shù)。 Ajax 可以通過(guò)在后臺與服務(wù)器交換少量數據來(lái)異步更新網(wǎng)頁(yè)。這意味著(zhù)可以在不重新加載整個(gè)頁(yè)面的情況下更新頁(yè)面的某些部分。
因為Ajax技術(shù),我們在爬取的時(shí)候,有時(shí)候會(huì )發(fā)現get()的結果并沒(méi)有我們想要的內容,因為在加載頁(yè)面的時(shí)候只有少量的數據交換,而我們得到了什么用爬蟲(chóng)只是第一次。 HTML,然后你需要在開(kāi)發(fā)者工具中找到你想要的數據。等有例子再詳細分析。
1.8 代理
在使用爬蟲(chóng)的過(guò)程中,難免會(huì )遇到帶有反爬蟲(chóng)的網(wǎng)站。這時(shí)候,我們需要一個(gè)代理ip。
使用代理IP,我們可以先從代理獲取代理網(wǎng)站,然后驗證IP是否可用。
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(南陽(yáng)理工學(xué)院ACM題目信息獲取源碼我們知道瀏覽器查看網(wǎng)頁(yè)時(shí) )
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 76 次瀏覽 ? 2022-03-12 02:00
)
南洋理工ACM專(zhuān)題信息
獲取源代碼
我們知道,瀏覽器在瀏覽網(wǎng)頁(yè)時(shí),首先會(huì )向服務(wù)器發(fā)送一個(gè)request請求,服務(wù)器會(huì )根據request請求做一些處理,生成一個(gè)response響應返回給瀏覽器,這個(gè)response收錄我們需要的網(wǎng)頁(yè)(或者數據,一般是靜態(tài)的網(wǎng)站或者服務(wù)器端渲染就是直接返回網(wǎng)頁(yè)),那么我們只需要模仿瀏覽器發(fā)送這個(gè)請求給服務(wù)器下載網(wǎng)頁(yè),而然后等待服務(wù)器發(fā)回響應。
1.引入第三方庫
import requests
from bs4 import BeautifulSoup
import csv
from tqdm import tqdm
2.模擬瀏覽器
Headers = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400'
3. 爬網(wǎng)
r = requests.get(
f'http://www.51mxd.cn/problemset.php-page={pages}.htm', Headers)
r.raise_for_status()
r.encoding = 'utf-8'
BeautifulSoup 網(wǎng)絡(luò )分析
學(xué)習了request,了解了偽裝技巧,終于可以爬到一些正常的web源碼(html文檔)了,但這離最后也是最重要的一步——篩選還差得很遠。這個(gè)過(guò)程就像在沙子里淘金一樣。沒(méi)有合適的篩子,你就會(huì )錯過(guò)有價(jià)值的東西,或者做無(wú)用的工作來(lái)篩掉無(wú)用的東西。
淘金者觀(guān)察土壤并制作篩子。對應爬蟲(chóng)字段就是觀(guān)察html,自定義過(guò)濾器。這里其實(shí)是一個(gè)簡(jiǎn)單的抓取 td 標簽
1.初始化
soup = BeautifulSoup(r.text, 'html.parser')
2.抓取節點(diǎn)
td = soup.find_all('td')
subject = []
for t in td:
if t.string is not None:
subject.append(t.string)
if len(subject) == 5:
subjects.append(subject)
subject = []
保存文件
with open('NYOJ_Subjects.csv', 'w', newline='') as file:
fileWriter = csv.writer(file)
fileWriter.writerow(csvHeaders)
fileWriter.writerows(subjects)
完整的源代碼
URL鏈接中.htm前面的數字是相關(guān)的,所以可以通過(guò)循環(huán)爬取多頁(yè)代碼,找到爬取數據的位置,編寫(xiě)代碼
import requests
from bs4 import BeautifulSoup
import csv
from tqdm import tqdm
Headers = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400'
csvHeaders = ['題號', '難度', '標題', '通過(guò)率', '通過(guò)數/總提交數']
subjects = []
for pages in tqdm(range(1, 11 + 1)):
r = requests.get(
f'http://www.51mxd.cn/problemset.php-page={pages}.htm', Headers)
r.raise_for_status()
r.encoding = 'utf-8'
soup = BeautifulSoup(r.text, 'html.parser')
td = soup.find_all('td')
subject = []
for t in td:
if t.string is not None:
subject.append(t.string)
if len(subject) == 5:
subjects.append(subject)
subject = []
with open('NYOJ_Subjects.csv', 'w', newline='') as file:
fileWriter = csv.writer(file)
fileWriter.writerow(csvHeaders)
fileWriter.writerows(subjects)
運行結果:
查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(南陽(yáng)理工學(xué)院ACM題目信息獲取源碼我們知道瀏覽器查看網(wǎng)頁(yè)時(shí)
)
南洋理工ACM專(zhuān)題信息

獲取源代碼
我們知道,瀏覽器在瀏覽網(wǎng)頁(yè)時(shí),首先會(huì )向服務(wù)器發(fā)送一個(gè)request請求,服務(wù)器會(huì )根據request請求做一些處理,生成一個(gè)response響應返回給瀏覽器,這個(gè)response收錄我們需要的網(wǎng)頁(yè)(或者數據,一般是靜態(tài)的網(wǎng)站或者服務(wù)器端渲染就是直接返回網(wǎng)頁(yè)),那么我們只需要模仿瀏覽器發(fā)送這個(gè)請求給服務(wù)器下載網(wǎng)頁(yè),而然后等待服務(wù)器發(fā)回響應。
1.引入第三方庫
import requests
from bs4 import BeautifulSoup
import csv
from tqdm import tqdm
2.模擬瀏覽器
Headers = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400'
3. 爬網(wǎng)
r = requests.get(
f'http://www.51mxd.cn/problemset.php-page={pages}.htm', Headers)
r.raise_for_status()
r.encoding = 'utf-8'
BeautifulSoup 網(wǎng)絡(luò )分析
學(xué)習了request,了解了偽裝技巧,終于可以爬到一些正常的web源碼(html文檔)了,但這離最后也是最重要的一步——篩選還差得很遠。這個(gè)過(guò)程就像在沙子里淘金一樣。沒(méi)有合適的篩子,你就會(huì )錯過(guò)有價(jià)值的東西,或者做無(wú)用的工作來(lái)篩掉無(wú)用的東西。
淘金者觀(guān)察土壤并制作篩子。對應爬蟲(chóng)字段就是觀(guān)察html,自定義過(guò)濾器。這里其實(shí)是一個(gè)簡(jiǎn)單的抓取 td 標簽

1.初始化
soup = BeautifulSoup(r.text, 'html.parser')
2.抓取節點(diǎn)
td = soup.find_all('td')
subject = []
for t in td:
if t.string is not None:
subject.append(t.string)
if len(subject) == 5:
subjects.append(subject)
subject = []
保存文件
with open('NYOJ_Subjects.csv', 'w', newline='') as file:
fileWriter = csv.writer(file)
fileWriter.writerow(csvHeaders)
fileWriter.writerows(subjects)
完整的源代碼
URL鏈接中.htm前面的數字是相關(guān)的,所以可以通過(guò)循環(huán)爬取多頁(yè)代碼,找到爬取數據的位置,編寫(xiě)代碼
import requests
from bs4 import BeautifulSoup
import csv
from tqdm import tqdm
Headers = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400'
csvHeaders = ['題號', '難度', '標題', '通過(guò)率', '通過(guò)數/總提交數']
subjects = []
for pages in tqdm(range(1, 11 + 1)):
r = requests.get(
f'http://www.51mxd.cn/problemset.php-page={pages}.htm', Headers)
r.raise_for_status()
r.encoding = 'utf-8'
soup = BeautifulSoup(r.text, 'html.parser')
td = soup.find_all('td')
subject = []
for t in td:
if t.string is not None:
subject.append(t.string)
if len(subject) == 5:
subjects.append(subject)
subject = []
with open('NYOJ_Subjects.csv', 'w', newline='') as file:
fileWriter = csv.writer(file)
fileWriter.writerow(csvHeaders)
fileWriter.writerows(subjects)
運行結果:
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(為什么說(shuō)用Python開(kāi)發(fā)爬蟲(chóng)更有優(yōu)勢?Java開(kāi)發(fā)不行嗎?)
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 117 次瀏覽 ? 2022-03-10 00:14
為什么用Python開(kāi)發(fā)爬蟲(chóng)更有優(yōu)勢?不能用Java開(kāi)發(fā)?今天小編就為大家講解一下!
C/C++
各種搜索引擎大多使用C/C++開(kāi)發(fā)爬蟲(chóng),可能是因為搜索引擎爬蟲(chóng)重要的是采集網(wǎng)站信息,對頁(yè)面的解析要求不高。
Python
Python語(yǔ)言具有強大的網(wǎng)絡(luò )功能,可以模擬登錄和解析JavaScript。缺點(diǎn)是網(wǎng)頁(yè)解析。Python 編寫(xiě)程序非常方便,特別是對于專(zhuān)注的爬蟲(chóng)。目標 網(wǎng)站 經(jīng)常更改。使用Python根據目標的變化開(kāi)發(fā)爬蟲(chóng)程序非常方便。
爪哇
Java有很多解析器,對網(wǎng)頁(yè)的解析支持非常好。缺點(diǎn)是網(wǎng)絡(luò )部分支持較差。
對于一般需求,Java 或 Python 都可以完成這項工作。如果需要模擬登錄,選擇Python對抗反爬蟲(chóng)比較方便。如果需要處理復雜的網(wǎng)頁(yè),解析網(wǎng)頁(yè)內容生成結構化數據,或者需要精細解析網(wǎng)頁(yè)內容,可以選擇Java。
選擇 Python 作為實(shí)現爬蟲(chóng)的語(yǔ)言的主要考慮因素是:
(1) 爬取網(wǎng)頁(yè)本身的界面
與其他動(dòng)態(tài)腳本語(yǔ)言(如Perl、Shell)相比,Python的urllib2包提供了更完善的訪(fǎng)問(wèn)web文檔的API;與其他靜態(tài)編程語(yǔ)言(如Java、C#、C++)相比,Python爬取網(wǎng)頁(yè)文檔。界面更簡(jiǎn)潔。
另外,爬取網(wǎng)頁(yè)有時(shí)需要模擬瀏覽器的行為,很多網(wǎng)站被屏蔽用于生硬的爬蟲(chóng)爬取。這時(shí)候我們就需要模擬User Agent的行為來(lái)構造合適的請求,比如模擬用戶(hù)登錄,模擬Session/Cookie的存儲和設置。Python 中有一些優(yōu)秀的第三方包可以為你做這件事,例如 Requests 或 Mechanize。
(2) 爬取后處理
抓取的網(wǎng)頁(yè)通常需要進(jìn)行處理,例如過(guò)濾Html標簽、提取文本等。Python的Beautiful Soup提供了簡(jiǎn)潔的文檔處理功能,可以用極短的代碼完成大部分文檔處理。
其實(shí)很多語(yǔ)言和工具都可以做到以上功能,但是Python可以做到最快最干凈,就像那句“人生苦短,你需要Python”一樣。
(3) 開(kāi)發(fā)效率高
因為爬蟲(chóng)的具體代碼要根據網(wǎng)站進(jìn)行修改,而Python靈活的腳本語(yǔ)言特別適合這個(gè)任務(wù)。
(4) 快速入門(mén)
網(wǎng)上有很多Python教學(xué)資源,方便大家學(xué)習,有問(wèn)題也很容易找到相關(guān)資料。此外,Python 對成熟的爬蟲(chóng)框架也有很強的支持,比如 Scrapy。返回搜狐,查看更多 查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(為什么說(shuō)用Python開(kāi)發(fā)爬蟲(chóng)更有優(yōu)勢?Java開(kāi)發(fā)不行嗎?)
為什么用Python開(kāi)發(fā)爬蟲(chóng)更有優(yōu)勢?不能用Java開(kāi)發(fā)?今天小編就為大家講解一下!

C/C++
各種搜索引擎大多使用C/C++開(kāi)發(fā)爬蟲(chóng),可能是因為搜索引擎爬蟲(chóng)重要的是采集網(wǎng)站信息,對頁(yè)面的解析要求不高。
Python
Python語(yǔ)言具有強大的網(wǎng)絡(luò )功能,可以模擬登錄和解析JavaScript。缺點(diǎn)是網(wǎng)頁(yè)解析。Python 編寫(xiě)程序非常方便,特別是對于專(zhuān)注的爬蟲(chóng)。目標 網(wǎng)站 經(jīng)常更改。使用Python根據目標的變化開(kāi)發(fā)爬蟲(chóng)程序非常方便。
爪哇
Java有很多解析器,對網(wǎng)頁(yè)的解析支持非常好。缺點(diǎn)是網(wǎng)絡(luò )部分支持較差。
對于一般需求,Java 或 Python 都可以完成這項工作。如果需要模擬登錄,選擇Python對抗反爬蟲(chóng)比較方便。如果需要處理復雜的網(wǎng)頁(yè),解析網(wǎng)頁(yè)內容生成結構化數據,或者需要精細解析網(wǎng)頁(yè)內容,可以選擇Java。

選擇 Python 作為實(shí)現爬蟲(chóng)的語(yǔ)言的主要考慮因素是:
(1) 爬取網(wǎng)頁(yè)本身的界面
與其他動(dòng)態(tài)腳本語(yǔ)言(如Perl、Shell)相比,Python的urllib2包提供了更完善的訪(fǎng)問(wèn)web文檔的API;與其他靜態(tài)編程語(yǔ)言(如Java、C#、C++)相比,Python爬取網(wǎng)頁(yè)文檔。界面更簡(jiǎn)潔。
另外,爬取網(wǎng)頁(yè)有時(shí)需要模擬瀏覽器的行為,很多網(wǎng)站被屏蔽用于生硬的爬蟲(chóng)爬取。這時(shí)候我們就需要模擬User Agent的行為來(lái)構造合適的請求,比如模擬用戶(hù)登錄,模擬Session/Cookie的存儲和設置。Python 中有一些優(yōu)秀的第三方包可以為你做這件事,例如 Requests 或 Mechanize。
(2) 爬取后處理
抓取的網(wǎng)頁(yè)通常需要進(jìn)行處理,例如過(guò)濾Html標簽、提取文本等。Python的Beautiful Soup提供了簡(jiǎn)潔的文檔處理功能,可以用極短的代碼完成大部分文檔處理。
其實(shí)很多語(yǔ)言和工具都可以做到以上功能,但是Python可以做到最快最干凈,就像那句“人生苦短,你需要Python”一樣。
(3) 開(kāi)發(fā)效率高
因為爬蟲(chóng)的具體代碼要根據網(wǎng)站進(jìn)行修改,而Python靈活的腳本語(yǔ)言特別適合這個(gè)任務(wù)。
(4) 快速入門(mén)
網(wǎng)上有很多Python教學(xué)資源,方便大家學(xué)習,有問(wèn)題也很容易找到相關(guān)資料。此外,Python 對成熟的爬蟲(chóng)框架也有很強的支持,比如 Scrapy。返回搜狐,查看更多
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(查看更多寫(xiě)博客Python網(wǎng)絡(luò )爬蟲(chóng)反爬源碼分享--蘇飛版)
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 72 次瀏覽 ? 2022-03-10 00:11
阿里云>云棲社區>主題圖>C>c爬蟲(chóng)源碼
推薦活動(dòng):
更多優(yōu)惠>
當前話(huà)題:c網(wǎng)絡(luò )爬蟲(chóng)源碼加入采集
相關(guān)話(huà)題:
C網(wǎng)絡(luò )爬蟲(chóng)源碼相關(guān)博客看更多博文
Python網(wǎng)絡(luò )爬蟲(chóng)反爬破解攻略實(shí)戰
作者:薇薇8128 瀏覽評論:04年前
作者:薇薇,請注明出處。我們經(jīng)常會(huì )寫(xiě)一些網(wǎng)絡(luò )爬蟲(chóng),想必大家都會(huì )有一種感覺(jué),雖然寫(xiě)爬蟲(chóng)不難,但是反爬很難處理,因為大部分網(wǎng)站都有自己的反爬機制,所以我們將更加難以抓取這些數據。但是,對于每一種反爬機制,我們其實(shí)都會(huì )有相應的解決方案。作為一個(gè)爬蟲(chóng),我們,
閱讀全文
C#HttpHelper爬蟲(chóng)源碼分享--蘇飛版
作者:蘇飛2071 瀏覽評論:03年前
簡(jiǎn)介C#HttpHelper實(shí)現了C#HttpWebRequest爬取時(shí)忽略編碼、忽略證書(shū)、忽略cookie的功能,實(shí)現代理的功能。有了它,您可以發(fā)出 Get 和 Post 請求,并且可以輕松設置 cookie、證書(shū)、代理和編碼。你不用擔心這個(gè)問(wèn)題,因為類(lèi)會(huì )自動(dòng)為你識別頁(yè)面
閱讀全文
Python網(wǎng)絡(luò )爬蟲(chóng)抓取極品姐姐的視頻并保存到文件
作者:keitwotest1060 瀏覽評論:04年前
項目描述 使用Python編寫(xiě)一個(gè)網(wǎng)絡(luò )爬蟲(chóng)爬取Best Sister的視頻并保存到文件中使用工具示例 Python2.7.X, pycharm 使用方法 創(chuàng )建視頻爬取Best Sister in pycharm .py 文件,并在當前目錄下創(chuàng )建video文件夾,用于存放采集到的視頻文件,編寫(xiě)代碼,運行
閱讀全文
Java版網(wǎng)絡(luò )爬蟲(chóng)基礎(轉)
作者:developerguy851 瀏覽評論:06年前
網(wǎng)絡(luò )爬蟲(chóng)不僅可以爬取網(wǎng)站網(wǎng)頁(yè)和圖片,甚至可以實(shí)現搶票、網(wǎng)上購買(mǎi)、機票查詢(xún)。這幾天看了一些基礎知識,記錄下來(lái)。網(wǎng)頁(yè)之間的關(guān)系可以看成一個(gè)大圖,圖的遍歷可以分為深度優(yōu)先和廣度優(yōu)先。網(wǎng)絡(luò )爬蟲(chóng)采取的廣度優(yōu)先方式總結如下:2個(gè)數組,一個(gè)
閱讀全文
C# 網(wǎng)絡(luò )爬蟲(chóng)
作者:Street Corner Box 712 查看評論:05 年前
公司的編輯妹需要爬取網(wǎng)頁(yè)的內容,讓我幫我做一個(gè)簡(jiǎn)單的爬取工具。這是抓取網(wǎng)頁(yè)的內容??磥?lái)這對大家來(lái)說(shuō)并不難,不過(guò)這里有一些小改動(dòng),代碼提供,請參考 1 private string GetHttpWebRequest(string url) 2 { 3 Ht
閱讀全文
C#網(wǎng)絡(luò )爬蟲(chóng)--多線(xiàn)程增強版
作者:街角盒飯 688 次瀏覽評論:05 年前
上次給公司的一個(gè)女生做爬蟲(chóng),不是很精致。這次是在公司項目中使用的,所以做了一些改動(dòng)。該函數添加了一個(gè)URL圖片采集,下載,線(xiàn)程處理接口URL圖片下載等。說(shuō)說(shuō)思路:總理在初始網(wǎng)站采集圖片去獲取初始網(wǎng)站的所有內容到初始網(wǎng)站 采集 鏈接并將 采集 的鏈接放入隊列以繼續 采集 圖片
閱讀全文
一篇文章文章教你使用Python網(wǎng)絡(luò )爬蟲(chóng)爬取評論區百度貼吧圖片和視頻
作者:python進(jìn)階26人查看評論:01年前
[一、項目背景]百度貼吧是全球最大的中文交流平臺。你是不是和我一樣,有時(shí)候看到評論區的圖片就想下載?或者觀(guān)看視頻并想下載?今天小編帶大家通過(guò)搜索關(guān)鍵詞,在評論區獲取圖片和視頻。[二、項目目標]實(shí)現貼吧獲取的圖片或視頻可以保存在
閱讀全文
一篇文章文章教你用Python網(wǎng)絡(luò )爬蟲(chóng)搞定差旅攻略
作者:python進(jìn)階13人查看評論:01年前
[一、項目背景] 趣游網(wǎng)提供原創(chuàng )實(shí)用的出境旅游指南、攻略、旅游社區和問(wèn)答平臺,以及智能旅游規劃解決方案,以及簽證、保險、機票、酒店在線(xiàn)預訂、租車(chē)等增值服務(wù)。僑游“鼓勵和幫助中國游客以自己的視角和方式體驗世界”。今天就教大家如何獲取僑友網(wǎng)的城市信息。
閱讀全文 查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(查看更多寫(xiě)博客Python網(wǎng)絡(luò )爬蟲(chóng)反爬源碼分享--蘇飛版)
阿里云>云棲社區>主題圖>C>c爬蟲(chóng)源碼

推薦活動(dòng):
更多優(yōu)惠>
當前話(huà)題:c網(wǎng)絡(luò )爬蟲(chóng)源碼加入采集
相關(guān)話(huà)題:
C網(wǎng)絡(luò )爬蟲(chóng)源碼相關(guān)博客看更多博文
Python網(wǎng)絡(luò )爬蟲(chóng)反爬破解攻略實(shí)戰

作者:薇薇8128 瀏覽評論:04年前
作者:薇薇,請注明出處。我們經(jīng)常會(huì )寫(xiě)一些網(wǎng)絡(luò )爬蟲(chóng),想必大家都會(huì )有一種感覺(jué),雖然寫(xiě)爬蟲(chóng)不難,但是反爬很難處理,因為大部分網(wǎng)站都有自己的反爬機制,所以我們將更加難以抓取這些數據。但是,對于每一種反爬機制,我們其實(shí)都會(huì )有相應的解決方案。作為一個(gè)爬蟲(chóng),我們,
閱讀全文
C#HttpHelper爬蟲(chóng)源碼分享--蘇飛版

作者:蘇飛2071 瀏覽評論:03年前
簡(jiǎn)介C#HttpHelper實(shí)現了C#HttpWebRequest爬取時(shí)忽略編碼、忽略證書(shū)、忽略cookie的功能,實(shí)現代理的功能。有了它,您可以發(fā)出 Get 和 Post 請求,并且可以輕松設置 cookie、證書(shū)、代理和編碼。你不用擔心這個(gè)問(wèn)題,因為類(lèi)會(huì )自動(dòng)為你識別頁(yè)面
閱讀全文
Python網(wǎng)絡(luò )爬蟲(chóng)抓取極品姐姐的視頻并保存到文件

作者:keitwotest1060 瀏覽評論:04年前
項目描述 使用Python編寫(xiě)一個(gè)網(wǎng)絡(luò )爬蟲(chóng)爬取Best Sister的視頻并保存到文件中使用工具示例 Python2.7.X, pycharm 使用方法 創(chuàng )建視頻爬取Best Sister in pycharm .py 文件,并在當前目錄下創(chuàng )建video文件夾,用于存放采集到的視頻文件,編寫(xiě)代碼,運行
閱讀全文
Java版網(wǎng)絡(luò )爬蟲(chóng)基礎(轉)

作者:developerguy851 瀏覽評論:06年前
網(wǎng)絡(luò )爬蟲(chóng)不僅可以爬取網(wǎng)站網(wǎng)頁(yè)和圖片,甚至可以實(shí)現搶票、網(wǎng)上購買(mǎi)、機票查詢(xún)。這幾天看了一些基礎知識,記錄下來(lái)。網(wǎng)頁(yè)之間的關(guān)系可以看成一個(gè)大圖,圖的遍歷可以分為深度優(yōu)先和廣度優(yōu)先。網(wǎng)絡(luò )爬蟲(chóng)采取的廣度優(yōu)先方式總結如下:2個(gè)數組,一個(gè)
閱讀全文
C# 網(wǎng)絡(luò )爬蟲(chóng)

作者:Street Corner Box 712 查看評論:05 年前
公司的編輯妹需要爬取網(wǎng)頁(yè)的內容,讓我幫我做一個(gè)簡(jiǎn)單的爬取工具。這是抓取網(wǎng)頁(yè)的內容??磥?lái)這對大家來(lái)說(shuō)并不難,不過(guò)這里有一些小改動(dòng),代碼提供,請參考 1 private string GetHttpWebRequest(string url) 2 { 3 Ht
閱讀全文
C#網(wǎng)絡(luò )爬蟲(chóng)--多線(xiàn)程增強版

作者:街角盒飯 688 次瀏覽評論:05 年前
上次給公司的一個(gè)女生做爬蟲(chóng),不是很精致。這次是在公司項目中使用的,所以做了一些改動(dòng)。該函數添加了一個(gè)URL圖片采集,下載,線(xiàn)程處理接口URL圖片下載等。說(shuō)說(shuō)思路:總理在初始網(wǎng)站采集圖片去獲取初始網(wǎng)站的所有內容到初始網(wǎng)站 采集 鏈接并將 采集 的鏈接放入隊列以繼續 采集 圖片
閱讀全文
一篇文章文章教你使用Python網(wǎng)絡(luò )爬蟲(chóng)爬取評論區百度貼吧圖片和視頻

作者:python進(jìn)階26人查看評論:01年前
[一、項目背景]百度貼吧是全球最大的中文交流平臺。你是不是和我一樣,有時(shí)候看到評論區的圖片就想下載?或者觀(guān)看視頻并想下載?今天小編帶大家通過(guò)搜索關(guān)鍵詞,在評論區獲取圖片和視頻。[二、項目目標]實(shí)現貼吧獲取的圖片或視頻可以保存在
閱讀全文
一篇文章文章教你用Python網(wǎng)絡(luò )爬蟲(chóng)搞定差旅攻略

作者:python進(jìn)階13人查看評論:01年前
[一、項目背景] 趣游網(wǎng)提供原創(chuàng )實(shí)用的出境旅游指南、攻略、旅游社區和問(wèn)答平臺,以及智能旅游規劃解決方案,以及簽證、保險、機票、酒店在線(xiàn)預訂、租車(chē)等增值服務(wù)。僑游“鼓勵和幫助中國游客以自己的視角和方式體驗世界”。今天就教大家如何獲取僑友網(wǎng)的城市信息。
閱讀全文
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據( 風(fēng)中蹦迪03-0803:07閱讀4網(wǎng)站SEO優(yōu)化關(guān)注實(shí)戰)
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 59 次瀏覽 ? 2022-03-09 20:14
風(fēng)中蹦迪03-0803:07閱讀4網(wǎng)站SEO優(yōu)化關(guān)注實(shí)戰)
隨風(fēng)起舞
03-08 03:07 閱讀4 網(wǎng)站SEO優(yōu)化
專(zhuān)注于
【網(wǎng)絡(luò )爬蟲(chóng)學(xué)習】實(shí)戰,爬取網(wǎng)頁(yè)和貼吧數據
戰斗一
抓取您想要的網(wǎng)頁(yè)并將其保存到本地計算機。
首先我們簡(jiǎn)單分析下要編寫(xiě)的爬蟲(chóng)程序,可以分為以下三個(gè)部分:
理清邏輯后,我們就可以正式編寫(xiě)爬蟲(chóng)程序了。
導入所需模塊
from urllib import request, parse
連接 URL 地址
定義 URL 變量并連接 url 地址。代碼如下所示:
url = ‘http://www.baidu.com/s?wd={}‘
word = input(‘請輸入想要搜索的內容:‘)
params = parse.quote(word)
full_url = url.format(params)
向 URL 發(fā)送請求
發(fā)送請求主要分為以下幾個(gè)步驟:
代碼如下所示:
# 重構請求頭
headers = {
‘User-Agent‘:
‘Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0‘
}
# 創(chuàng )建請求對應
req = request.Request(url=full_url, headers=headers)
# 獲取響應對象
res = request.urlopen(req)
# 獲取響應內容
html = res.read().decode(‘utf-8‘)
另存為本地文件
將爬取的照片保存到本地,這里需要使用Python編程文件IO操作,代碼如下:
filename = word + ‘.html‘
with open(filename, ‘w‘, encoding=‘utf-8‘) as f:
f.write(html)
完整的程序如下所示:
from urllib import request, parse
# 1.拼url地址
url = ‘http://www.baidu.com/s?wd={}‘
word = input(‘請輸入想要搜索的內容:‘)
params = parse.quote(word)
full_url = url.format(params)
# 2.發(fā)請求保存到本地
# 重構請求頭
headers = {
‘User-Agent‘:
‘Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0‘
}
# 創(chuàng )建請求對應
req = request.Request(url=full_url, headers=headers)
# 獲取響應對象
res = request.urlopen(req)
# 獲取響應內容
html = res.read().decode(‘utf-8‘)
# 3.保存文件至當前目錄
filename = word + ‘.html‘
with open(filename, ‘w‘, encoding=‘utf-8‘) as f:
f.write(html)
嘗試運行程序,進(jìn)入RioTianの博客園,確認搜索,在當前工作目錄下會(huì )找到“RioTianの博客園.html”文件。
函數式編程修飾符
Python函數式編程可以讓程序的思路更清晰,更容易理解。接下來(lái),利用函數式編程的思想,對上面的代碼進(jìn)行修改。
定義相應的函數,調用該函數執行爬蟲(chóng)程序。修改后的代碼如下所示:
from urllib import request, parse
# 拼接URL地址
def get_url(word):
url = ‘http://www.baidu.com/s?{}‘
# 此處使用urlencode()進(jìn)行編碼
params = parse.urlencode({‘wd‘: word})
url = url.format(params)
return url
# 發(fā)請求,保存本地文件
def request_url(url, filename):
headers = {
‘User-Agent‘:
‘Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0‘
}
# 請求對象 + 響應對象 + 提取內容
req = request.Request(url=url, headers=headers)
res = request.urlopen(req)
html = res.read().decode(‘utf-8‘)
# 保存文件至本地
with open(filename, ‘w‘, encoding=‘utf-8‘) as f:
f.write(html)
# 主程序入口
if __name__ == ‘__main__‘:
word = input(‘請輸入搜索內容:‘)
url = get_url(word)
filename = word + ‘.html‘
request_url(url, filename)
除了使用函數式編程,還可以使用面向對象的編程方式(實(shí)戰二),后續內容會(huì )介紹。
第二幕
爬百度貼吧(Python爬蟲(chóng),編程,只抓取貼吧的前5頁(yè)。
確定頁(yè)面類(lèi)型
通過(guò)簡(jiǎn)單的分析,我們可以知道要爬取的頁(yè)面是靜態(tài)網(wǎng)頁(yè),分析方法很簡(jiǎn)單:打開(kāi)百度貼吧,搜索“Python爬蟲(chóng)”,復制其中任意一條信息出現的頁(yè)面,如“爬蟲(chóng)需要http代理”,然后右鍵選擇查看源代碼,在源代碼頁(yè)面使用Ctrl+F快捷鍵搜索剛剛復制的數據,如下圖:
從上圖可以看出,頁(yè)面中的所有信息都收錄在源頁(yè)面中,不需要單獨從數據庫中加載數據,所以頁(yè)面是靜態(tài)頁(yè)面。
找出 URL 變化的規律性
接下來(lái),查找要抓取的頁(yè)面的 URL 模式。搜索“Python爬蟲(chóng)”后,貼吧的首頁(yè)網(wǎng)址如下:
https://tieba.baidu.com/f?ie=utf-8&kw=python爬蟲(chóng)&fr=search
點(diǎn)擊第二頁(yè),其url信息如下:
https://tieba.baidu.com/f?kw=python爬蟲(chóng)&ie=utf-8&pn=50
點(diǎn)擊第三頁(yè),url信息如下:
https://tieba.baidu.com/f?kw=python爬蟲(chóng)&ie=utf-8&pn=100
再次點(diǎn)擊第一頁(yè),url信息如下:
https://tieba.baidu.com/f?kw=python爬蟲(chóng)&ie=utf-8&pn=0
如果還是不能確定,可以繼續多瀏覽幾頁(yè)。最后發(fā)現url有兩個(gè)查詢(xún)參數kw和pn,pn參數有規律是這樣的:
第n頁(yè):pn=(n-1)*50
#參數params
pn=(page-1)*50
params={
‘kw‘:name,
‘pn‘:str(pn)
}
url地址可以簡(jiǎn)寫(xiě)為:
https://tieba.baidu.com/f?kw=python爬蟲(chóng)&pn=450
編寫(xiě)爬蟲(chóng)
爬蟲(chóng)程序以類(lèi)的形式編寫(xiě),在類(lèi)下編寫(xiě)不同的功能函數。代碼如下:
from urllib import request,parse
import time
import random
from ua_info import ua_list #使用自定義的ua池
#定義一個(gè)爬蟲(chóng)類(lèi)
class TiebaSpider(object):
#初始化url屬性
def __init__(self):
self.url=‘http://tieba.baidu.com/f?{}‘
# 1.請求函數,得到頁(yè)面,傳統三步
def get_html(self,url):
req=request.Request(url=url,headers={‘User-Agent‘:random.choice(ua_list)})
res=request.urlopen(req)
#windows會(huì )存在亂碼問(wèn)題,需要使用 gbk解碼,并使用ignore忽略不能處理的字節
#linux不會(huì )存在上述問(wèn)題,可以直接使用decode(‘utf-8‘)解碼
html=res.read().decode("gbk","ignore")
return html
# 2.解析函數,此處代碼暫時(shí)省略,還沒(méi)介紹解析模塊
def parse_html(self):
pass
# 3.保存文件函數
def save_html(self,filename,html):
with open(filename,‘w‘) as f:
f.write(html)
# 4.入口函數
def run(self):
name=input(‘輸入貼吧名:‘)
begin=int(input(‘輸入起始頁(yè):‘))
stop=int(input(‘輸入終止頁(yè):‘))
# +1 操作保證能夠取到整數
for page in range(begin,stop+1):
pn=(page-1)*50
params={
‘kw‘:name,
‘pn‘:str(pn)
}
#拼接URL地址
params=parse.urlencode(params)
url=self.url.format(params)
#發(fā)請求
html=self.get_html(url)
#定義路徑
filename=‘{}-{}頁(yè).html‘.format(name,page)
self.save_html(filename,html)
#提示
print(‘第%d頁(yè)抓取成功‘%page)
#每爬取一個(gè)頁(yè)面隨機休眠1-2秒鐘的時(shí)間
time.sleep(random.randint(1,2))
#以腳本的形式啟動(dòng)爬蟲(chóng)
if __name__==‘__main__‘:
start=time.time()
spider=TiebaSpider() #實(shí)例化一個(gè)對象spider
spider.run() #調用入口函數
end=time.time()
#查看程序執行時(shí)間
print(‘執行時(shí)間:%.2f‘%(end-start)) #爬蟲(chóng)執行時(shí)間
程序執行后,爬取的文件會(huì )保存到Pycharm的當前工作目錄下,輸出為:
輸入貼吧名:python爬蟲(chóng)
輸入起始頁(yè):1
輸入終止頁(yè):2
第1頁(yè)抓取成功
第2頁(yè)抓取成功
執行時(shí)間:12.25
以面向對象的方式編寫(xiě)爬蟲(chóng)程序時(shí),思路簡(jiǎn)單,邏輯清晰,非常容易理解。上述代碼主要包括四個(gè)功能函數,分別負責不同的功能,總結如下:
1) 請求函數
request函數的最終結果是返回一個(gè)HTML對象,方便后續函數調用。
2) 分析函數
解析函數用于解析 HTML 頁(yè)面。常見(jiàn)的解析模塊有正則解析模塊和bs4解析模塊。通過(guò)分析頁(yè)面,提取出需要的數據,在后續內容中會(huì )詳細介紹。
3) 保存數據功能
該函數負責將采集到的數據保存到數據庫,如MySQL、MongoDB等,或者保存為文件格式,如csv、txt、excel等。
4) 入口函數
入口函數作為整個(gè)爬蟲(chóng)程序的橋梁,通過(guò)調用不同的函數函數實(shí)現最終的數據抓取。入口函數的主要任務(wù)是組織數據,比如要搜索的貼吧的名字,編碼url參數,拼接url地址,定義文件存儲路徑。
履帶結構
用面向對象的方式編寫(xiě)爬蟲(chóng)程序時(shí),邏輯結構是比較固定的,總結如下:
# 程序結構
class xxxSpider(object):
def __init__(self):
# 定義常用變量,比如url或計數變量等
def get_html(self):
# 獲取響應內容函數,使用隨機User-Agent
def parse_html(self):
# 使用正則表達式來(lái)解析頁(yè)面,提取數據
def write_html(self):
# 將提取的數據按要求保存,csv、MySQL數據庫等
def run(self):
# 主函數,用來(lái)控制整體邏輯
if __name__ == ‘__main__‘:
# 程序開(kāi)始運行時(shí)間
spider = xxxSpider()
spider.run()
注意:掌握以上編程邏輯將有助于您后續的學(xué)習。
爬蟲(chóng)隨機休眠
在入口函數代碼中,收錄以下代碼:
# 每爬取一個(gè)頁(yè)面隨機休眠1-2秒鐘的時(shí)間
time.sleep(random.randint(1,2))
爬蟲(chóng)訪(fǎng)問(wèn) 網(wǎng)站 會(huì )非???,這與正常的人類(lèi)點(diǎn)擊行為非常不符。因此,通過(guò)隨機休眠,爬蟲(chóng)可以模仿人類(lèi)點(diǎn)擊網(wǎng)站,使得網(wǎng)站不容易察覺(jué)是爬蟲(chóng)訪(fǎng)問(wèn)網(wǎng)站,但這樣做的代價(jià)是影響程序的執行效率。
焦點(diǎn)爬蟲(chóng)是一個(gè)執行效率低的程序,提高其性能是業(yè)界一直關(guān)注的問(wèn)題。于是,高效的 Python 爬蟲(chóng)框架 Scrapy 應運而生。
原版的: 查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(
風(fēng)中蹦迪03-0803:07閱讀4網(wǎng)站SEO優(yōu)化關(guān)注實(shí)戰)
隨風(fēng)起舞
03-08 03:07 閱讀4 網(wǎng)站SEO優(yōu)化
專(zhuān)注于
【網(wǎng)絡(luò )爬蟲(chóng)學(xué)習】實(shí)戰,爬取網(wǎng)頁(yè)和貼吧數據

戰斗一
抓取您想要的網(wǎng)頁(yè)并將其保存到本地計算機。
首先我們簡(jiǎn)單分析下要編寫(xiě)的爬蟲(chóng)程序,可以分為以下三個(gè)部分:
理清邏輯后,我們就可以正式編寫(xiě)爬蟲(chóng)程序了。
導入所需模塊
from urllib import request, parse
連接 URL 地址
定義 URL 變量并連接 url 地址。代碼如下所示:
url = ‘http://www.baidu.com/s?wd={}‘
word = input(‘請輸入想要搜索的內容:‘)
params = parse.quote(word)
full_url = url.format(params)
向 URL 發(fā)送請求
發(fā)送請求主要分為以下幾個(gè)步驟:
代碼如下所示:
# 重構請求頭
headers = {
‘User-Agent‘:
‘Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0‘
}
# 創(chuàng )建請求對應
req = request.Request(url=full_url, headers=headers)
# 獲取響應對象
res = request.urlopen(req)
# 獲取響應內容
html = res.read().decode(‘utf-8‘)
另存為本地文件
將爬取的照片保存到本地,這里需要使用Python編程文件IO操作,代碼如下:
filename = word + ‘.html‘
with open(filename, ‘w‘, encoding=‘utf-8‘) as f:
f.write(html)
完整的程序如下所示:
from urllib import request, parse
# 1.拼url地址
url = ‘http://www.baidu.com/s?wd={}‘
word = input(‘請輸入想要搜索的內容:‘)
params = parse.quote(word)
full_url = url.format(params)
# 2.發(fā)請求保存到本地
# 重構請求頭
headers = {
‘User-Agent‘:
‘Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0‘
}
# 創(chuàng )建請求對應
req = request.Request(url=full_url, headers=headers)
# 獲取響應對象
res = request.urlopen(req)
# 獲取響應內容
html = res.read().decode(‘utf-8‘)
# 3.保存文件至當前目錄
filename = word + ‘.html‘
with open(filename, ‘w‘, encoding=‘utf-8‘) as f:
f.write(html)
嘗試運行程序,進(jìn)入RioTianの博客園,確認搜索,在當前工作目錄下會(huì )找到“RioTianの博客園.html”文件。
函數式編程修飾符
Python函數式編程可以讓程序的思路更清晰,更容易理解。接下來(lái),利用函數式編程的思想,對上面的代碼進(jìn)行修改。
定義相應的函數,調用該函數執行爬蟲(chóng)程序。修改后的代碼如下所示:
from urllib import request, parse
# 拼接URL地址
def get_url(word):
url = ‘http://www.baidu.com/s?{}‘
# 此處使用urlencode()進(jìn)行編碼
params = parse.urlencode({‘wd‘: word})
url = url.format(params)
return url
# 發(fā)請求,保存本地文件
def request_url(url, filename):
headers = {
‘User-Agent‘:
‘Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0‘
}
# 請求對象 + 響應對象 + 提取內容
req = request.Request(url=url, headers=headers)
res = request.urlopen(req)
html = res.read().decode(‘utf-8‘)
# 保存文件至本地
with open(filename, ‘w‘, encoding=‘utf-8‘) as f:
f.write(html)
# 主程序入口
if __name__ == ‘__main__‘:
word = input(‘請輸入搜索內容:‘)
url = get_url(word)
filename = word + ‘.html‘
request_url(url, filename)
除了使用函數式編程,還可以使用面向對象的編程方式(實(shí)戰二),后續內容會(huì )介紹。
第二幕
爬百度貼吧(Python爬蟲(chóng),編程,只抓取貼吧的前5頁(yè)。
確定頁(yè)面類(lèi)型
通過(guò)簡(jiǎn)單的分析,我們可以知道要爬取的頁(yè)面是靜態(tài)網(wǎng)頁(yè),分析方法很簡(jiǎn)單:打開(kāi)百度貼吧,搜索“Python爬蟲(chóng)”,復制其中任意一條信息出現的頁(yè)面,如“爬蟲(chóng)需要http代理”,然后右鍵選擇查看源代碼,在源代碼頁(yè)面使用Ctrl+F快捷鍵搜索剛剛復制的數據,如下圖:
從上圖可以看出,頁(yè)面中的所有信息都收錄在源頁(yè)面中,不需要單獨從數據庫中加載數據,所以頁(yè)面是靜態(tài)頁(yè)面。
找出 URL 變化的規律性
接下來(lái),查找要抓取的頁(yè)面的 URL 模式。搜索“Python爬蟲(chóng)”后,貼吧的首頁(yè)網(wǎng)址如下:
https://tieba.baidu.com/f?ie=utf-8&kw=python爬蟲(chóng)&fr=search
點(diǎn)擊第二頁(yè),其url信息如下:
https://tieba.baidu.com/f?kw=python爬蟲(chóng)&ie=utf-8&pn=50
點(diǎn)擊第三頁(yè),url信息如下:
https://tieba.baidu.com/f?kw=python爬蟲(chóng)&ie=utf-8&pn=100
再次點(diǎn)擊第一頁(yè),url信息如下:
https://tieba.baidu.com/f?kw=python爬蟲(chóng)&ie=utf-8&pn=0
如果還是不能確定,可以繼續多瀏覽幾頁(yè)。最后發(fā)現url有兩個(gè)查詢(xún)參數kw和pn,pn參數有規律是這樣的:
第n頁(yè):pn=(n-1)*50
#參數params
pn=(page-1)*50
params={
‘kw‘:name,
‘pn‘:str(pn)
}
url地址可以簡(jiǎn)寫(xiě)為:
https://tieba.baidu.com/f?kw=python爬蟲(chóng)&pn=450
編寫(xiě)爬蟲(chóng)
爬蟲(chóng)程序以類(lèi)的形式編寫(xiě),在類(lèi)下編寫(xiě)不同的功能函數。代碼如下:
from urllib import request,parse
import time
import random
from ua_info import ua_list #使用自定義的ua池
#定義一個(gè)爬蟲(chóng)類(lèi)
class TiebaSpider(object):
#初始化url屬性
def __init__(self):
self.url=‘http://tieba.baidu.com/f?{}‘
# 1.請求函數,得到頁(yè)面,傳統三步
def get_html(self,url):
req=request.Request(url=url,headers={‘User-Agent‘:random.choice(ua_list)})
res=request.urlopen(req)
#windows會(huì )存在亂碼問(wèn)題,需要使用 gbk解碼,并使用ignore忽略不能處理的字節
#linux不會(huì )存在上述問(wèn)題,可以直接使用decode(‘utf-8‘)解碼
html=res.read().decode("gbk","ignore")
return html
# 2.解析函數,此處代碼暫時(shí)省略,還沒(méi)介紹解析模塊
def parse_html(self):
pass
# 3.保存文件函數
def save_html(self,filename,html):
with open(filename,‘w‘) as f:
f.write(html)
# 4.入口函數
def run(self):
name=input(‘輸入貼吧名:‘)
begin=int(input(‘輸入起始頁(yè):‘))
stop=int(input(‘輸入終止頁(yè):‘))
# +1 操作保證能夠取到整數
for page in range(begin,stop+1):
pn=(page-1)*50
params={
‘kw‘:name,
‘pn‘:str(pn)
}
#拼接URL地址
params=parse.urlencode(params)
url=self.url.format(params)
#發(fā)請求
html=self.get_html(url)
#定義路徑
filename=‘{}-{}頁(yè).html‘.format(name,page)
self.save_html(filename,html)
#提示
print(‘第%d頁(yè)抓取成功‘%page)
#每爬取一個(gè)頁(yè)面隨機休眠1-2秒鐘的時(shí)間
time.sleep(random.randint(1,2))
#以腳本的形式啟動(dòng)爬蟲(chóng)
if __name__==‘__main__‘:
start=time.time()
spider=TiebaSpider() #實(shí)例化一個(gè)對象spider
spider.run() #調用入口函數
end=time.time()
#查看程序執行時(shí)間
print(‘執行時(shí)間:%.2f‘%(end-start)) #爬蟲(chóng)執行時(shí)間
程序執行后,爬取的文件會(huì )保存到Pycharm的當前工作目錄下,輸出為:
輸入貼吧名:python爬蟲(chóng)
輸入起始頁(yè):1
輸入終止頁(yè):2
第1頁(yè)抓取成功
第2頁(yè)抓取成功
執行時(shí)間:12.25
以面向對象的方式編寫(xiě)爬蟲(chóng)程序時(shí),思路簡(jiǎn)單,邏輯清晰,非常容易理解。上述代碼主要包括四個(gè)功能函數,分別負責不同的功能,總結如下:
1) 請求函數
request函數的最終結果是返回一個(gè)HTML對象,方便后續函數調用。
2) 分析函數
解析函數用于解析 HTML 頁(yè)面。常見(jiàn)的解析模塊有正則解析模塊和bs4解析模塊。通過(guò)分析頁(yè)面,提取出需要的數據,在后續內容中會(huì )詳細介紹。
3) 保存數據功能
該函數負責將采集到的數據保存到數據庫,如MySQL、MongoDB等,或者保存為文件格式,如csv、txt、excel等。
4) 入口函數
入口函數作為整個(gè)爬蟲(chóng)程序的橋梁,通過(guò)調用不同的函數函數實(shí)現最終的數據抓取。入口函數的主要任務(wù)是組織數據,比如要搜索的貼吧的名字,編碼url參數,拼接url地址,定義文件存儲路徑。
履帶結構
用面向對象的方式編寫(xiě)爬蟲(chóng)程序時(shí),邏輯結構是比較固定的,總結如下:
# 程序結構
class xxxSpider(object):
def __init__(self):
# 定義常用變量,比如url或計數變量等
def get_html(self):
# 獲取響應內容函數,使用隨機User-Agent
def parse_html(self):
# 使用正則表達式來(lái)解析頁(yè)面,提取數據
def write_html(self):
# 將提取的數據按要求保存,csv、MySQL數據庫等
def run(self):
# 主函數,用來(lái)控制整體邏輯
if __name__ == ‘__main__‘:
# 程序開(kāi)始運行時(shí)間
spider = xxxSpider()
spider.run()
注意:掌握以上編程邏輯將有助于您后續的學(xué)習。
爬蟲(chóng)隨機休眠
在入口函數代碼中,收錄以下代碼:
# 每爬取一個(gè)頁(yè)面隨機休眠1-2秒鐘的時(shí)間
time.sleep(random.randint(1,2))
爬蟲(chóng)訪(fǎng)問(wèn) 網(wǎng)站 會(huì )非???,這與正常的人類(lèi)點(diǎn)擊行為非常不符。因此,通過(guò)隨機休眠,爬蟲(chóng)可以模仿人類(lèi)點(diǎn)擊網(wǎng)站,使得網(wǎng)站不容易察覺(jué)是爬蟲(chóng)訪(fǎng)問(wèn)網(wǎng)站,但這樣做的代價(jià)是影響程序的執行效率。
焦點(diǎn)爬蟲(chóng)是一個(gè)執行效率低的程序,提高其性能是業(yè)界一直關(guān)注的問(wèn)題。于是,高效的 Python 爬蟲(chóng)框架 Scrapy 應運而生。
原版的:
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(【每日一題】抓取網(wǎng)頁(yè)數據(模擬訪(fǎng)問(wèn)))
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 99 次瀏覽 ? 2022-03-09 16:06
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(模擬訪(fǎng)問(wèn)),保存數據庫:oracle、mysql等:兩種方式,一種是批量重復查詢(xún),一種是join。
二、提取多份數據批量重復查詢(xún):1.先明確下choosewithundefined_scans的意思:choosewithundefined_scans包含兩個(gè)undefined_width參數,它表示當前網(wǎng)頁(yè)不存在的重復的頁(yè)數,每個(gè)頁(yè)面都會(huì )有十萬(wàn)個(gè)頁(yè)面。查詢(xún)的是總頁(yè)數。2.如果choosewithundefined_scans沒(méi)有參數,表示指定可以查詢(xún)的頁(yè)面數。
例如查詢(xún)的是總頁(yè)數。3.總頁(yè)數是203000+,那就說(shuō)明總共有9000萬(wàn)頁(yè)面4.準備數據:獲取總頁(yè)數數據庫createprogram"jdbcusernameclassprogram:cn-simple-username://admin";數據庫表格test_logimportorg.apache.hibernate.hibernate.connector.oracle.util.hibernateconnector23;引用的數據庫為mysql:jdbc[initialization=mysqlstandardmvcframework]{"name":"jdbc","username":"simplename","password":"jdbc://admin//","table":"com.xxx.xxx.account","type":"simple","auto_increment":10,"names":["account","account1","account2"]}5.業(yè)務(wù)邏輯:判斷總頁(yè)數量,當總頁(yè)數為203000+就停止并行傳輸,如果不為203000+就向上傳送,如果203000+就返回4007,但是實(shí)際true,說(shuō)明總頁(yè)數低于203000+則不存在,返回4008。
prepareview28second。javapublicclasspreparepoint28second{privatestaticfinalint[]hundred=1000000;privatestaticfinalint[]dayofweek=600000;privatestaticfinalint[]yearofweek=4000000;privatestaticfinalint[]username=null;privatestaticfinalint[]password=null;privatestaticfinalint[]table=null;privatestaticfinalbooleanredirectversion="001";privatestaticfinalvoidfieldschema_createparameter(voidschema(voidresourcea)newvoid(voidfield。
1));privatestaticfinalvoidschemaformat_schema(voidschema(voidfield
1)newvoid(voidfield
2));privatestaticfinalvoidschemaformat2(voidschema(voidfield
2)newvoid(voidfield
3));privatestaticfinalbooleanusername2011=false;privatestaticfinalvoidusername2012=false;privatestaticfinalvoidusername2013=false;privatestaticfinal 查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(【每日一題】抓取網(wǎng)頁(yè)數據(模擬訪(fǎng)問(wèn)))
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(模擬訪(fǎng)問(wèn)),保存數據庫:oracle、mysql等:兩種方式,一種是批量重復查詢(xún),一種是join。
二、提取多份數據批量重復查詢(xún):1.先明確下choosewithundefined_scans的意思:choosewithundefined_scans包含兩個(gè)undefined_width參數,它表示當前網(wǎng)頁(yè)不存在的重復的頁(yè)數,每個(gè)頁(yè)面都會(huì )有十萬(wàn)個(gè)頁(yè)面。查詢(xún)的是總頁(yè)數。2.如果choosewithundefined_scans沒(méi)有參數,表示指定可以查詢(xún)的頁(yè)面數。
例如查詢(xún)的是總頁(yè)數。3.總頁(yè)數是203000+,那就說(shuō)明總共有9000萬(wàn)頁(yè)面4.準備數據:獲取總頁(yè)數數據庫createprogram"jdbcusernameclassprogram:cn-simple-username://admin";數據庫表格test_logimportorg.apache.hibernate.hibernate.connector.oracle.util.hibernateconnector23;引用的數據庫為mysql:jdbc[initialization=mysqlstandardmvcframework]{"name":"jdbc","username":"simplename","password":"jdbc://admin//","table":"com.xxx.xxx.account","type":"simple","auto_increment":10,"names":["account","account1","account2"]}5.業(yè)務(wù)邏輯:判斷總頁(yè)數量,當總頁(yè)數為203000+就停止并行傳輸,如果不為203000+就向上傳送,如果203000+就返回4007,但是實(shí)際true,說(shuō)明總頁(yè)數低于203000+則不存在,返回4008。
prepareview28second。javapublicclasspreparepoint28second{privatestaticfinalint[]hundred=1000000;privatestaticfinalint[]dayofweek=600000;privatestaticfinalint[]yearofweek=4000000;privatestaticfinalint[]username=null;privatestaticfinalint[]password=null;privatestaticfinalint[]table=null;privatestaticfinalbooleanredirectversion="001";privatestaticfinalvoidfieldschema_createparameter(voidschema(voidresourcea)newvoid(voidfield。
1));privatestaticfinalvoidschemaformat_schema(voidschema(voidfield
1)newvoid(voidfield
2));privatestaticfinalvoidschemaformat2(voidschema(voidfield
2)newvoid(voidfield
3));privatestaticfinalbooleanusername2011=false;privatestaticfinalvoidusername2012=false;privatestaticfinalvoidusername2013=false;privatestaticfinal
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據( 兩個(gè)重要的包()預處理器定義(_szbuffer))
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 56 次瀏覽 ? 2022-03-09 01:15
兩個(gè)重要的包()預處理器定義(_szbuffer))
在windows下的C++通過(guò)Http協(xié)議實(shí)現對網(wǎng)頁(yè)的內容抓?。?br /> 首先介紹兩個(gè)重要的包(一般是linux下的開(kāi)源數據包,windows下的動(dòng)態(tài)鏈接庫dll):curl包和pthreads_dll,其中curl包被解釋為命令行瀏覽器,由調用curl_easy_setopt等內置函數可以實(shí)現對特定網(wǎng)頁(yè)內容的獲?。ㄒ_編譯導入的curl鏈接庫,需要另外一個(gè)包C-ares)。pthreads 是一個(gè)多線(xiàn)程控制包,其中包括互斥變量的鎖定和解鎖。程序進(jìn)程分配等功能。
下載地址:點(diǎn)擊打開(kāi)鏈接。其中,正確導入外部動(dòng)態(tài)鏈接庫需要步驟:1.Project->Properties->Configuration Properties->C/C++->General->Additional Include Directories(添加include的路徑),2.Project- >Properties->Configuration Properties->Linker->General->Additional Library Directory(添加lib收錄的路徑);3、在Linker->Input->Additional Dependencies(添加了libcurld.lib;pthreadVC2.lib;ws2_3 2.lib;winmm.lib;wldap32.lib;areslib.lib) 4 , 在 c/c++->預處理器->預處理器定義(_CONSOLE;BUILDING_LIBCURL;HTTP_ONLY)
具體實(shí)現過(guò)程介紹:
1:自定義hashTable結構,存放獲取到的字符串字符。以hashTable類(lèi)的形式實(shí)現,包括hash表集合類(lèi)型,以及add、find等幾個(gè)常用的字符串hash函數
代碼:
///HashTable.h
#ifndef HashTable_H
#define HashTable_H
#include
#include
#include
class HashTable
{
public:
HashTable(void);
~HashTable(void);
unsigned int ForceAdd(const std::string& str);
unsigned int Find(const std::string& str);
/*string的常見(jiàn)的hash方式*/
unsigned int RSHash(const std::string& str);
unsigned int JSHash (const std::string& str);
unsigned int PJWHash (const std::string& str);
unsigned int ELFHash (const std::string& str);
unsigned int BKDRHash(const std::string& str);
unsigned int SDBMHash(const std::string& str);
unsigned int DJBHash (const std::string& str);
unsigned int DEKHash (const std::string& str);
unsigned int BPHash (const std::string& str);
unsigned int FNVHash (const std::string& str);
unsigned int APHash (const std::string& str);
private:
std::set HashFunctionResultSet;
std::vector hhh;
};
#endif
/////HashTable.cpp
#include "HashTable.h"
HashTable::HashTable(void)
{
}
HashTable::~HashTable(void)
{
}
unsigned int HashTable::ForceAdd(const std::string& str)
{
unsigned int i=ELFHash(str);
HashFunctionResultSet.insert(i);
return i;
}
unsigned int HashTable::Find(const std::string& str)
{
int ff=hhh.size();
const unsigned int i=ELFHash(str);
std::set::const_iterator it;
if(HashFunctionResultSet.size()>0)
{
it=HashFunctionResultSet.find(i);
if(it==HashFunctionResultSet.end())
return -1;
}
else
{
return -1;
}
return i;
}
/*幾種常見(jiàn)的字符串hash方式實(shí)現函數*/
unsigned int HashTable::APHash(const std::string& str)
{
unsigned int hash=0xAAAAAAAA;
for(std::size_t i=0;i 3)) :
(~((hash > 5)));
}
return hash;
}
unsigned int HashTable::BKDRHash(const std::string& str)
{
unsigned int seed=131; //31 131 1313 13131 131313 etc
unsigned int hash=0;
for(std::size_t i=0;isetBuffer((char*)buffer,size,nmemb);
}
bool Http::InitCurl(const std::string& url, std::string& szbuffer)
{
pthread_mutex_init(&m_http_mutex,NULL);
Http::m_szUrl=url;
CURLcode result;
if(m_pcurl)
{
curl_easy_setopt(m_pcurl, CURLOPT_ERRORBUFFER, Http::m_errorBuffer);
curl_easy_setopt(m_pcurl, CURLOPT_URL,m_szUrl.c_str());
curl_easy_setopt(m_pcurl, CURLOPT_HEADER, 0);
curl_easy_setopt(m_pcurl, CURLOPT_FOLLOWLOCATION, 1);
curl_easy_setopt(m_pcurl, CURLOPT_WRITEFUNCTION,Http::writer);
curl_easy_setopt(m_pcurl, CURLOPT_WRITEDATA,this);
result = curl_easy_perform(m_pcurl);
}
if(result!=CURLE_OK)
return false;
szbuffer=m_szbuffer;
m_szbuffer.clear();
m_szUrl.clear();
pthread_mutex_destroy(&m_http_mutex);
return true;
}
bool Http::DeInitCurl()
{
curl_easy_cleanup(m_pcurl);
curl_global_cleanup();
m_pcurl = NULL;
return true;
}
const string Http::getBuffer()
{
return m_szbuffer;
}
string Http::setUrl()
{
return Http::m_szUrl;
}
void Http::setUrl(const std::string& url)
{
Http::m_szUrl = url;
}
其中,m_szbuffer存放的是網(wǎng)頁(yè)的內容。初始網(wǎng)頁(yè)的內容存儲在 Init 函數的形參中。 查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(
兩個(gè)重要的包()預處理器定義(_szbuffer))
在windows下的C++通過(guò)Http協(xié)議實(shí)現對網(wǎng)頁(yè)的內容抓?。?br /> 首先介紹兩個(gè)重要的包(一般是linux下的開(kāi)源數據包,windows下的動(dòng)態(tài)鏈接庫dll):curl包和pthreads_dll,其中curl包被解釋為命令行瀏覽器,由調用curl_easy_setopt等內置函數可以實(shí)現對特定網(wǎng)頁(yè)內容的獲?。ㄒ_編譯導入的curl鏈接庫,需要另外一個(gè)包C-ares)。pthreads 是一個(gè)多線(xiàn)程控制包,其中包括互斥變量的鎖定和解鎖。程序進(jìn)程分配等功能。
下載地址:點(diǎn)擊打開(kāi)鏈接。其中,正確導入外部動(dòng)態(tài)鏈接庫需要步驟:1.Project->Properties->Configuration Properties->C/C++->General->Additional Include Directories(添加include的路徑),2.Project- >Properties->Configuration Properties->Linker->General->Additional Library Directory(添加lib收錄的路徑);3、在Linker->Input->Additional Dependencies(添加了libcurld.lib;pthreadVC2.lib;ws2_3 2.lib;winmm.lib;wldap32.lib;areslib.lib) 4 , 在 c/c++->預處理器->預處理器定義(_CONSOLE;BUILDING_LIBCURL;HTTP_ONLY)
具體實(shí)現過(guò)程介紹:
1:自定義hashTable結構,存放獲取到的字符串字符。以hashTable類(lèi)的形式實(shí)現,包括hash表集合類(lèi)型,以及add、find等幾個(gè)常用的字符串hash函數
代碼:
///HashTable.h
#ifndef HashTable_H
#define HashTable_H
#include
#include
#include
class HashTable
{
public:
HashTable(void);
~HashTable(void);
unsigned int ForceAdd(const std::string& str);
unsigned int Find(const std::string& str);
/*string的常見(jiàn)的hash方式*/
unsigned int RSHash(const std::string& str);
unsigned int JSHash (const std::string& str);
unsigned int PJWHash (const std::string& str);
unsigned int ELFHash (const std::string& str);
unsigned int BKDRHash(const std::string& str);
unsigned int SDBMHash(const std::string& str);
unsigned int DJBHash (const std::string& str);
unsigned int DEKHash (const std::string& str);
unsigned int BPHash (const std::string& str);
unsigned int FNVHash (const std::string& str);
unsigned int APHash (const std::string& str);
private:
std::set HashFunctionResultSet;
std::vector hhh;
};
#endif
/////HashTable.cpp
#include "HashTable.h"
HashTable::HashTable(void)
{
}
HashTable::~HashTable(void)
{
}
unsigned int HashTable::ForceAdd(const std::string& str)
{
unsigned int i=ELFHash(str);
HashFunctionResultSet.insert(i);
return i;
}
unsigned int HashTable::Find(const std::string& str)
{
int ff=hhh.size();
const unsigned int i=ELFHash(str);
std::set::const_iterator it;
if(HashFunctionResultSet.size()>0)
{
it=HashFunctionResultSet.find(i);
if(it==HashFunctionResultSet.end())
return -1;
}
else
{
return -1;
}
return i;
}
/*幾種常見(jiàn)的字符串hash方式實(shí)現函數*/
unsigned int HashTable::APHash(const std::string& str)
{
unsigned int hash=0xAAAAAAAA;
for(std::size_t i=0;i 3)) :
(~((hash > 5)));
}
return hash;
}
unsigned int HashTable::BKDRHash(const std::string& str)
{
unsigned int seed=131; //31 131 1313 13131 131313 etc
unsigned int hash=0;
for(std::size_t i=0;isetBuffer((char*)buffer,size,nmemb);
}
bool Http::InitCurl(const std::string& url, std::string& szbuffer)
{
pthread_mutex_init(&m_http_mutex,NULL);
Http::m_szUrl=url;
CURLcode result;
if(m_pcurl)
{
curl_easy_setopt(m_pcurl, CURLOPT_ERRORBUFFER, Http::m_errorBuffer);
curl_easy_setopt(m_pcurl, CURLOPT_URL,m_szUrl.c_str());
curl_easy_setopt(m_pcurl, CURLOPT_HEADER, 0);
curl_easy_setopt(m_pcurl, CURLOPT_FOLLOWLOCATION, 1);
curl_easy_setopt(m_pcurl, CURLOPT_WRITEFUNCTION,Http::writer);
curl_easy_setopt(m_pcurl, CURLOPT_WRITEDATA,this);
result = curl_easy_perform(m_pcurl);
}
if(result!=CURLE_OK)
return false;
szbuffer=m_szbuffer;
m_szbuffer.clear();
m_szUrl.clear();
pthread_mutex_destroy(&m_http_mutex);
return true;
}
bool Http::DeInitCurl()
{
curl_easy_cleanup(m_pcurl);
curl_global_cleanup();
m_pcurl = NULL;
return true;
}
const string Http::getBuffer()
{
return m_szbuffer;
}
string Http::setUrl()
{
return Http::m_szUrl;
}
void Http::setUrl(const std::string& url)
{
Http::m_szUrl = url;
}
其中,m_szbuffer存放的是網(wǎng)頁(yè)的內容。初始網(wǎng)頁(yè)的內容存儲在 Init 函數的形參中。
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據( 網(wǎng)絡(luò )爬蟲(chóng)框架圖框架)
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 75 次瀏覽 ? 2022-03-09 01:14
網(wǎng)絡(luò )爬蟲(chóng)框架圖框架)
搜索引擎網(wǎng)絡(luò )爬蟲(chóng)如何高效地將互聯(lián)網(wǎng)上萬(wàn)億網(wǎng)頁(yè)爬取到本地鏡像?
一、爬蟲(chóng)框架
上圖是一個(gè)簡(jiǎn)單的網(wǎng)絡(luò )爬蟲(chóng)框架圖。從種子網(wǎng)址入手,如圖,一步步工作后,將網(wǎng)頁(yè)存入數據庫。當然,勤勞的蜘蛛可能還需要做更多的工作,比如網(wǎng)頁(yè)的去重和網(wǎng)頁(yè)的反作弊。
或許,我們可以將網(wǎng)頁(yè)視為蜘蛛的晚餐,其中包括:
下載的網(wǎng)頁(yè)。被蜘蛛爬過(guò)的網(wǎng)頁(yè)內容被放到了肚子里。
過(guò)期網(wǎng)頁(yè)。蜘蛛每次都要爬很多網(wǎng)頁(yè),有的已經(jīng)在肚子里壞掉了。
要下載的頁(yè)面。當它看到食物時(shí),蜘蛛就會(huì )去抓它。
知名網(wǎng)站。它還沒(méi)有被下載和發(fā)現,但是蜘蛛可以感知它們并且遲早會(huì )抓住它。
不可知的網(wǎng)頁(yè)?;ヂ?lián)網(wǎng)太大了,很多頁(yè)面蜘蛛都找不到,而且可能永遠也找不到。這部分占比很高。
通過(guò)以上劃分,我們可以清楚地了解搜索引擎蜘蛛的工作以及它們面臨的挑戰。大多數蜘蛛都是按照這個(gè)框架爬行的。但這并不完全確定。一切總是特別的。根據不同的功能,蜘蛛系統有一些差異。
二、爬蟲(chóng)種類(lèi)
1.批量式蜘蛛。
這種蜘蛛有明確的抓取范圍和目標,當蜘蛛完成目標和任務(wù)時(shí)停止抓取。具體目標是什么?它可能是抓取的頁(yè)面數、頁(yè)面大小、抓取時(shí)間等。
2.增量蜘蛛
這種蜘蛛不同于批處理型蜘蛛,它們會(huì )不斷地爬取,并且會(huì )定期對爬取的網(wǎng)頁(yè)進(jìn)行爬取和更新。由于 Internet 上的網(wǎng)頁(yè)在不斷更新,增量爬蟲(chóng)需要能夠反映這種更新。
3.垂直蜘蛛
此類(lèi)蜘蛛僅關(guān)注特定主題或特定行業(yè)頁(yè)面。以health網(wǎng)站為例,這種專(zhuān)門(mén)的爬蟲(chóng)只會(huì )爬取健康相關(guān)的話(huà)題,其他話(huà)題的頁(yè)面不會(huì )被爬取。測試這個(gè)蜘蛛的難點(diǎn)在于如何更準確地識別內容所屬的行業(yè)。目前很多垂直行業(yè)網(wǎng)站都需要這種蜘蛛去搶。
三、搶奪策略
爬蟲(chóng)通過(guò)種子URL進(jìn)行爬取和擴展,列出大量待爬取的URL。但是,要抓取的 URL 數量巨大。蜘蛛如何確定爬行的順序?爬蟲(chóng)的策略有很多,但最終的目標是先爬取重要的網(wǎng)頁(yè)。評價(jià)頁(yè)面是否重要,蜘蛛會(huì )根據頁(yè)面內容的程度原創(chuàng )、鏈接權重分析等多種方法進(jìn)行計算。比較有代表性的爬取策略如下:
1. 廣度優(yōu)先策略
寬度優(yōu)先是指蜘蛛爬取一個(gè)網(wǎng)頁(yè)后,會(huì )繼續按順序爬取該網(wǎng)頁(yè)中收錄的其他頁(yè)面。這個(gè)想法看似簡(jiǎn)單,但實(shí)際上非常實(shí)用。因為大部分網(wǎng)頁(yè)都是有優(yōu)先級的,所以在頁(yè)面上優(yōu)先推薦重要的頁(yè)面。
2. PageRank 策略
PageRank是一種非常有名的鏈接分析方法,主要用來(lái)衡量網(wǎng)頁(yè)的權威性。例如,Google 的 PR 就是典型的 PageRank 算法。通過(guò)PageRank算法我們可以找出哪些頁(yè)面更重要,然后蜘蛛會(huì )優(yōu)先抓取這些重要的頁(yè)面。
3.大網(wǎng)站優(yōu)先策略
這個(gè)很容易理解,大網(wǎng)站通常內容頁(yè)比較多,質(zhì)量也會(huì )比較高。蜘蛛會(huì )首先分析網(wǎng)站分類(lèi)和屬性。如果這個(gè)網(wǎng)站已經(jīng)是收錄很多,或者在搜索引擎系統中的權重很高,則優(yōu)先考慮收錄。
4.網(wǎng)頁(yè)更新
互聯(lián)網(wǎng)上的大部分頁(yè)面都會(huì )更新,所以蜘蛛存儲的頁(yè)面需要及時(shí)更新以保持一致性。打個(gè)比方:一個(gè)頁(yè)面之前排名很好,如果頁(yè)面被刪除了但仍然排名,那么體驗很差。因此,搜索引擎需要知道這些并隨時(shí)更新頁(yè)面,并將新的頁(yè)面提供給用戶(hù)。常用的網(wǎng)頁(yè)更新策略有三種:歷史參考策略和用戶(hù)體驗策略。整群抽樣策略。
1. 歷史參考策略
這是基于假設的更新策略。例如,如果你的網(wǎng)頁(yè)以前經(jīng)常更新,那么搜索引擎也認為你的網(wǎng)頁(yè)以后會(huì )經(jīng)常更新,蜘蛛也會(huì )根據這個(gè)規則定期網(wǎng)站對網(wǎng)頁(yè)進(jìn)行爬取。這也是為什么點(diǎn)水一直強調網(wǎng)站內容需要定期更新的原因。
2. 用戶(hù)體驗策略
一般來(lái)說(shuō),用戶(hù)只查看搜索結果前三頁(yè)的內容,很少有人看到后面的頁(yè)面。用戶(hù)體驗策略是搜索引擎根據用戶(hù)的這一特征進(jìn)行更新。例如,一個(gè)網(wǎng)頁(yè)可能發(fā)布得較早,并且有一段時(shí)間沒(méi)有更新,但用戶(hù)仍然覺(jué)得它有用并點(diǎn)擊瀏覽,那么搜索引擎可能不會(huì )首先更新這些過(guò)時(shí)的網(wǎng)頁(yè)。這就是為什么新頁(yè)面不一定在搜索結果中排名靠前的原因。排名更多地取決于頁(yè)面的質(zhì)量,而不是更新的時(shí)間。
3.整群抽樣策略
以上兩種更新策略主要參考網(wǎng)頁(yè)的歷史信息。然而,存儲大量歷史信息對于搜索引擎來(lái)說(shuō)是一種負擔。另外,如果收錄是一個(gè)新的網(wǎng)頁(yè),沒(méi)有歷史信息可以參考,怎么辦?聚類(lèi)抽樣策略是指:拿出一些屬性對很多相似的網(wǎng)頁(yè)進(jìn)行分類(lèi),分類(lèi)后的頁(yè)面按照相同的規則進(jìn)行更新。
從了解搜索引擎蜘蛛工作原理的過(guò)程中,我們會(huì )知道:網(wǎng)站內容的相關(guān)性、網(wǎng)站與網(wǎng)頁(yè)內容的更新規律、網(wǎng)頁(yè)鏈接的分布和權重網(wǎng)站 等因素會(huì )影響蜘蛛的爬取效率。知己知彼,讓蜘蛛來(lái)得更猛烈!
更多北碚商城產(chǎn)品介紹:撫順電梯轎廂廣告 查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(
網(wǎng)絡(luò )爬蟲(chóng)框架圖框架)
搜索引擎網(wǎng)絡(luò )爬蟲(chóng)如何高效地將互聯(lián)網(wǎng)上萬(wàn)億網(wǎng)頁(yè)爬取到本地鏡像?
一、爬蟲(chóng)框架

上圖是一個(gè)簡(jiǎn)單的網(wǎng)絡(luò )爬蟲(chóng)框架圖。從種子網(wǎng)址入手,如圖,一步步工作后,將網(wǎng)頁(yè)存入數據庫。當然,勤勞的蜘蛛可能還需要做更多的工作,比如網(wǎng)頁(yè)的去重和網(wǎng)頁(yè)的反作弊。
或許,我們可以將網(wǎng)頁(yè)視為蜘蛛的晚餐,其中包括:
下載的網(wǎng)頁(yè)。被蜘蛛爬過(guò)的網(wǎng)頁(yè)內容被放到了肚子里。
過(guò)期網(wǎng)頁(yè)。蜘蛛每次都要爬很多網(wǎng)頁(yè),有的已經(jīng)在肚子里壞掉了。
要下載的頁(yè)面。當它看到食物時(shí),蜘蛛就會(huì )去抓它。
知名網(wǎng)站。它還沒(méi)有被下載和發(fā)現,但是蜘蛛可以感知它們并且遲早會(huì )抓住它。
不可知的網(wǎng)頁(yè)?;ヂ?lián)網(wǎng)太大了,很多頁(yè)面蜘蛛都找不到,而且可能永遠也找不到。這部分占比很高。
通過(guò)以上劃分,我們可以清楚地了解搜索引擎蜘蛛的工作以及它們面臨的挑戰。大多數蜘蛛都是按照這個(gè)框架爬行的。但這并不完全確定。一切總是特別的。根據不同的功能,蜘蛛系統有一些差異。
二、爬蟲(chóng)種類(lèi)
1.批量式蜘蛛。
這種蜘蛛有明確的抓取范圍和目標,當蜘蛛完成目標和任務(wù)時(shí)停止抓取。具體目標是什么?它可能是抓取的頁(yè)面數、頁(yè)面大小、抓取時(shí)間等。
2.增量蜘蛛
這種蜘蛛不同于批處理型蜘蛛,它們會(huì )不斷地爬取,并且會(huì )定期對爬取的網(wǎng)頁(yè)進(jìn)行爬取和更新。由于 Internet 上的網(wǎng)頁(yè)在不斷更新,增量爬蟲(chóng)需要能夠反映這種更新。
3.垂直蜘蛛
此類(lèi)蜘蛛僅關(guān)注特定主題或特定行業(yè)頁(yè)面。以health網(wǎng)站為例,這種專(zhuān)門(mén)的爬蟲(chóng)只會(huì )爬取健康相關(guān)的話(huà)題,其他話(huà)題的頁(yè)面不會(huì )被爬取。測試這個(gè)蜘蛛的難點(diǎn)在于如何更準確地識別內容所屬的行業(yè)。目前很多垂直行業(yè)網(wǎng)站都需要這種蜘蛛去搶。
三、搶奪策略
爬蟲(chóng)通過(guò)種子URL進(jìn)行爬取和擴展,列出大量待爬取的URL。但是,要抓取的 URL 數量巨大。蜘蛛如何確定爬行的順序?爬蟲(chóng)的策略有很多,但最終的目標是先爬取重要的網(wǎng)頁(yè)。評價(jià)頁(yè)面是否重要,蜘蛛會(huì )根據頁(yè)面內容的程度原創(chuàng )、鏈接權重分析等多種方法進(jìn)行計算。比較有代表性的爬取策略如下:
1. 廣度優(yōu)先策略

寬度優(yōu)先是指蜘蛛爬取一個(gè)網(wǎng)頁(yè)后,會(huì )繼續按順序爬取該網(wǎng)頁(yè)中收錄的其他頁(yè)面。這個(gè)想法看似簡(jiǎn)單,但實(shí)際上非常實(shí)用。因為大部分網(wǎng)頁(yè)都是有優(yōu)先級的,所以在頁(yè)面上優(yōu)先推薦重要的頁(yè)面。
2. PageRank 策略
PageRank是一種非常有名的鏈接分析方法,主要用來(lái)衡量網(wǎng)頁(yè)的權威性。例如,Google 的 PR 就是典型的 PageRank 算法。通過(guò)PageRank算法我們可以找出哪些頁(yè)面更重要,然后蜘蛛會(huì )優(yōu)先抓取這些重要的頁(yè)面。
3.大網(wǎng)站優(yōu)先策略
這個(gè)很容易理解,大網(wǎng)站通常內容頁(yè)比較多,質(zhì)量也會(huì )比較高。蜘蛛會(huì )首先分析網(wǎng)站分類(lèi)和屬性。如果這個(gè)網(wǎng)站已經(jīng)是收錄很多,或者在搜索引擎系統中的權重很高,則優(yōu)先考慮收錄。
4.網(wǎng)頁(yè)更新
互聯(lián)網(wǎng)上的大部分頁(yè)面都會(huì )更新,所以蜘蛛存儲的頁(yè)面需要及時(shí)更新以保持一致性。打個(gè)比方:一個(gè)頁(yè)面之前排名很好,如果頁(yè)面被刪除了但仍然排名,那么體驗很差。因此,搜索引擎需要知道這些并隨時(shí)更新頁(yè)面,并將新的頁(yè)面提供給用戶(hù)。常用的網(wǎng)頁(yè)更新策略有三種:歷史參考策略和用戶(hù)體驗策略。整群抽樣策略。
1. 歷史參考策略
這是基于假設的更新策略。例如,如果你的網(wǎng)頁(yè)以前經(jīng)常更新,那么搜索引擎也認為你的網(wǎng)頁(yè)以后會(huì )經(jīng)常更新,蜘蛛也會(huì )根據這個(gè)規則定期網(wǎng)站對網(wǎng)頁(yè)進(jìn)行爬取。這也是為什么點(diǎn)水一直強調網(wǎng)站內容需要定期更新的原因。
2. 用戶(hù)體驗策略
一般來(lái)說(shuō),用戶(hù)只查看搜索結果前三頁(yè)的內容,很少有人看到后面的頁(yè)面。用戶(hù)體驗策略是搜索引擎根據用戶(hù)的這一特征進(jìn)行更新。例如,一個(gè)網(wǎng)頁(yè)可能發(fā)布得較早,并且有一段時(shí)間沒(méi)有更新,但用戶(hù)仍然覺(jué)得它有用并點(diǎn)擊瀏覽,那么搜索引擎可能不會(huì )首先更新這些過(guò)時(shí)的網(wǎng)頁(yè)。這就是為什么新頁(yè)面不一定在搜索結果中排名靠前的原因。排名更多地取決于頁(yè)面的質(zhì)量,而不是更新的時(shí)間。
3.整群抽樣策略
以上兩種更新策略主要參考網(wǎng)頁(yè)的歷史信息。然而,存儲大量歷史信息對于搜索引擎來(lái)說(shuō)是一種負擔。另外,如果收錄是一個(gè)新的網(wǎng)頁(yè),沒(méi)有歷史信息可以參考,怎么辦?聚類(lèi)抽樣策略是指:拿出一些屬性對很多相似的網(wǎng)頁(yè)進(jìn)行分類(lèi),分類(lèi)后的頁(yè)面按照相同的規則進(jìn)行更新。
從了解搜索引擎蜘蛛工作原理的過(guò)程中,我們會(huì )知道:網(wǎng)站內容的相關(guān)性、網(wǎng)站與網(wǎng)頁(yè)內容的更新規律、網(wǎng)頁(yè)鏈接的分布和權重網(wǎng)站 等因素會(huì )影響蜘蛛的爬取效率。知己知彼,讓蜘蛛來(lái)得更猛烈!
更多北碚商城產(chǎn)品介紹:撫順電梯轎廂廣告
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據( Scraoy入門(mén)實(shí)例一—Scrapy介紹與安裝ampamp的安裝)
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 91 次瀏覽 ? 2022-03-09 01:12
Scraoy入門(mén)實(shí)例一—Scrapy介紹與安裝ampamp的安裝)
Scraoy入門(mén)示例1-Scrapy介紹與安裝&PyCharm安裝&項目實(shí)戰
一、Scrapy 的安裝
1.Scrapy介紹
Scrapy 是一個(gè)應用程序框架,用于抓取 網(wǎng)站 數據并提取結構化數據。它可以用于一系列程序,包括數據挖掘、信息處理或存儲歷史數據。它最初是為網(wǎng)頁(yè)抓?。ǜ鼫蚀_地說(shuō),網(wǎng)頁(yè)抓?。┒O計的,但也可用于獲取 API(例如 Amazon Associates Web 服務(wù))或通用網(wǎng)絡(luò )爬蟲(chóng)返回的數據。
2.Scrapy 安裝
建議使用 Anaconda 安裝 Scrapy
Anaconda 是一個(gè)開(kāi)源包和環(huán)境管理神器。Anaconda 包括 180 多個(gè)科學(xué)包及其依賴(lài)項,包括 conda 和 Python。從官網(wǎng)下載安裝Anaconda(個(gè)人版),根據自己的系統選擇下載,安裝,選擇next繼續安裝,Install for選項選擇Just for me,選擇安裝位置,等待安裝完成。
安裝完成后,打開(kāi)命令行,輸入conda install scrapy,根據提示按Y,即可下載所有Scrapy及其依賴(lài)包,從而完成安裝。
注意:使用命令行安裝scrapy包時(shí),會(huì )出現下載超時(shí)問(wèn)題,即下載失敗。我們可以通過(guò)修改scrapy包的鏡像文件來(lái)提高scrapy包的下載速度。你可以參考博客:
這時(shí)候測試Scrapy是否安裝成功:在命令行窗口輸入scrapy,回車(chē)。如果出現如下界面,則表示安裝成功:
二、安裝 PyCharm
1.PyCharm介紹
PyCharm 是一個(gè) Python IDE,擁有一套完整的工具,可以幫助用戶(hù)在使用 Python 語(yǔ)言進(jìn)行開(kāi)發(fā)時(shí)提高效率,例如調試、語(yǔ)法高亮、項目管理、代碼跳轉、智能提示、自動(dòng)完成、單元測試和版本控制。此外,IDE 還提供高級功能以支持 Django 框架下的專(zhuān)業(yè) Web 開(kāi)發(fā)。
2.PyCharm 安裝
進(jìn)入PyCharm官網(wǎng),直接點(diǎn)擊DownLoad下載,左邊是專(zhuān)業(yè)版,右邊是社區版,社區版免費,專(zhuān)業(yè)版免費試用。
如果我們之前沒(méi)有下載過(guò)Python解釋器,可以在等待安裝的同時(shí)下載Python解釋器,進(jìn)入Python官網(wǎng),根據系統和版本下載對應的壓縮包。安裝完成后,在環(huán)境變量 Path 中配置 Python 解釋器的安裝路徑。你可以參考博客:
三、Scrapy 抓豆瓣項目在行動(dòng)
前提條件:如果要在 PyCharm 中使用 Scrapy,首先必須在 PyCharm 中安裝支持的 Scrapy 包。流程如下,點(diǎn)擊文件>>設置... 兩個(gè)包,如果點(diǎn)擊的時(shí)候看到一個(gè)Scrapy包,那么就不需要安裝了,繼續下一步。
如果沒(méi)有Scrapy包,點(diǎn)擊“+”,搜索Scrapy包,點(diǎn)擊Install Package進(jìn)行安裝
等待安裝完成。
1.新項目
打開(kāi)新安裝的PyCharm,使用軟件終端中的pycharm工具,如果找不到PyCharm終端在哪里,就是左下角的Terminal。
輸入命令:scrapy startproject douban 這是使用命令行新建爬蟲(chóng)項目,如下圖,圖中項目名稱(chēng)為pythonProject
然后在命令行輸入命令:cd douban進(jìn)入生成項目的根目錄
然后在終端繼續輸入命令:scrapy genspider douban_spider 生成douban_spider爬蟲(chóng)文件。
此時(shí)的項目結構如下圖所示:
2.明確目標
我們要練習的 網(wǎng)站 是:
假設,我們獲取 top250 電影的序列號、電影名稱(chēng)、介紹、星級、評論數、電影描述選項
至此,我們在 items.py 文件中定義抓取的數據項,代碼如下:
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/lat ... .html
import scrapy
class DoubanItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
# 序列號
serial_number = scrapy.Field();
# 電影名
movie_name = scrapy.Field();
# 介紹
introduce = scrapy.Field();
# 星級
star = scrapy.Field();
# 評價(jià)數
evaluate = scrapy.Field();
# 描述
describe = scrapy.Field();
pass
3.接下來(lái),我們需要創(chuàng )建爬蟲(chóng)并存儲爬取的內容
在douban_spider.py爬蟲(chóng)文件中編寫(xiě)具體的邏輯代碼,如下:
# -*- coding: utf-8 -*-
import scrapy
from ..items import DoubanItem
class DoubanSpiderSpider(scrapy.Spider):
name = "douban_spider"
# 允許的域名
allowed_domains = ["movie.douban.com"]
# 入口URL
start_urls = ["https://movie.douban.com/top250"]
def parse(self, response):
movie_list = response.xpath("//div[@class="article"]//ol[@class="grid_view"]/li")
#循環(huán)電影的條目
for i_item in movie_list:
#導入item,進(jìn)行數據解析
douban_item = DoubanItem()
douban_item["serial_number"] = i_item.xpath(".//div[@class="item"]//em/text()").extract_first()
douban_item["movie_name"] = i_item.xpath(".//div[@class="info"]//div[@class="hd"]/a/span[1]/text()").extract_first()
#如果文件有多行進(jìn)行解析
content = i_item.xpath(".//div[@class="info"]//div[@class="bd"]/p[1]/text()").extract()
for i_content in content:
content_s ="".join( i_content.split())
douban_item["introduce"] = content_s
douban_item["star"] = i_item.xpath(".//span[@class="rating_num"]/text()").extract_first()
douban_item["evaluate"] = i_item.xpath(".//div[@class="star"]//span[4]/text()").extract_first()
douban_item["describe"] = i_item.xpath(".//p[@class="quote"]/span/text()").extract_first()
print(douban_item)
yield douban_item
#解析下一頁(yè),取后一頁(yè)的XPATH
next_link = response.xpath("//span[@class="next"]/link/@href").extract()
if next_link:
next_link = next_link[0]
yield scrapy.Request("https://movie.douban.com/top250"+next_link,callback=self.parse)
這個(gè)時(shí)候不需要運行這個(gè)python文件,因為我們不單獨使用,所以不需要運行,允許報錯。import引入的問(wèn)題,主目錄的絕對路徑和相對路徑,原因是我們使用的是相對路徑“..items”,對相關(guān)內容感興趣的同學(xué)可以去網(wǎng)上找一下此類(lèi)問(wèn)題的解釋.
4.存儲內容
將爬取的內容存儲為 json 或 csv 格式的文件
在命令行輸入:scrapy crawl douban_spider -o test.json 或者 scrapy crawl douban_spider -o test.csv
將爬取的數據存儲在 json 文件或 csv 文件中。
執行爬取命令后,當鼠標聚焦到項目面板時(shí),會(huì )顯示生成的 json 文件或 csv 文件。打開(kāi)json或者csv文件后,如果里面什么都沒(méi)有,那么我們需要做進(jìn)一步的修改,修改代理USER_AGENT的內容,
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.8 Safari/537.36"
如果存儲在json文件中,所有內容都會(huì )以十六進(jìn)制形式顯示,可以通過(guò)相應的方法進(jìn)行轉碼。這里就不多解釋了,如下圖所示:
并且存儲在csv文件中,它會(huì )直接顯示我們要爬取的所有內容,如下圖:
至此,我們就完成了網(wǎng)站具體內容的爬取。接下來(lái),我們需要對爬取的數據進(jìn)行處理。
分界線(xiàn) —————————————————————————————————————————————- 分界線(xiàn)
Scraoy 入門(mén)示例 2 - 使用管道實(shí)現
在本次實(shí)戰中,需要重新創(chuàng )建項目或者安裝scrapy包。參考上面的內容,新建項目的方法也參考上面的內容,這里不再贅述。
項目目錄結構如下圖所示:
一、流水線(xiàn)介紹
當我們通過(guò)Spider爬取數據,通過(guò)Item采集數據時(shí),我們需要對數據做一些處理,因為我們爬取的數據不一定是我們想要的最終數據,可能還需要對數據進(jìn)行清洗和驗證。數據有效性。Scripy 中的 Pipeline 組件用于數據處理。Pipeline 組件是一個(gè)收錄特定接口的類(lèi)。它通常只負責一項功能的數據處理。在一個(gè)項目中可以同時(shí)啟用多個(gè)管道。
二、在items.py中定義你要抓取的數據
首先打開(kāi)一個(gè)新的pycharm項目,通過(guò)終端新建一個(gè)項目教程,在item中定義你要抓取的數據,比如電影名,代碼如下:
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/lat ... .html
import scrapy
class TutorialItem(scrapy.Item):
# define the fields for your item here like:
name = scrapy.Field()
pass
class DoubanmovieItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
moiveName = scrapy.Field()
三、定義 pipeline.py 文件
每個(gè) item 管道組件都是一個(gè)獨立的 pyhton 類(lèi),必須實(shí)現 process_item(self, item, spider) 方法。每個(gè)item管道組件都需要調用這個(gè)方法。該方法必須返回一個(gè)帶有數據的dict,或者一個(gè)item對象,或者拋出一個(gè)DropItem異常,并且被丟棄的item不會(huì )被后續管道組件處理。定義的 pipelines.py 代碼如下所示:
# Define your item pipelines here
#
# Don"t forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/lat ... .html
# useful for handling different item types with a single interface
from itemadapter import ItemAdapter
class TutorialPipeline(object):
def process_item(self, item, spider):
return item
import time
class DoubanmoviePipeline(object):
def process_item(self, item, spider):
now = time.strftime("%Y-%m-%d", time.localtime())
fileName = "douban" + now + ".txt"
with open(fileName, "a", encoding="utf-8") as fp:
fp.write(item["moiveName"][0]+"")
return item
四、配置設置.py
由于這次使用的是管道,所以我們需要在settings.py中打開(kāi)管道通道注釋?zhuān)⒃谄渲刑砑右粭l新記錄,如下圖所示:
五、寫(xiě)爬蟲(chóng)文件
在tutorial/spiders目錄下創(chuàng )建quotes_spider.py文件,目錄結構如下,編寫(xiě)初步代碼:
quote_spider.py 代碼如下:
import scrapy
from items import DoubanmovieItem
class QuotesSpider(scrapy.Spider):
name = "doubanSpider"
allowed_domains = ["douban.com"]
start_urls = ["http://movie.douban.com/cinema/nowplaying",
"http://movie.douban.com/cinema ... ot%3B]
def parse(self, response):
print("--" * 20 )
#print(response.body)
print("==" * 20 )
subSelector = response.xpath("//li[@class="stitle"]")
items = []
for sub in subSelector:
#print(sub.xpath("normalize-space(./a/text())").extract())
print(sub)
item = DoubanmovieItem()
item["moiveName"] = sub.xpath("normalize-space(./a/text())").extract()
items.append(item)
print(items)
return items
六、從啟動(dòng)文件運行
在豆瓣文件目錄下新建啟動(dòng)文件douban_spider_run.py(文件名可取不同),運行文件查看結果。編寫(xiě)代碼如下:
from scrapy import cmdline
cmdline.execute("scrapy crawl doubanSpider".split())
最后,處理后的爬取數據如下圖(部分)所示:
最后,希望大家在寫(xiě)代碼的時(shí)候可以小心,不要馬虎。實(shí)驗的時(shí)候寫(xiě)了方法DoubanmovieItem作為DobanmovieItem引入,導致整個(gè)程序失敗,而且PyCharm也沒(méi)有告訴我哪里錯了,我到處找問(wèn)題的解決方法也沒(méi)找到。最后查了很多遍,都是在生成方法的時(shí)候才發(fā)現的,所以一定要小心。該錯誤如下圖所示。提示找不到DobanmovieItem模塊。它可能告訴我錯誤的地方。因為懶得找,找了很久。希望大家多多注意!
至此,使用Scrapy抓取網(wǎng)頁(yè)內容,并對抓取到的內容進(jìn)行清理和處理的實(shí)驗已經(jīng)完成。要求熟悉并使用此過(guò)程中的代碼和操作,不要在網(wǎng)上搜索和消化。吸收它并記住它,這是學(xué)習知識的真正方法,而不僅僅是畫(huà)一個(gè)勺子。
本文地址:H5W3 ? python爬蟲(chóng)示例:使用Scrapy爬取網(wǎng)頁(yè)采集數據 查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(
Scraoy入門(mén)實(shí)例一—Scrapy介紹與安裝ampamp的安裝)
https://www.h5w3.com/wp-conten ... 3.jpg 150w" />Scraoy入門(mén)示例1-Scrapy介紹與安裝&PyCharm安裝&項目實(shí)戰
一、Scrapy 的安裝
1.Scrapy介紹
Scrapy 是一個(gè)應用程序框架,用于抓取 網(wǎng)站 數據并提取結構化數據。它可以用于一系列程序,包括數據挖掘、信息處理或存儲歷史數據。它最初是為網(wǎng)頁(yè)抓?。ǜ鼫蚀_地說(shuō),網(wǎng)頁(yè)抓?。┒O計的,但也可用于獲取 API(例如 Amazon Associates Web 服務(wù))或通用網(wǎng)絡(luò )爬蟲(chóng)返回的數據。
2.Scrapy 安裝
建議使用 Anaconda 安裝 Scrapy
Anaconda 是一個(gè)開(kāi)源包和環(huán)境管理神器。Anaconda 包括 180 多個(gè)科學(xué)包及其依賴(lài)項,包括 conda 和 Python。從官網(wǎng)下載安裝Anaconda(個(gè)人版),根據自己的系統選擇下載,安裝,選擇next繼續安裝,Install for選項選擇Just for me,選擇安裝位置,等待安裝完成。
安裝完成后,打開(kāi)命令行,輸入conda install scrapy,根據提示按Y,即可下載所有Scrapy及其依賴(lài)包,從而完成安裝。
注意:使用命令行安裝scrapy包時(shí),會(huì )出現下載超時(shí)問(wèn)題,即下載失敗。我們可以通過(guò)修改scrapy包的鏡像文件來(lái)提高scrapy包的下載速度。你可以參考博客:
這時(shí)候測試Scrapy是否安裝成功:在命令行窗口輸入scrapy,回車(chē)。如果出現如下界面,則表示安裝成功:
https://www.h5w3.com/wp-conten ... 9.png 150w" />二、安裝 PyCharm
1.PyCharm介紹
PyCharm 是一個(gè) Python IDE,擁有一套完整的工具,可以幫助用戶(hù)在使用 Python 語(yǔ)言進(jìn)行開(kāi)發(fā)時(shí)提高效率,例如調試、語(yǔ)法高亮、項目管理、代碼跳轉、智能提示、自動(dòng)完成、單元測試和版本控制。此外,IDE 還提供高級功能以支持 Django 框架下的專(zhuān)業(yè) Web 開(kāi)發(fā)。
2.PyCharm 安裝
進(jìn)入PyCharm官網(wǎng),直接點(diǎn)擊DownLoad下載,左邊是專(zhuān)業(yè)版,右邊是社區版,社區版免費,專(zhuān)業(yè)版免費試用。
如果我們之前沒(méi)有下載過(guò)Python解釋器,可以在等待安裝的同時(shí)下載Python解釋器,進(jìn)入Python官網(wǎng),根據系統和版本下載對應的壓縮包。安裝完成后,在環(huán)境變量 Path 中配置 Python 解釋器的安裝路徑。你可以參考博客:
三、Scrapy 抓豆瓣項目在行動(dòng)
前提條件:如果要在 PyCharm 中使用 Scrapy,首先必須在 PyCharm 中安裝支持的 Scrapy 包。流程如下,點(diǎn)擊文件>>設置... 兩個(gè)包,如果點(diǎn)擊的時(shí)候看到一個(gè)Scrapy包,那么就不需要安裝了,繼續下一步。
https://www.h5w3.com/wp-conten ... 7.png 150w" />如果沒(méi)有Scrapy包,點(diǎn)擊“+”,搜索Scrapy包,點(diǎn)擊Install Package進(jìn)行安裝
https://www.h5w3.com/wp-conten ... 1.png 150w" />等待安裝完成。
1.新項目
打開(kāi)新安裝的PyCharm,使用軟件終端中的pycharm工具,如果找不到PyCharm終端在哪里,就是左下角的Terminal。
輸入命令:scrapy startproject douban 這是使用命令行新建爬蟲(chóng)項目,如下圖,圖中項目名稱(chēng)為pythonProject
https://www.h5w3.com/wp-conten ... 0.png 150w" />然后在命令行輸入命令:cd douban進(jìn)入生成項目的根目錄
然后在終端繼續輸入命令:scrapy genspider douban_spider 生成douban_spider爬蟲(chóng)文件。
此時(shí)的項目結構如下圖所示:
https://www.h5w3.com/wp-conten ... 0.png 136w" />2.明確目標
我們要練習的 網(wǎng)站 是:
假設,我們獲取 top250 電影的序列號、電影名稱(chēng)、介紹、星級、評論數、電影描述選項
至此,我們在 items.py 文件中定義抓取的數據項,代碼如下:
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/lat ... .html
import scrapy
class DoubanItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
# 序列號
serial_number = scrapy.Field();
# 電影名
movie_name = scrapy.Field();
# 介紹
introduce = scrapy.Field();
# 星級
star = scrapy.Field();
# 評價(jià)數
evaluate = scrapy.Field();
# 描述
describe = scrapy.Field();
pass
3.接下來(lái),我們需要創(chuàng )建爬蟲(chóng)并存儲爬取的內容
在douban_spider.py爬蟲(chóng)文件中編寫(xiě)具體的邏輯代碼,如下:
# -*- coding: utf-8 -*-
import scrapy
from ..items import DoubanItem
class DoubanSpiderSpider(scrapy.Spider):
name = "douban_spider"
# 允許的域名
allowed_domains = ["movie.douban.com"]
# 入口URL
start_urls = ["https://movie.douban.com/top250"]
def parse(self, response):
movie_list = response.xpath("//div[@class="article"]//ol[@class="grid_view"]/li")
#循環(huán)電影的條目
for i_item in movie_list:
#導入item,進(jìn)行數據解析
douban_item = DoubanItem()
douban_item["serial_number"] = i_item.xpath(".//div[@class="item"]//em/text()").extract_first()
douban_item["movie_name"] = i_item.xpath(".//div[@class="info"]//div[@class="hd"]/a/span[1]/text()").extract_first()
#如果文件有多行進(jìn)行解析
content = i_item.xpath(".//div[@class="info"]//div[@class="bd"]/p[1]/text()").extract()
for i_content in content:
content_s ="".join( i_content.split())
douban_item["introduce"] = content_s
douban_item["star"] = i_item.xpath(".//span[@class="rating_num"]/text()").extract_first()
douban_item["evaluate"] = i_item.xpath(".//div[@class="star"]//span[4]/text()").extract_first()
douban_item["describe"] = i_item.xpath(".//p[@class="quote"]/span/text()").extract_first()
print(douban_item)
yield douban_item
#解析下一頁(yè),取后一頁(yè)的XPATH
next_link = response.xpath("//span[@class="next"]/link/@href").extract()
if next_link:
next_link = next_link[0]
yield scrapy.Request("https://movie.douban.com/top250"+next_link,callback=self.parse)
這個(gè)時(shí)候不需要運行這個(gè)python文件,因為我們不單獨使用,所以不需要運行,允許報錯。import引入的問(wèn)題,主目錄的絕對路徑和相對路徑,原因是我們使用的是相對路徑“..items”,對相關(guān)內容感興趣的同學(xué)可以去網(wǎng)上找一下此類(lèi)問(wèn)題的解釋.
4.存儲內容
將爬取的內容存儲為 json 或 csv 格式的文件
在命令行輸入:scrapy crawl douban_spider -o test.json 或者 scrapy crawl douban_spider -o test.csv
將爬取的數據存儲在 json 文件或 csv 文件中。
執行爬取命令后,當鼠標聚焦到項目面板時(shí),會(huì )顯示生成的 json 文件或 csv 文件。打開(kāi)json或者csv文件后,如果里面什么都沒(méi)有,那么我們需要做進(jìn)一步的修改,修改代理USER_AGENT的內容,
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.8 Safari/537.36"
https://www.h5w3.com/wp-conten ... 4.png 150w" />如果存儲在json文件中,所有內容都會(huì )以十六進(jìn)制形式顯示,可以通過(guò)相應的方法進(jìn)行轉碼。這里就不多解釋了,如下圖所示:
https://www.h5w3.com/wp-conten ... 4.png 150w" />并且存儲在csv文件中,它會(huì )直接顯示我們要爬取的所有內容,如下圖:
https://www.h5w3.com/wp-conten ... 9.png 150w" />至此,我們就完成了網(wǎng)站具體內容的爬取。接下來(lái),我們需要對爬取的數據進(jìn)行處理。
分界線(xiàn) —————————————————————————————————————————————- 分界線(xiàn)
Scraoy 入門(mén)示例 2 - 使用管道實(shí)現
在本次實(shí)戰中,需要重新創(chuàng )建項目或者安裝scrapy包。參考上面的內容,新建項目的方法也參考上面的內容,這里不再贅述。
項目目錄結構如下圖所示:
https://www.h5w3.com/wp-conten ... 0.png 78w" />一、流水線(xiàn)介紹
當我們通過(guò)Spider爬取數據,通過(guò)Item采集數據時(shí),我們需要對數據做一些處理,因為我們爬取的數據不一定是我們想要的最終數據,可能還需要對數據進(jìn)行清洗和驗證。數據有效性。Scripy 中的 Pipeline 組件用于數據處理。Pipeline 組件是一個(gè)收錄特定接口的類(lèi)。它通常只負責一項功能的數據處理。在一個(gè)項目中可以同時(shí)啟用多個(gè)管道。
二、在items.py中定義你要抓取的數據
首先打開(kāi)一個(gè)新的pycharm項目,通過(guò)終端新建一個(gè)項目教程,在item中定義你要抓取的數據,比如電影名,代碼如下:
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/lat ... .html
import scrapy
class TutorialItem(scrapy.Item):
# define the fields for your item here like:
name = scrapy.Field()
pass
class DoubanmovieItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
moiveName = scrapy.Field()
三、定義 pipeline.py 文件
每個(gè) item 管道組件都是一個(gè)獨立的 pyhton 類(lèi),必須實(shí)現 process_item(self, item, spider) 方法。每個(gè)item管道組件都需要調用這個(gè)方法。該方法必須返回一個(gè)帶有數據的dict,或者一個(gè)item對象,或者拋出一個(gè)DropItem異常,并且被丟棄的item不會(huì )被后續管道組件處理。定義的 pipelines.py 代碼如下所示:
# Define your item pipelines here
#
# Don"t forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/lat ... .html
# useful for handling different item types with a single interface
from itemadapter import ItemAdapter
class TutorialPipeline(object):
def process_item(self, item, spider):
return item
import time
class DoubanmoviePipeline(object):
def process_item(self, item, spider):
now = time.strftime("%Y-%m-%d", time.localtime())
fileName = "douban" + now + ".txt"
with open(fileName, "a", encoding="utf-8") as fp:
fp.write(item["moiveName"][0]+"")
return item
四、配置設置.py
由于這次使用的是管道,所以我們需要在settings.py中打開(kāi)管道通道注釋?zhuān)⒃谄渲刑砑右粭l新記錄,如下圖所示:
https://www.h5w3.com/wp-conten ... 2.png 150w" />五、寫(xiě)爬蟲(chóng)文件
在tutorial/spiders目錄下創(chuàng )建quotes_spider.py文件,目錄結構如下,編寫(xiě)初步代碼:
https://www.h5w3.com/wp-conten ... 0.png 93w" />quote_spider.py 代碼如下:
import scrapy
from items import DoubanmovieItem
class QuotesSpider(scrapy.Spider):
name = "doubanSpider"
allowed_domains = ["douban.com"]
start_urls = ["http://movie.douban.com/cinema/nowplaying",
"http://movie.douban.com/cinema ... ot%3B]
def parse(self, response):
print("--" * 20 )
#print(response.body)
print("==" * 20 )
subSelector = response.xpath("//li[@class="stitle"]")
items = []
for sub in subSelector:
#print(sub.xpath("normalize-space(./a/text())").extract())
print(sub)
item = DoubanmovieItem()
item["moiveName"] = sub.xpath("normalize-space(./a/text())").extract()
items.append(item)
print(items)
return items
六、從啟動(dòng)文件運行
在豆瓣文件目錄下新建啟動(dòng)文件douban_spider_run.py(文件名可取不同),運行文件查看結果。編寫(xiě)代碼如下:
from scrapy import cmdline
cmdline.execute("scrapy crawl doubanSpider".split())
最后,處理后的爬取數據如下圖(部分)所示:
https://www.h5w3.com/wp-conten ... 7.png 150w" />最后,希望大家在寫(xiě)代碼的時(shí)候可以小心,不要馬虎。實(shí)驗的時(shí)候寫(xiě)了方法DoubanmovieItem作為DobanmovieItem引入,導致整個(gè)程序失敗,而且PyCharm也沒(méi)有告訴我哪里錯了,我到處找問(wèn)題的解決方法也沒(méi)找到。最后查了很多遍,都是在生成方法的時(shí)候才發(fā)現的,所以一定要小心。該錯誤如下圖所示。提示找不到DobanmovieItem模塊。它可能告訴我錯誤的地方。因為懶得找,找了很久。希望大家多多注意!
https://www.h5w3.com/wp-conten ... 5.png 150w" />至此,使用Scrapy抓取網(wǎng)頁(yè)內容,并對抓取到的內容進(jìn)行清理和處理的實(shí)驗已經(jīng)完成。要求熟悉并使用此過(guò)程中的代碼和操作,不要在網(wǎng)上搜索和消化。吸收它并記住它,這是學(xué)習知識的真正方法,而不僅僅是畫(huà)一個(gè)勺子。
本文地址:H5W3 ? python爬蟲(chóng)示例:使用Scrapy爬取網(wǎng)頁(yè)采集數據
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(開(kāi)始定位,也即這兩個(gè)寫(xiě)法在XML包中都是適用的)
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 63 次瀏覽 ? 2022-03-07 22:07
開(kāi)始定位,即
div[@class='first']/a/text()
這兩種寫(xiě)法都適用于 XML 包。
由于不是主要內容,更多關(guān)于HTML的知識這里不再贅述。詳細的可以自己學(xué)習HTML和CSS相關(guān)知識,是爬蟲(chóng)的基礎。
我們通常使用chrome瀏覽器右鍵->查看源代碼,或者右鍵要查看的內容->檢查,然后會(huì )看到如下界面:
這時(shí)候如果我們在Khaled Hosseini那一行右鍵,可以右鍵->復制->選擇器或者Xpath直接復制對應的層次定位。需要注意的是,我們還需要將復制的定位代碼替換成XML包可以識別的格式。例如,屬性值使用單引號,“//”表示該類(lèi)型的所有節點(diǎn)等。
下面重點(diǎn)介紹XML中常見(jiàn)的節點(diǎn)定位方法和代碼,可以作為參考:
<p>getNodeSet(doc,'/bookstore/book[1]')
# 選取屬于 bookstore 子元素的最后一個(gè) book 元素。
getNodeSet(doc,'/bookstore/book[last()]')
# 選取最前面的兩個(gè)屬于 bookstore 元素的子元素的 book 元素
getNodeSet(doc,'/bookstore/book[position() 查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(開(kāi)始定位,也即這兩個(gè)寫(xiě)法在XML包中都是適用的)
開(kāi)始定位,即
div[@class='first']/a/text()
這兩種寫(xiě)法都適用于 XML 包。
由于不是主要內容,更多關(guān)于HTML的知識這里不再贅述。詳細的可以自己學(xué)習HTML和CSS相關(guān)知識,是爬蟲(chóng)的基礎。
我們通常使用chrome瀏覽器右鍵->查看源代碼,或者右鍵要查看的內容->檢查,然后會(huì )看到如下界面:

這時(shí)候如果我們在Khaled Hosseini那一行右鍵,可以右鍵->復制->選擇器或者Xpath直接復制對應的層次定位。需要注意的是,我們還需要將復制的定位代碼替換成XML包可以識別的格式。例如,屬性值使用單引號,“//”表示該類(lèi)型的所有節點(diǎn)等。
下面重點(diǎn)介紹XML中常見(jiàn)的節點(diǎn)定位方法和代碼,可以作為參考:
<p>getNodeSet(doc,'/bookstore/book[1]')
# 選取屬于 bookstore 子元素的最后一個(gè) book 元素。
getNodeSet(doc,'/bookstore/book[last()]')
# 選取最前面的兩個(gè)屬于 bookstore 元素的子元素的 book 元素
getNodeSet(doc,'/bookstore/book[position()
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(:網(wǎng)絡(luò )爬蟲(chóng);Python;MySQL;正則表達式;)
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 110 次瀏覽 ? 2022-03-06 05:20
吳永聰
摘要: 近年來(lái),隨著(zhù)互聯(lián)網(wǎng)的發(fā)展,如何有效地從互聯(lián)網(wǎng)上獲取所需信息已成為眾多互聯(lián)網(wǎng)公司競爭研究的新方向。從互聯(lián)網(wǎng)獲取數據最常用的方法是網(wǎng)絡(luò )爬蟲(chóng)。網(wǎng)絡(luò )爬蟲(chóng),也稱(chēng)為網(wǎng)絡(luò )蜘蛛和網(wǎng)絡(luò )機器人,是一種根據特定規則和給定 URL 自動(dòng)采集互聯(lián)網(wǎng)數據和信息的程序。文章討論了網(wǎng)絡(luò )爬蟲(chóng)實(shí)現過(guò)程中的主要問(wèn)題:如何使用python模擬登錄、如何使用正則表達式匹配字符串獲取信息、如何使用mysql存儲數據等,并實(shí)現一個(gè)使用 python 的網(wǎng)絡(luò )爬蟲(chóng)系統。
關(guān)鍵詞:網(wǎng)絡(luò )爬蟲(chóng);Python; MySQL;常用表達
CLC 編號:TP311.11 文號:A文章編號:1006-8228 (2019)08-94-03
摘要:近年來(lái),隨著(zhù)互聯(lián)網(wǎng)的發(fā)展,如何有效地從互聯(lián)網(wǎng)上獲取所需的信息成為眾多互聯(lián)網(wǎng)公司爭相研究的新方向,而最常見(jiàn)的從互聯(lián)網(wǎng)上獲取數據的手段是網(wǎng)絡(luò )爬蟲(chóng)。網(wǎng)絡(luò )爬蟲(chóng)也稱(chēng)為網(wǎng)絡(luò )蜘蛛或網(wǎng)絡(luò )機器人,它是根據給定的 URL 和特定規則自動(dòng)采集互聯(lián)網(wǎng)數據和信息的程序。本文討論了網(wǎng)絡(luò )爬蟲(chóng)實(shí)現中的主要問(wèn)題,如如何使用Python模擬登錄、如何使用正則表達式匹配字符串獲取信息以及如何使用MySQL存儲數據等。最后通過(guò)對Python語(yǔ)言的研究,實(shí)現了一個(gè)基于Python的網(wǎng)絡(luò )爬蟲(chóng)程序系統。
關(guān)鍵詞:網(wǎng)絡(luò )爬蟲(chóng);Python; MySQL;正則表達式
0 前言
在網(wǎng)絡(luò )信息和數據爆炸式增長(cháng)的時(shí)代,盡管互聯(lián)網(wǎng)信息技術(shù)飛速發(fā)展,但仍然難以從如此海量的信息數據中找到真正有用的信息。于是,谷歌、百度、雅虎等搜索引擎應運而生。搜索引擎可以根據用戶(hù)輸入的關(guān)鍵字檢索互聯(lián)網(wǎng)上的網(wǎng)頁(yè),為用戶(hù)查找與關(guān)鍵字相關(guān)或收錄關(guān)鍵字的信息。網(wǎng)絡(luò )爬蟲(chóng)作為搜索引擎的重要組成部分,在信息檢索過(guò)程中發(fā)揮著(zhù)重要作用。因此,網(wǎng)絡(luò )爬蟲(chóng)的研究對搜索引擎的發(fā)展具有重要意義。對于編寫(xiě)網(wǎng)絡(luò )爬蟲(chóng),python有其獨特的優(yōu)勢。比如python中有很多爬蟲(chóng)框架,使得網(wǎng)絡(luò )爬蟲(chóng)爬取數據的效率更高。同時(shí),Python 是一種面向對象的解釋型高級編程語(yǔ)言。它的語(yǔ)法比其他高級編程語(yǔ)言更簡(jiǎn)單、更容易閱讀和理解。因此,使用 Python 實(shí)現網(wǎng)絡(luò )爬蟲(chóng)是一個(gè)不錯的選擇。
1 網(wǎng)絡(luò )爬蟲(chóng)概述
1.1 網(wǎng)絡(luò )爬蟲(chóng)原理
網(wǎng)絡(luò )爬蟲(chóng),又稱(chēng)網(wǎng)絡(luò )蜘蛛、網(wǎng)絡(luò )機器人,主要用于采集互聯(lián)網(wǎng)上的各種資源。它是搜索引擎的重要組成部分,是一種自動(dòng)提取 Internet 上特定頁(yè)面內容的程序。通用搜索引擎網(wǎng)絡(luò )爬蟲(chóng)工作流程[1]:①將種子URL放入等待URL隊列;② 將等待URL從等待URL隊列中取出,進(jìn)行讀取URL、DNS解析、網(wǎng)頁(yè)下載等操作;③ 下載 將下載的網(wǎng)頁(yè)放入下載的網(wǎng)頁(yè)庫;④ 將下載的網(wǎng)頁(yè)網(wǎng)址放入抓取的網(wǎng)址隊列中;爬行循環(huán)。
爬蟲(chóng)的工作流程:①通過(guò)URL抓取頁(yè)面代碼;② 通過(guò)正則匹配獲取頁(yè)面的有用數據或頁(yè)面上有用的URL;③ 對獲取的數據進(jìn)行處理或通過(guò)獲取的新URL進(jìn)入下一輪爬取循環(huán)。
1.2 網(wǎng)絡(luò )爬蟲(chóng)的分類(lèi)
網(wǎng)絡(luò )爬蟲(chóng)大致可以分為一般網(wǎng)絡(luò )爬蟲(chóng)和專(zhuān)注網(wǎng)絡(luò )爬蟲(chóng)[2]。
通用網(wǎng)絡(luò )爬蟲(chóng),又稱(chēng)全網(wǎng)爬蟲(chóng),從一個(gè)或多個(gè)初始URL開(kāi)始,獲取初始頁(yè)面的代碼,同時(shí)從頁(yè)面中提取相關(guān)URL放入隊列中直到滿(mǎn)足程序停止條件。與一般網(wǎng)絡(luò )爬蟲(chóng)相比,聚焦網(wǎng)絡(luò )爬蟲(chóng)的工作流程更為復雜。它需要提前通過(guò)一定的網(wǎng)頁(yè)分析算法過(guò)濾掉一些與主題無(wú)關(guān)的URL,以保證剩余的URL在一定程度上與主題相關(guān)。放入等待抓取的 URL 隊列。然后根據搜索策略,從隊列中選擇下一步要爬取的URL,重復上述操作,直到滿(mǎn)足程序的停止條件。專(zhuān)注的網(wǎng)絡(luò )爬蟲(chóng)可以爬取與主題更相關(guān)的信息。例如,為了快速獲取微博中的數據,我們可以利用聚焦爬蟲(chóng)技術(shù)開(kāi)發(fā)微博數據抓取工具[3-5]。在當今大數據時(shí)代,專(zhuān)注爬蟲(chóng)可以大海撈針,從網(wǎng)絡(luò )數據的海洋中找到人們需要的信息,過(guò)濾掉那些“垃圾數據”(廣告信息等與檢索主題無(wú)關(guān)的數據) )。
2 蟒蛇
Python的作者是荷蘭人Guido von Rossum。1982 年,Guido 獲得了阿姆斯特丹大學(xué)的數學(xué)和計算碩士學(xué)位[6]。相比現在,在他那個(gè)年代,個(gè)人電腦的頻率和內存都非常低,導致電腦的配置偏低。為了讓程序在 PC 上運行,所有編譯器都在其核心進(jìn)行了優(yōu)化,因為如果不進(jìn)行優(yōu)化,更大的數組可能會(huì )填滿(mǎn)內存。Guido 想要編寫(xiě)一種全面、易于學(xué)習、易于使用和可擴展的新語(yǔ)言。1989 年,Guido 開(kāi)始為 Python 語(yǔ)言編寫(xiě)編譯器。
3 系統分析
本系統是一個(gè)基于Python的網(wǎng)絡(luò )爬蟲(chóng)系統,用于登錄并爬取豆瓣上的相冊、日記、話(huà)題、評論等一些動(dòng)態(tài)數據信息。并且可以將關(guān)鍵字查詢(xún)到的動(dòng)態(tài)信息數據存入數據庫,將部分數據存入數據庫,存入本地txt文件,同時(shí)可以將相冊動(dòng)態(tài)中的圖片下載到本地,還記錄專(zhuān)輯信息,在每一頁(yè)上。操作完成后,可以翻頁(yè),選擇頁(yè)面繼續操作。因此系統應滿(mǎn)足以下要求。
?。?)可以通過(guò)驗證碼驗證模擬登錄豆瓣。即不需要通過(guò)瀏覽器登錄,輸入用戶(hù)名、密碼和驗證即可登錄豆瓣??刂婆_中的代碼。
(2)登錄成功后可以抓取豆瓣首頁(yè)的代碼。即通過(guò)登錄成功后的cookie,可以訪(fǎng)問(wèn)游客無(wú)法訪(fǎng)問(wèn)的頁(yè)面,抓取頁(yè)面代碼.
?。?)可以從頁(yè)面代碼中提取出需要的信息,即需要通過(guò)正則表達式匹配等方法從抓取的頁(yè)面中獲取有用的數據信息。
?。?)可以實(shí)現翻頁(yè)和分頁(yè)功能。即訪(fǎng)問(wèn)網(wǎng)站的動(dòng)態(tài)頁(yè)面時(shí),可以通過(guò)在控制臺輸入具體內容進(jìn)行翻頁(yè)或者輸入頁(yè)碼選擇頁(yè)面,然后抓取其他頁(yè)面。
(5)實(shí)現關(guān)鍵字查詢(xún)的功能,爬取找到的數據并存入數據庫表中。即在爬取頁(yè)面獲取數據后,在控制臺輸入關(guān)鍵字即可爬取獲取需要的信息。
(6)可以將爬取的圖片的url下載到本地,圖片的詳細信息可以保存在本地txt[12]。也就是說(shuō),不僅要下載圖片到本地,還有圖片的主題信息、圖片的用戶(hù)、圖片的具體網(wǎng)址等信息都保存在txt文件中。
(7) 將日記等動(dòng)態(tài)信息存儲在不同的本地文件中。即針對抓取到的不同數據信息,采用不同的存儲方式和存儲路徑。
(8)在登錄成功的情況下,可以進(jìn)入個(gè)人中心,將當前用戶(hù)關(guān)注的用戶(hù)信息存儲在數據庫表中。這些信息可能包括用戶(hù)id、昵稱(chēng)、主頁(yè)url、個(gè)性化簽名等
以上是本課程對爬蟲(chóng)系統的一些基本要求,據此可以明確系統的功能。因為這個(gè)系統注重網(wǎng)絡(luò )信息資源的爬取,所以在用戶(hù)交互方面可能不是很美觀(guān)。本系統沒(méi)有編寫(xiě)界面,所有操作都在Eclipse控制臺中進(jìn)行。例如:在控制臺輸入用戶(hù)名、密碼和驗證碼登錄,登錄成功后的頁(yè)面選擇,頁(yè)面選擇后的數據爬取等。
但是系統運行后爬取的數據可以在數據所在的本地txt文件或數據庫中查看。因此,測試系統是否真的可以爬取數據,可以通過(guò)觀(guān)察本地txt文件內容的變化或者數據庫表中記錄的變化來(lái)驗證。
該爬蟲(chóng)系統包括模擬登錄、頁(yè)面爬取、信息爬取、數據存儲等主要功能。其中,頁(yè)面爬取包括翻頁(yè)爬取、頁(yè)面選擇爬取、個(gè)人頁(yè)面爬??;信息爬取包括動(dòng)態(tài)爬取和跟隨用戶(hù)爬??;數據存儲包括寫(xiě)入文件、下載到本地和存儲數據庫,如圖1所示。
自動(dòng)爬取 Internet 信息的程序稱(chēng)為爬蟲(chóng)。它主要由爬蟲(chóng)調度器、URL管理器、網(wǎng)頁(yè)下載器和網(wǎng)頁(yè)解析器組成。
(1)爬蟲(chóng)調度器:程序的入口點(diǎn),主要負責爬蟲(chóng)程序的控制。
?、?網(wǎng)址管理器:
?、?為要爬取的集合添加新的URL;
?、谂袛嘁砑拥腢RL是否已經(jīng)存在;
?、?判斷是否還有待爬取的URL,將待爬取集合中的URL移動(dòng)到爬取集合中。
URL存儲方式:Python內存是set()集合、關(guān)系數據庫、緩存數據庫。
(3)網(wǎng)頁(yè)下載器:根據URL獲取網(wǎng)頁(yè)內容,通過(guò)urllib2和request實(shí)現。
?、染W(wǎng)頁(yè)解析器:從網(wǎng)頁(yè)中提取有價(jià)值的數據。實(shí)現方式包括正則表達式、html.parser、BeautifulSoup、lxml。
4。結論
爬蟲(chóng)是一種自動(dòng)下載網(wǎng)頁(yè)的程序。它根據給定的爬取目標有選擇地訪(fǎng)問(wèn)萬(wàn)維網(wǎng)上的網(wǎng)頁(yè)及其相關(guān)鏈接,以獲取所需的信息。
本文中,爬蟲(chóng)旨在爬取與特定主題內容相關(guān)的網(wǎng)頁(yè),為面向主題的用戶(hù)查詢(xún)準備數據資源,實(shí)現網(wǎng)頁(yè)數據的抓取和分析。
參考:
[1] 曾小虎. 基于主題的微博網(wǎng)絡(luò )爬蟲(chóng)研究[D]. 武漢理工大學(xué), 2014.
[2] 周麗珠,林玲.爬蟲(chóng)技術(shù)研究綜述[J]. 計算機應用,2005. 25 (9): 1965-1969
[3] 周中華,張惠然,謝江。Python中的新浪微博數據爬蟲(chóng)[J]. 計算機應用,2014.34 (11): 3131-3134
[4] 劉晶晶. 面向微博的網(wǎng)絡(luò )爬蟲(chóng)研究與實(shí)現[D]. 復旦大學(xué),2012.
[5] 王靜,朱可,王斌強?;谛畔祿治龅奈⒉┭芯烤C述[J]. 計算機應用, 2012. 32 (7): 2027-2029, 2037.@ >
[6](挪威)Magnus Lie Hetland。思偉,曾俊偉,譚英華,譯。Python基礎教程[M].人民郵電出版社,2014. 查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(:網(wǎng)絡(luò )爬蟲(chóng);Python;MySQL;正則表達式;)
吳永聰

摘要: 近年來(lái),隨著(zhù)互聯(lián)網(wǎng)的發(fā)展,如何有效地從互聯(lián)網(wǎng)上獲取所需信息已成為眾多互聯(lián)網(wǎng)公司競爭研究的新方向。從互聯(lián)網(wǎng)獲取數據最常用的方法是網(wǎng)絡(luò )爬蟲(chóng)。網(wǎng)絡(luò )爬蟲(chóng),也稱(chēng)為網(wǎng)絡(luò )蜘蛛和網(wǎng)絡(luò )機器人,是一種根據特定規則和給定 URL 自動(dòng)采集互聯(lián)網(wǎng)數據和信息的程序。文章討論了網(wǎng)絡(luò )爬蟲(chóng)實(shí)現過(guò)程中的主要問(wèn)題:如何使用python模擬登錄、如何使用正則表達式匹配字符串獲取信息、如何使用mysql存儲數據等,并實(shí)現一個(gè)使用 python 的網(wǎng)絡(luò )爬蟲(chóng)系統。
關(guān)鍵詞:網(wǎng)絡(luò )爬蟲(chóng);Python; MySQL;常用表達
CLC 編號:TP311.11 文號:A文章編號:1006-8228 (2019)08-94-03
摘要:近年來(lái),隨著(zhù)互聯(lián)網(wǎng)的發(fā)展,如何有效地從互聯(lián)網(wǎng)上獲取所需的信息成為眾多互聯(lián)網(wǎng)公司爭相研究的新方向,而最常見(jiàn)的從互聯(lián)網(wǎng)上獲取數據的手段是網(wǎng)絡(luò )爬蟲(chóng)。網(wǎng)絡(luò )爬蟲(chóng)也稱(chēng)為網(wǎng)絡(luò )蜘蛛或網(wǎng)絡(luò )機器人,它是根據給定的 URL 和特定規則自動(dòng)采集互聯(lián)網(wǎng)數據和信息的程序。本文討論了網(wǎng)絡(luò )爬蟲(chóng)實(shí)現中的主要問(wèn)題,如如何使用Python模擬登錄、如何使用正則表達式匹配字符串獲取信息以及如何使用MySQL存儲數據等。最后通過(guò)對Python語(yǔ)言的研究,實(shí)現了一個(gè)基于Python的網(wǎng)絡(luò )爬蟲(chóng)程序系統。
關(guān)鍵詞:網(wǎng)絡(luò )爬蟲(chóng);Python; MySQL;正則表達式
0 前言
在網(wǎng)絡(luò )信息和數據爆炸式增長(cháng)的時(shí)代,盡管互聯(lián)網(wǎng)信息技術(shù)飛速發(fā)展,但仍然難以從如此海量的信息數據中找到真正有用的信息。于是,谷歌、百度、雅虎等搜索引擎應運而生。搜索引擎可以根據用戶(hù)輸入的關(guān)鍵字檢索互聯(lián)網(wǎng)上的網(wǎng)頁(yè),為用戶(hù)查找與關(guān)鍵字相關(guān)或收錄關(guān)鍵字的信息。網(wǎng)絡(luò )爬蟲(chóng)作為搜索引擎的重要組成部分,在信息檢索過(guò)程中發(fā)揮著(zhù)重要作用。因此,網(wǎng)絡(luò )爬蟲(chóng)的研究對搜索引擎的發(fā)展具有重要意義。對于編寫(xiě)網(wǎng)絡(luò )爬蟲(chóng),python有其獨特的優(yōu)勢。比如python中有很多爬蟲(chóng)框架,使得網(wǎng)絡(luò )爬蟲(chóng)爬取數據的效率更高。同時(shí),Python 是一種面向對象的解釋型高級編程語(yǔ)言。它的語(yǔ)法比其他高級編程語(yǔ)言更簡(jiǎn)單、更容易閱讀和理解。因此,使用 Python 實(shí)現網(wǎng)絡(luò )爬蟲(chóng)是一個(gè)不錯的選擇。
1 網(wǎng)絡(luò )爬蟲(chóng)概述
1.1 網(wǎng)絡(luò )爬蟲(chóng)原理
網(wǎng)絡(luò )爬蟲(chóng),又稱(chēng)網(wǎng)絡(luò )蜘蛛、網(wǎng)絡(luò )機器人,主要用于采集互聯(lián)網(wǎng)上的各種資源。它是搜索引擎的重要組成部分,是一種自動(dòng)提取 Internet 上特定頁(yè)面內容的程序。通用搜索引擎網(wǎng)絡(luò )爬蟲(chóng)工作流程[1]:①將種子URL放入等待URL隊列;② 將等待URL從等待URL隊列中取出,進(jìn)行讀取URL、DNS解析、網(wǎng)頁(yè)下載等操作;③ 下載 將下載的網(wǎng)頁(yè)放入下載的網(wǎng)頁(yè)庫;④ 將下載的網(wǎng)頁(yè)網(wǎng)址放入抓取的網(wǎng)址隊列中;爬行循環(huán)。
爬蟲(chóng)的工作流程:①通過(guò)URL抓取頁(yè)面代碼;② 通過(guò)正則匹配獲取頁(yè)面的有用數據或頁(yè)面上有用的URL;③ 對獲取的數據進(jìn)行處理或通過(guò)獲取的新URL進(jìn)入下一輪爬取循環(huán)。
1.2 網(wǎng)絡(luò )爬蟲(chóng)的分類(lèi)
網(wǎng)絡(luò )爬蟲(chóng)大致可以分為一般網(wǎng)絡(luò )爬蟲(chóng)和專(zhuān)注網(wǎng)絡(luò )爬蟲(chóng)[2]。
通用網(wǎng)絡(luò )爬蟲(chóng),又稱(chēng)全網(wǎng)爬蟲(chóng),從一個(gè)或多個(gè)初始URL開(kāi)始,獲取初始頁(yè)面的代碼,同時(shí)從頁(yè)面中提取相關(guān)URL放入隊列中直到滿(mǎn)足程序停止條件。與一般網(wǎng)絡(luò )爬蟲(chóng)相比,聚焦網(wǎng)絡(luò )爬蟲(chóng)的工作流程更為復雜。它需要提前通過(guò)一定的網(wǎng)頁(yè)分析算法過(guò)濾掉一些與主題無(wú)關(guān)的URL,以保證剩余的URL在一定程度上與主題相關(guān)。放入等待抓取的 URL 隊列。然后根據搜索策略,從隊列中選擇下一步要爬取的URL,重復上述操作,直到滿(mǎn)足程序的停止條件。專(zhuān)注的網(wǎng)絡(luò )爬蟲(chóng)可以爬取與主題更相關(guān)的信息。例如,為了快速獲取微博中的數據,我們可以利用聚焦爬蟲(chóng)技術(shù)開(kāi)發(fā)微博數據抓取工具[3-5]。在當今大數據時(shí)代,專(zhuān)注爬蟲(chóng)可以大海撈針,從網(wǎng)絡(luò )數據的海洋中找到人們需要的信息,過(guò)濾掉那些“垃圾數據”(廣告信息等與檢索主題無(wú)關(guān)的數據) )。
2 蟒蛇
Python的作者是荷蘭人Guido von Rossum。1982 年,Guido 獲得了阿姆斯特丹大學(xué)的數學(xué)和計算碩士學(xué)位[6]。相比現在,在他那個(gè)年代,個(gè)人電腦的頻率和內存都非常低,導致電腦的配置偏低。為了讓程序在 PC 上運行,所有編譯器都在其核心進(jìn)行了優(yōu)化,因為如果不進(jìn)行優(yōu)化,更大的數組可能會(huì )填滿(mǎn)內存。Guido 想要編寫(xiě)一種全面、易于學(xué)習、易于使用和可擴展的新語(yǔ)言。1989 年,Guido 開(kāi)始為 Python 語(yǔ)言編寫(xiě)編譯器。
3 系統分析
本系統是一個(gè)基于Python的網(wǎng)絡(luò )爬蟲(chóng)系統,用于登錄并爬取豆瓣上的相冊、日記、話(huà)題、評論等一些動(dòng)態(tài)數據信息。并且可以將關(guān)鍵字查詢(xún)到的動(dòng)態(tài)信息數據存入數據庫,將部分數據存入數據庫,存入本地txt文件,同時(shí)可以將相冊動(dòng)態(tài)中的圖片下載到本地,還記錄專(zhuān)輯信息,在每一頁(yè)上。操作完成后,可以翻頁(yè),選擇頁(yè)面繼續操作。因此系統應滿(mǎn)足以下要求。
?。?)可以通過(guò)驗證碼驗證模擬登錄豆瓣。即不需要通過(guò)瀏覽器登錄,輸入用戶(hù)名、密碼和驗證即可登錄豆瓣??刂婆_中的代碼。
(2)登錄成功后可以抓取豆瓣首頁(yè)的代碼。即通過(guò)登錄成功后的cookie,可以訪(fǎng)問(wèn)游客無(wú)法訪(fǎng)問(wèn)的頁(yè)面,抓取頁(yè)面代碼.
?。?)可以從頁(yè)面代碼中提取出需要的信息,即需要通過(guò)正則表達式匹配等方法從抓取的頁(yè)面中獲取有用的數據信息。
?。?)可以實(shí)現翻頁(yè)和分頁(yè)功能。即訪(fǎng)問(wèn)網(wǎng)站的動(dòng)態(tài)頁(yè)面時(shí),可以通過(guò)在控制臺輸入具體內容進(jìn)行翻頁(yè)或者輸入頁(yè)碼選擇頁(yè)面,然后抓取其他頁(yè)面。
(5)實(shí)現關(guān)鍵字查詢(xún)的功能,爬取找到的數據并存入數據庫表中。即在爬取頁(yè)面獲取數據后,在控制臺輸入關(guān)鍵字即可爬取獲取需要的信息。
(6)可以將爬取的圖片的url下載到本地,圖片的詳細信息可以保存在本地txt[12]。也就是說(shuō),不僅要下載圖片到本地,還有圖片的主題信息、圖片的用戶(hù)、圖片的具體網(wǎng)址等信息都保存在txt文件中。
(7) 將日記等動(dòng)態(tài)信息存儲在不同的本地文件中。即針對抓取到的不同數據信息,采用不同的存儲方式和存儲路徑。
(8)在登錄成功的情況下,可以進(jìn)入個(gè)人中心,將當前用戶(hù)關(guān)注的用戶(hù)信息存儲在數據庫表中。這些信息可能包括用戶(hù)id、昵稱(chēng)、主頁(yè)url、個(gè)性化簽名等
以上是本課程對爬蟲(chóng)系統的一些基本要求,據此可以明確系統的功能。因為這個(gè)系統注重網(wǎng)絡(luò )信息資源的爬取,所以在用戶(hù)交互方面可能不是很美觀(guān)。本系統沒(méi)有編寫(xiě)界面,所有操作都在Eclipse控制臺中進(jìn)行。例如:在控制臺輸入用戶(hù)名、密碼和驗證碼登錄,登錄成功后的頁(yè)面選擇,頁(yè)面選擇后的數據爬取等。
但是系統運行后爬取的數據可以在數據所在的本地txt文件或數據庫中查看。因此,測試系統是否真的可以爬取數據,可以通過(guò)觀(guān)察本地txt文件內容的變化或者數據庫表中記錄的變化來(lái)驗證。
該爬蟲(chóng)系統包括模擬登錄、頁(yè)面爬取、信息爬取、數據存儲等主要功能。其中,頁(yè)面爬取包括翻頁(yè)爬取、頁(yè)面選擇爬取、個(gè)人頁(yè)面爬??;信息爬取包括動(dòng)態(tài)爬取和跟隨用戶(hù)爬??;數據存儲包括寫(xiě)入文件、下載到本地和存儲數據庫,如圖1所示。
自動(dòng)爬取 Internet 信息的程序稱(chēng)為爬蟲(chóng)。它主要由爬蟲(chóng)調度器、URL管理器、網(wǎng)頁(yè)下載器和網(wǎng)頁(yè)解析器組成。
(1)爬蟲(chóng)調度器:程序的入口點(diǎn),主要負責爬蟲(chóng)程序的控制。
?、?網(wǎng)址管理器:
?、?為要爬取的集合添加新的URL;
?、谂袛嘁砑拥腢RL是否已經(jīng)存在;
?、?判斷是否還有待爬取的URL,將待爬取集合中的URL移動(dòng)到爬取集合中。
URL存儲方式:Python內存是set()集合、關(guān)系數據庫、緩存數據庫。
(3)網(wǎng)頁(yè)下載器:根據URL獲取網(wǎng)頁(yè)內容,通過(guò)urllib2和request實(shí)現。
?、染W(wǎng)頁(yè)解析器:從網(wǎng)頁(yè)中提取有價(jià)值的數據。實(shí)現方式包括正則表達式、html.parser、BeautifulSoup、lxml。
4。結論
爬蟲(chóng)是一種自動(dòng)下載網(wǎng)頁(yè)的程序。它根據給定的爬取目標有選擇地訪(fǎng)問(wèn)萬(wàn)維網(wǎng)上的網(wǎng)頁(yè)及其相關(guān)鏈接,以獲取所需的信息。
本文中,爬蟲(chóng)旨在爬取與特定主題內容相關(guān)的網(wǎng)頁(yè),為面向主題的用戶(hù)查詢(xún)準備數據資源,實(shí)現網(wǎng)頁(yè)數據的抓取和分析。
參考:
[1] 曾小虎. 基于主題的微博網(wǎng)絡(luò )爬蟲(chóng)研究[D]. 武漢理工大學(xué), 2014.
[2] 周麗珠,林玲.爬蟲(chóng)技術(shù)研究綜述[J]. 計算機應用,2005. 25 (9): 1965-1969
[3] 周中華,張惠然,謝江。Python中的新浪微博數據爬蟲(chóng)[J]. 計算機應用,2014.34 (11): 3131-3134
[4] 劉晶晶. 面向微博的網(wǎng)絡(luò )爬蟲(chóng)研究與實(shí)現[D]. 復旦大學(xué),2012.
[5] 王靜,朱可,王斌強?;谛畔祿治龅奈⒉┭芯烤C述[J]. 計算機應用, 2012. 32 (7): 2027-2029, 2037.@ >
[6](挪威)Magnus Lie Hetland。思偉,曾俊偉,譚英華,譯。Python基礎教程[M].人民郵電出版社,2014.
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(soup(爬蟲(chóng))隱形條約下的DOM結構,常伴吾身)
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 63 次瀏覽 ? 2022-03-06 02:08
爬行動(dòng)物就像風(fēng),一直陪伴著(zhù)我……
在日常的折騰中,無(wú)論是我的網(wǎng)站被別人爬取,還是別人的網(wǎng)站被我爬取,這就像一個(gè)游戲過(guò)程。雙方在“隱形條約”下完成了各自的任務(wù)。正所謂君子之情如水,我不知道他是誰(shuí),他也不知道我是誰(shuí)。我們互相提供他們需要的信息?;蛟S這種關(guān)系更像是江湖,純潔的江湖,不是說(shuō)盈盈嫣嫣和世界。只談江上輕舟飲酒,竹林歌聲。說(shuō)完,雙方收劍離開(kāi),沒(méi)有人啰嗦一句:“誰(shuí)來(lái)?報名就來(lái)?!?br /> 爬蟲(chóng)的一個(gè)重要部分是數據處理。雖然靜態(tài)加載的網(wǎng)頁(yè)結構千差萬(wàn)別,界面看起來(lái)也不一樣,但是爬取的數據是單一的,都是DOM結構的“后代”。即使你明白過(guò)濾數據的本質(zhì)是處理字符串,但處理它的方法是無(wú)窮無(wú)盡的。以下是根據不同網(wǎng)頁(yè)風(fēng)格對癥下藥。
一:《好孩子》網(wǎng)頁(yè)
特點(diǎn):有完整的DOM結構,雖然有時(shí)會(huì )使用“混亂”的編碼,例如:gb2312等,但其本質(zhì)仍然是“好孩子”。
示例網(wǎng)址:百度搜索廣告牌
分析:看源碼,不難看出Billboard的新聞格式是
子節點(diǎn),而我們需要的部分正是子節點(diǎn)標簽。a標簽的屬性類(lèi)是“l(fā)ist-title”。
像這樣的網(wǎng)頁(yè)是典型的“好孩子”網(wǎng)頁(yè),具有良好的可視化 DOM 結構,所需的信息來(lái)自同一個(gè)結構,解析起來(lái)并不費力。
分析方法:
1.使用BeautifulSoup
部分代碼如下:
從 bs4 導入 BeautifulSoup 作為湯
source_code = "..." #你得到的網(wǎng)頁(yè)的源代碼
湯域 = 湯(源代碼,'lxml')
all_a = soup_dom.find_all('a',attrs={'class':'list-title'})
對于 all_a 中的 a:
href_title = {'href':a.get('href'),'title':a.text}
結果如下:
2、使用xpath方法解析
部分代碼如下:
從 lxml 導入 etree
source_code = "..." #你得到的網(wǎng)頁(yè)的源代碼
all_a = etree.Html(source_code).xpath("//a[@class='list-title']")
對于 all_a 中的 a:
href_title = {'href':a.attrib['href'],'title':a.text}
打?。╤ref_title)
結果如下:
從以上兩種方法可以看出,可以使用bs4或者Xpath來(lái)獲取“好孩子”網(wǎng)頁(yè)的數據。畢竟管教“好孩子”的成本遠低于管教“壞孩子”的成本,所以大家都喜歡好孩子。
二:“壞小子”網(wǎng)頁(yè)
特點(diǎn):大部分是古代(2010年之前)的頁(yè)面,DOM亂七八糟。(有些網(wǎng)頁(yè)甚至只有一個(gè)封閉標簽,其余的都是由
標簽被拆分,甚至使用虛假的 API 頁(yè)面來(lái)“冒充”真實(shí)的 API。)
但是:這些網(wǎng)址大多是丹尼爾博主,不拘一格,當你找到它們時(shí),就像在懸崖下發(fā)現秘密一樣!
示例網(wǎng)址:清華大學(xué)Penny Hot于2003年編寫(xiě)的linuxc教程~yhf/linux_c/
分析:如果能用簡(jiǎn)單的方法,就用簡(jiǎn)單的方法,如果不能用常規的方法
我要再次感謝 PennyHot 組織了我在 2003 年獲得的 Linux C 文檔,以方便您使用!
解決方法:使用正則
示例代碼:
重新進(jìn)口
source_code = "..." #你得到的網(wǎng)頁(yè)的源代碼
compile = pile("[\u4e00-\u9fa5]*") #匹配盡可能多的中文
find_all = compile.findall(source_code)
對于我在 find_all 中:
如果我!=””:
打?。ㄒ唬?br /> 結果如下:
總結:沒(méi)有好方法,只要能拿到自己需要的數據,就是好方法。
最后,感謝為互聯(lián)網(wǎng)后來(lái)者做出貢獻的先輩們。盡管很多人做著(zhù)普通的工作,但他們留下的東西就像寶藏一樣,藏寶圖隱藏在互聯(lián)網(wǎng)的每一個(gè)角落。讓我自強!
2020.3.19 維科斯 查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(soup(爬蟲(chóng))隱形條約下的DOM結構,常伴吾身)
爬行動(dòng)物就像風(fēng),一直陪伴著(zhù)我……
在日常的折騰中,無(wú)論是我的網(wǎng)站被別人爬取,還是別人的網(wǎng)站被我爬取,這就像一個(gè)游戲過(guò)程。雙方在“隱形條約”下完成了各自的任務(wù)。正所謂君子之情如水,我不知道他是誰(shuí),他也不知道我是誰(shuí)。我們互相提供他們需要的信息?;蛟S這種關(guān)系更像是江湖,純潔的江湖,不是說(shuō)盈盈嫣嫣和世界。只談江上輕舟飲酒,竹林歌聲。說(shuō)完,雙方收劍離開(kāi),沒(méi)有人啰嗦一句:“誰(shuí)來(lái)?報名就來(lái)?!?br /> 爬蟲(chóng)的一個(gè)重要部分是數據處理。雖然靜態(tài)加載的網(wǎng)頁(yè)結構千差萬(wàn)別,界面看起來(lái)也不一樣,但是爬取的數據是單一的,都是DOM結構的“后代”。即使你明白過(guò)濾數據的本質(zhì)是處理字符串,但處理它的方法是無(wú)窮無(wú)盡的。以下是根據不同網(wǎng)頁(yè)風(fēng)格對癥下藥。
一:《好孩子》網(wǎng)頁(yè)
特點(diǎn):有完整的DOM結構,雖然有時(shí)會(huì )使用“混亂”的編碼,例如:gb2312等,但其本質(zhì)仍然是“好孩子”。
示例網(wǎng)址:百度搜索廣告牌
分析:看源碼,不難看出Billboard的新聞格式是
子節點(diǎn),而我們需要的部分正是子節點(diǎn)標簽。a標簽的屬性類(lèi)是“l(fā)ist-title”。
像這樣的網(wǎng)頁(yè)是典型的“好孩子”網(wǎng)頁(yè),具有良好的可視化 DOM 結構,所需的信息來(lái)自同一個(gè)結構,解析起來(lái)并不費力。
分析方法:
1.使用BeautifulSoup
部分代碼如下:
從 bs4 導入 BeautifulSoup 作為湯
source_code = "..." #你得到的網(wǎng)頁(yè)的源代碼
湯域 = 湯(源代碼,'lxml')
all_a = soup_dom.find_all('a',attrs={'class':'list-title'})
對于 all_a 中的 a:
href_title = {'href':a.get('href'),'title':a.text}
結果如下:
2、使用xpath方法解析
部分代碼如下:
從 lxml 導入 etree
source_code = "..." #你得到的網(wǎng)頁(yè)的源代碼
all_a = etree.Html(source_code).xpath("//a[@class='list-title']")
對于 all_a 中的 a:
href_title = {'href':a.attrib['href'],'title':a.text}
打?。╤ref_title)
結果如下:
從以上兩種方法可以看出,可以使用bs4或者Xpath來(lái)獲取“好孩子”網(wǎng)頁(yè)的數據。畢竟管教“好孩子”的成本遠低于管教“壞孩子”的成本,所以大家都喜歡好孩子。
二:“壞小子”網(wǎng)頁(yè)
特點(diǎn):大部分是古代(2010年之前)的頁(yè)面,DOM亂七八糟。(有些網(wǎng)頁(yè)甚至只有一個(gè)封閉標簽,其余的都是由
標簽被拆分,甚至使用虛假的 API 頁(yè)面來(lái)“冒充”真實(shí)的 API。)
但是:這些網(wǎng)址大多是丹尼爾博主,不拘一格,當你找到它們時(shí),就像在懸崖下發(fā)現秘密一樣!
示例網(wǎng)址:清華大學(xué)Penny Hot于2003年編寫(xiě)的linuxc教程~yhf/linux_c/
分析:如果能用簡(jiǎn)單的方法,就用簡(jiǎn)單的方法,如果不能用常規的方法
我要再次感謝 PennyHot 組織了我在 2003 年獲得的 Linux C 文檔,以方便您使用!
解決方法:使用正則
示例代碼:
重新進(jìn)口
source_code = "..." #你得到的網(wǎng)頁(yè)的源代碼
compile = pile("[\u4e00-\u9fa5]*") #匹配盡可能多的中文
find_all = compile.findall(source_code)
對于我在 find_all 中:
如果我!=””:
打?。ㄒ唬?br /> 結果如下:
總結:沒(méi)有好方法,只要能拿到自己需要的數據,就是好方法。
最后,感謝為互聯(lián)網(wǎng)后來(lái)者做出貢獻的先輩們。盡管很多人做著(zhù)普通的工作,但他們留下的東西就像寶藏一樣,藏寶圖隱藏在互聯(lián)網(wǎng)的每一個(gè)角落。讓我自強!
2020.3.19 維科斯
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(靜態(tài)網(wǎng)頁(yè)抓取的介紹及應用方法-上海怡健醫學(xué))
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 92 次瀏覽 ? 2022-03-06 02:07
一、靜態(tài)網(wǎng)頁(yè)抓取簡(jiǎn)介
靜態(tài)網(wǎng)頁(yè)是純 HTML 格式的網(wǎng)頁(yè)。早期的 網(wǎng)站 是由靜態(tài)網(wǎng)頁(yè)組成的。靜態(tài)網(wǎng)頁(yè)的數據更容易獲取,因為我們需要的代碼隱藏在 HTML 代碼中。為了抓取靜態(tài)網(wǎng)頁(yè),我們使用 requests 庫。Requests 允許您輕松發(fā)送 HTTP 請求。該庫使用簡(jiǎn)單,功能齊全。
二、獲取響應內容
獲取響應內容的過(guò)程相當于使用瀏覽器的過(guò)程。我們在瀏覽器中輸入URL,瀏覽器會(huì )向服務(wù)器請求內容,服務(wù)器會(huì )返回HTML代碼,瀏覽器會(huì )自動(dòng)解析代碼。我們的爬蟲(chóng)和瀏覽器發(fā)送請求的過(guò)程是一樣的,都是通過(guò)requests向瀏覽器發(fā)送請求,獲取請求內容。
import requests
# 發(fā)送請求,獲取服務(wù)器響應內容
r = requests.get("http://www.santostang.com/")
print("文本編碼:", r.encoding)
print("響應狀態(tài)碼:", r.status_code)
print("字符串方式的響應體:", r.text)
三、自定義請求
我們使用requets發(fā)送請求獲取數據,但是有些網(wǎng)頁(yè)需要設置參數來(lái)獲取需要的數據,那么我們設置這些參數
1. 傳遞 URL 參數
有時(shí)我們需要在 URL 中添加一些參數來(lái)請求特定的數據。URL中加參數的形式是在問(wèn)號之后,以key/value的形式放在URL中。我們可以將參數保存在字典中,并將參數構建到 URL 中。
key_dict = {'key1': 'value1', 'key2': 'value2'}
r = requests.get('http://httpbin.org/get', params=key_dict)
print("URL已經(jīng)正確編碼:", r.url)
print("字符串方式的響應體:\n", r.text)
2. 自定義請求標頭
請求標頭是 Headers 部分,標頭提供有關(guān)請求、響應或其他發(fā)送請求的實(shí)體的信息。簡(jiǎn)單來(lái)說(shuō)就是模擬瀏覽器的作用,所以請求頭是必須要學(xué)習的,那么我們如何構造請求頭,我們使用谷歌瀏覽器??梢渣c(diǎn)擊鼠標右鍵,點(diǎn)擊Check,然后看下圖,可以找到請求需要的參數。
# 構建請求頭
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
'Host': 'www.santostang.com'
}
r = requests.get("http://www.santostang.com/", headers=headers)
print("響應狀態(tài)碼:", r.status_code)
響應狀態(tài)碼: 200
3. 發(fā)送 POST 請求
除了get請求之外,還需要以編碼格式的形式發(fā)送一些數據,有些網(wǎng)站需要登錄才能訪(fǎng)問(wèn),所以需要使用POST請求,我們還需要傳遞一個(gè)字典到請求中的數據參數。發(fā)出請求時(shí),此數據字典將自動(dòng)編碼到表單中。
key_dict = {'key1': 'value1', 'key2': 'value2'}
r = requests.post('http://httpbin.org/post', data=key_dict)
print(r.text)
4. 超時(shí)
有時(shí)候我們發(fā)送一個(gè)請求,服務(wù)器會(huì )很長(cháng)時(shí)間沒(méi)有響應,爬蟲(chóng)會(huì )一直等待。如果爬蟲(chóng)程序執行不順暢,可以使用requests在超時(shí)參數設置的秒數后停止等待響應。我們將其設置為 0.001 秒。
url = "http://www.santostang.com/"
r = requests.get(url, timeout=0.001)
ConnectTimeout: HTTPConnectionPool(host='www.santostang.com', port=80): Max retries exceeded with url: / (Caused by ConnectTimeoutError(, 'Connection to www.santostang.com timed out. (connect timeout=0.001)'))
四、項目實(shí)例
爬豆瓣前250名電影名
# 導入包
import requests
from bs4 import BeautifulSoup
# 發(fā)送請求,獲取響應內容
def get_movies():
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
'Host': 'movie.douban.com'
}
movie_list = []
for i in range(0, 10):
# 構建url,發(fā)送請求
url = "https://movie.douban.com/top250?start={}" + str(i * 25)
r = requests.get(url, headers=headers, timeout=10)
print(str(i + 1), "頁(yè)面響應狀態(tài):", r.status_code)
# 解析網(wǎng)頁(yè)
soup = BeautifulSoup(r.text, "lxml")
div_list = soup.find_all('div', class_= 'hd')
for each in div_list:
movie = each.a.span.text.strip()
movie_list.append(movie)
return movie_list
movies = get_movies()
print(movies)
總結:本篇筆記主要學(xué)習爬取靜態(tài)網(wǎng)頁(yè)時(shí)如何發(fā)送請求,包括url參數的設置方法。最后,實(shí)現一個(gè)小案例。 查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(靜態(tài)網(wǎng)頁(yè)抓取的介紹及應用方法-上海怡健醫學(xué))
一、靜態(tài)網(wǎng)頁(yè)抓取簡(jiǎn)介
靜態(tài)網(wǎng)頁(yè)是純 HTML 格式的網(wǎng)頁(yè)。早期的 網(wǎng)站 是由靜態(tài)網(wǎng)頁(yè)組成的。靜態(tài)網(wǎng)頁(yè)的數據更容易獲取,因為我們需要的代碼隱藏在 HTML 代碼中。為了抓取靜態(tài)網(wǎng)頁(yè),我們使用 requests 庫。Requests 允許您輕松發(fā)送 HTTP 請求。該庫使用簡(jiǎn)單,功能齊全。
二、獲取響應內容
獲取響應內容的過(guò)程相當于使用瀏覽器的過(guò)程。我們在瀏覽器中輸入URL,瀏覽器會(huì )向服務(wù)器請求內容,服務(wù)器會(huì )返回HTML代碼,瀏覽器會(huì )自動(dòng)解析代碼。我們的爬蟲(chóng)和瀏覽器發(fā)送請求的過(guò)程是一樣的,都是通過(guò)requests向瀏覽器發(fā)送請求,獲取請求內容。
import requests
# 發(fā)送請求,獲取服務(wù)器響應內容
r = requests.get("http://www.santostang.com/")
print("文本編碼:", r.encoding)
print("響應狀態(tài)碼:", r.status_code)
print("字符串方式的響應體:", r.text)

三、自定義請求
我們使用requets發(fā)送請求獲取數據,但是有些網(wǎng)頁(yè)需要設置參數來(lái)獲取需要的數據,那么我們設置這些參數
1. 傳遞 URL 參數
有時(shí)我們需要在 URL 中添加一些參數來(lái)請求特定的數據。URL中加參數的形式是在問(wèn)號之后,以key/value的形式放在URL中。我們可以將參數保存在字典中,并將參數構建到 URL 中。
key_dict = {'key1': 'value1', 'key2': 'value2'}
r = requests.get('http://httpbin.org/get', params=key_dict)
print("URL已經(jīng)正確編碼:", r.url)
print("字符串方式的響應體:\n", r.text)

2. 自定義請求標頭
請求標頭是 Headers 部分,標頭提供有關(guān)請求、響應或其他發(fā)送請求的實(shí)體的信息。簡(jiǎn)單來(lái)說(shuō)就是模擬瀏覽器的作用,所以請求頭是必須要學(xué)習的,那么我們如何構造請求頭,我們使用谷歌瀏覽器??梢渣c(diǎn)擊鼠標右鍵,點(diǎn)擊Check,然后看下圖,可以找到請求需要的參數。

# 構建請求頭
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
'Host': 'www.santostang.com'
}
r = requests.get("http://www.santostang.com/", headers=headers)
print("響應狀態(tài)碼:", r.status_code)
響應狀態(tài)碼: 200
3. 發(fā)送 POST 請求
除了get請求之外,還需要以編碼格式的形式發(fā)送一些數據,有些網(wǎng)站需要登錄才能訪(fǎng)問(wèn),所以需要使用POST請求,我們還需要傳遞一個(gè)字典到請求中的數據參數。發(fā)出請求時(shí),此數據字典將自動(dòng)編碼到表單中。
key_dict = {'key1': 'value1', 'key2': 'value2'}
r = requests.post('http://httpbin.org/post', data=key_dict)
print(r.text)

4. 超時(shí)
有時(shí)候我們發(fā)送一個(gè)請求,服務(wù)器會(huì )很長(cháng)時(shí)間沒(méi)有響應,爬蟲(chóng)會(huì )一直等待。如果爬蟲(chóng)程序執行不順暢,可以使用requests在超時(shí)參數設置的秒數后停止等待響應。我們將其設置為 0.001 秒。
url = "http://www.santostang.com/"
r = requests.get(url, timeout=0.001)
ConnectTimeout: HTTPConnectionPool(host='www.santostang.com', port=80): Max retries exceeded with url: / (Caused by ConnectTimeoutError(, 'Connection to www.santostang.com timed out. (connect timeout=0.001)'))
四、項目實(shí)例
爬豆瓣前250名電影名
# 導入包
import requests
from bs4 import BeautifulSoup
# 發(fā)送請求,獲取響應內容
def get_movies():
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
'Host': 'movie.douban.com'
}
movie_list = []
for i in range(0, 10):
# 構建url,發(fā)送請求
url = "https://movie.douban.com/top250?start={}" + str(i * 25)
r = requests.get(url, headers=headers, timeout=10)
print(str(i + 1), "頁(yè)面響應狀態(tài):", r.status_code)
# 解析網(wǎng)頁(yè)
soup = BeautifulSoup(r.text, "lxml")
div_list = soup.find_all('div', class_= 'hd')
for each in div_list:
movie = each.a.span.text.strip()
movie_list.append(movie)
return movie_list
movies = get_movies()
print(movies)

總結:本篇筆記主要學(xué)習爬取靜態(tài)網(wǎng)頁(yè)時(shí)如何發(fā)送請求,包括url參數的設置方法。最后,實(shí)現一個(gè)小案例。
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(蘇寧百萬(wàn)級商品爬取索引講解4.1代碼講解(組圖))
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 68 次瀏覽 ? 2022-03-02 06:00
阿里云>云棲社區>主題地圖>C>c爬網(wǎng)數據庫
推薦活動(dòng):
更多優(yōu)惠>
當前話(huà)題:c爬網(wǎng)數據庫添加到采集夾
相關(guān)話(huà)題:
c 爬網(wǎng)數據庫相關(guān)博客查看更多博客
云數據庫產(chǎn)品概述
作者:阿里云官網(wǎng)
ApsaraDB是穩定、可靠、可彈性擴展的在線(xiàn)數據庫服務(wù)產(chǎn)品的總稱(chēng)??梢暂p松運維全球90%以上的主流開(kāi)源和商業(yè)數據庫(MySQL、SQL Server、Redis等),同時(shí)為POLARDB提供6倍以上開(kāi)源數據庫的性能和開(kāi)源的價(jià)格源數據庫和自研的具有數百TB數據實(shí)時(shí)計算能力的HybridDB數據庫等,并擁有容災、備份、恢復、監控、遷移等一整套解決方案。
現在查看
圖數據庫綜述及Nebula在圖數據庫設計中的實(shí)踐
作者:NebulaGraph2433 瀏覽評論:02年前
Nebula Graph:一個(gè)開(kāi)源的分布式圖數據庫。Nebula Graph 作為唯一可以存儲萬(wàn)億級節點(diǎn)和帶屬性邊的在線(xiàn)圖數據庫,不僅可以滿(mǎn)足高并發(fā)場(chǎng)景下毫秒級的低延遲查詢(xún)需求,還可以實(shí)現高服務(wù)可用性和數據安全性。第三屆nMeetup(nMeet
閱讀全文
Python爬蟲(chóng)入門(mén)教程3-100 數據爬取
作者:夢(mèng)橡皮擦 1100人評論:02年前
1.湄公河網(wǎng)絡(luò )資料-介紹從今天開(kāi)始,我們嘗試使用2篇博客的內容,得到一個(gè)名為“湄公河網(wǎng)絡(luò )”的網(wǎng)站網(wǎng)址:這個(gè)網(wǎng)站我分析了一下,圖片我們想抓取的是在以下網(wǎng)址
閱讀全文
蘇寧百萬(wàn)級商品爬取簡(jiǎn)述
作者:HappyFox1045 人瀏覽評論:03年前
代碼下載鏈接 蘇寧萬(wàn)級商品爬蟲(chóng)目錄思路講解分類(lèi)爬取思路講解分類(lèi)頁(yè)面爬取商品爬取3.1思路講解商品爬取13.2思路講解商品爬取23.3 代碼解釋產(chǎn)品爬取索引解釋4.1 代碼解釋索引建立4.2 代碼解釋索引查詢(xún)語(yǔ)句本部門(mén)
閱讀全文
一個(gè)存儲大量爬蟲(chóng)數據的數據庫,懂嗎?
作者:fesoncn3336 瀏覽人數:03年前
“當然,不是所有的數據都適合” 在學(xué)習爬蟲(chóng)的過(guò)程中,遇到了很多坑。你今天可能會(huì )遇到這個(gè)坑,隨著(zhù)爬取數據量的增加,以及爬取的網(wǎng)站數據字段的變化,以往爬蟲(chóng)上手的方法的局限性可能會(huì )突然增加。什么是突增法?介紹示例當開(kāi)始使用爬蟲(chóng)時(shí),
閱讀全文
Python3中如何解決亂碼爬取網(wǎng)頁(yè)信息?(更新:已解決)
作者:大連瓦工2696 瀏覽評論:04年前
更新:亂碼問(wèn)題已解決。把下面代碼中的紅色部分改成下面這樣,這樣就不會(huì )有個(gè)別職位信息出現亂碼了。soup2 = BeautifulSoup(wbdata2, 'html.parser',from_encoding="GBK") 還有:創(chuàng )建微信公眾號
閱讀全文
Python爬蟲(chóng):用BeautifulSoup爬取NBA數據
作者:夜李2725查看評論:04年前
爬蟲(chóng)的主要目的是過(guò)濾掉網(wǎng)頁(yè)中的無(wú)用信息,抓取網(wǎng)頁(yè)中的有用信息。一般的爬蟲(chóng)架構是:在使用python爬蟲(chóng)之前,必須對網(wǎng)頁(yè)的結構知識有一定的了解,比如網(wǎng)頁(yè)的標簽、網(wǎng)頁(yè)的語(yǔ)言等知識,推薦爬之前去W3School:W3school鏈接了解一些工具:1
閱讀全文
【Python爬蟲(chóng)2】網(wǎng)頁(yè)數據提取
作者:wu_being1266 瀏覽評論:05年前
提取數據方法 1 正則表達式 2 流行BeautifulSoup 模塊 3 強大的Lxml 模塊性能對比 添加鏈接爬蟲(chóng)的爬取回調 1 回調函數1 2 回調函數2 3 復用上一章的鏈接爬蟲(chóng)代碼 我們讓這個(gè)爬蟲(chóng)比較從每一個(gè)中提取一些數據網(wǎng)頁(yè),然后實(shí)現某些東西,這種做法也
閱讀全文
php爬蟲(chóng):知乎用戶(hù)數據爬取分析
作者:cuixiaozhuai2345 瀏覽評論:05年前
背景說(shuō)明:小燕使用PHP的curl寫(xiě)的爬蟲(chóng)實(shí)驗爬取知乎5w個(gè)用戶(hù)的基本信息;同時(shí)對爬取的數據進(jìn)行了簡(jiǎn)單的分析和展示。演示地址是php的蜘蛛代碼和用戶(hù)儀表盤(pán)的顯示代碼。整理好后上傳到github,在個(gè)人博客和公眾號更新代碼庫。
閱讀全文
c爬網(wǎng)數據庫相關(guān)問(wèn)答
基礎語(yǔ)言問(wèn)題-Python
作者:薯片醬 55293 瀏覽評論:494年前
#基礎語(yǔ)言100題——Python#最近軟件界有一句很流行的一句話(huà),“人生苦短,快用Python”,這句話(huà)說(shuō)明了Python的特點(diǎn),那就是快。當然,這個(gè)快并不代表 Python 跑得快,畢竟它是一種腳本語(yǔ)言,不管它有多快,而是 C 語(yǔ)言和 C++ 等底層語(yǔ)言,這里的快是指使用 Python
閱讀全文 查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(蘇寧百萬(wàn)級商品爬取索引講解4.1代碼講解(組圖))
阿里云>云棲社區>主題地圖>C>c爬網(wǎng)數據庫

推薦活動(dòng):
更多優(yōu)惠>
當前話(huà)題:c爬網(wǎng)數據庫添加到采集夾
相關(guān)話(huà)題:
c 爬網(wǎng)數據庫相關(guān)博客查看更多博客
云數據庫產(chǎn)品概述


作者:阿里云官網(wǎng)
ApsaraDB是穩定、可靠、可彈性擴展的在線(xiàn)數據庫服務(wù)產(chǎn)品的總稱(chēng)??梢暂p松運維全球90%以上的主流開(kāi)源和商業(yè)數據庫(MySQL、SQL Server、Redis等),同時(shí)為POLARDB提供6倍以上開(kāi)源數據庫的性能和開(kāi)源的價(jià)格源數據庫和自研的具有數百TB數據實(shí)時(shí)計算能力的HybridDB數據庫等,并擁有容災、備份、恢復、監控、遷移等一整套解決方案。
現在查看
圖數據庫綜述及Nebula在圖數據庫設計中的實(shí)踐

作者:NebulaGraph2433 瀏覽評論:02年前
Nebula Graph:一個(gè)開(kāi)源的分布式圖數據庫。Nebula Graph 作為唯一可以存儲萬(wàn)億級節點(diǎn)和帶屬性邊的在線(xiàn)圖數據庫,不僅可以滿(mǎn)足高并發(fā)場(chǎng)景下毫秒級的低延遲查詢(xún)需求,還可以實(shí)現高服務(wù)可用性和數據安全性。第三屆nMeetup(nMeet
閱讀全文
Python爬蟲(chóng)入門(mén)教程3-100 數據爬取

作者:夢(mèng)橡皮擦 1100人評論:02年前
1.湄公河網(wǎng)絡(luò )資料-介紹從今天開(kāi)始,我們嘗試使用2篇博客的內容,得到一個(gè)名為“湄公河網(wǎng)絡(luò )”的網(wǎng)站網(wǎng)址:這個(gè)網(wǎng)站我分析了一下,圖片我們想抓取的是在以下網(wǎng)址
閱讀全文
蘇寧百萬(wàn)級商品爬取簡(jiǎn)述

作者:HappyFox1045 人瀏覽評論:03年前
代碼下載鏈接 蘇寧萬(wàn)級商品爬蟲(chóng)目錄思路講解分類(lèi)爬取思路講解分類(lèi)頁(yè)面爬取商品爬取3.1思路講解商品爬取13.2思路講解商品爬取23.3 代碼解釋產(chǎn)品爬取索引解釋4.1 代碼解釋索引建立4.2 代碼解釋索引查詢(xún)語(yǔ)句本部門(mén)
閱讀全文
一個(gè)存儲大量爬蟲(chóng)數據的數據庫,懂嗎?

作者:fesoncn3336 瀏覽人數:03年前
“當然,不是所有的數據都適合” 在學(xué)習爬蟲(chóng)的過(guò)程中,遇到了很多坑。你今天可能會(huì )遇到這個(gè)坑,隨著(zhù)爬取數據量的增加,以及爬取的網(wǎng)站數據字段的變化,以往爬蟲(chóng)上手的方法的局限性可能會(huì )突然增加。什么是突增法?介紹示例當開(kāi)始使用爬蟲(chóng)時(shí),
閱讀全文
Python3中如何解決亂碼爬取網(wǎng)頁(yè)信息?(更新:已解決)

作者:大連瓦工2696 瀏覽評論:04年前
更新:亂碼問(wèn)題已解決。把下面代碼中的紅色部分改成下面這樣,這樣就不會(huì )有個(gè)別職位信息出現亂碼了。soup2 = BeautifulSoup(wbdata2, 'html.parser',from_encoding="GBK") 還有:創(chuàng )建微信公眾號
閱讀全文
Python爬蟲(chóng):用BeautifulSoup爬取NBA數據

作者:夜李2725查看評論:04年前
爬蟲(chóng)的主要目的是過(guò)濾掉網(wǎng)頁(yè)中的無(wú)用信息,抓取網(wǎng)頁(yè)中的有用信息。一般的爬蟲(chóng)架構是:在使用python爬蟲(chóng)之前,必須對網(wǎng)頁(yè)的結構知識有一定的了解,比如網(wǎng)頁(yè)的標簽、網(wǎng)頁(yè)的語(yǔ)言等知識,推薦爬之前去W3School:W3school鏈接了解一些工具:1
閱讀全文
【Python爬蟲(chóng)2】網(wǎng)頁(yè)數據提取

作者:wu_being1266 瀏覽評論:05年前
提取數據方法 1 正則表達式 2 流行BeautifulSoup 模塊 3 強大的Lxml 模塊性能對比 添加鏈接爬蟲(chóng)的爬取回調 1 回調函數1 2 回調函數2 3 復用上一章的鏈接爬蟲(chóng)代碼 我們讓這個(gè)爬蟲(chóng)比較從每一個(gè)中提取一些數據網(wǎng)頁(yè),然后實(shí)現某些東西,這種做法也
閱讀全文
php爬蟲(chóng):知乎用戶(hù)數據爬取分析

作者:cuixiaozhuai2345 瀏覽評論:05年前
背景說(shuō)明:小燕使用PHP的curl寫(xiě)的爬蟲(chóng)實(shí)驗爬取知乎5w個(gè)用戶(hù)的基本信息;同時(shí)對爬取的數據進(jìn)行了簡(jiǎn)單的分析和展示。演示地址是php的蜘蛛代碼和用戶(hù)儀表盤(pán)的顯示代碼。整理好后上傳到github,在個(gè)人博客和公眾號更新代碼庫。
閱讀全文
c爬網(wǎng)數據庫相關(guān)問(wèn)答
基礎語(yǔ)言問(wèn)題-Python

作者:薯片醬 55293 瀏覽評論:494年前
#基礎語(yǔ)言100題——Python#最近軟件界有一句很流行的一句話(huà),“人生苦短,快用Python”,這句話(huà)說(shuō)明了Python的特點(diǎn),那就是快。當然,這個(gè)快并不代表 Python 跑得快,畢竟它是一種腳本語(yǔ)言,不管它有多快,而是 C 語(yǔ)言和 C++ 等底層語(yǔ)言,這里的快是指使用 Python
閱讀全文
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(一下如何用Excel快速抓取網(wǎng)頁(yè)數據(圖)的技巧)
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 67 次瀏覽 ? 2022-02-28 23:02
網(wǎng)站 上的數據源是我們統計分析的重要信息來(lái)源。我們生活中經(jīng)常聽(tīng)到一個(gè)詞叫“爬蟲(chóng)”,它可以快速爬取網(wǎng)頁(yè)上的數據,這對于數據分析相關(guān)的工作來(lái)說(shuō)是極其重要的,也是必備的技能之一。但是,大多數爬蟲(chóng)都需要編程知識,普通人很難上手。今天我將向您展示如何使用 Excel 快速抓取 Web 數據。
1、首先打開(kāi)要抓取數據的網(wǎng)站,復制網(wǎng)站的地址。
2、創(chuàng )建一個(gè)新的 Excel 工作簿,然后單擊“數據”菜單 >“獲取外部數據”選項卡中的“來(lái)自 網(wǎng)站”選項。
在彈出的“New Web Query”對話(huà)框中,在地址欄中輸入要捕獲的網(wǎng)站的地址,點(diǎn)擊“Go”
點(diǎn)擊黃色導入箭頭,選擇要抓取的部分,如圖。點(diǎn)擊導入。
3、選擇存儲數據的位置(默認選中的單元格),點(diǎn)擊確定。一般建議將數據存儲在“A1”單元格中。
4、如果想讓Excel工作簿數據根據網(wǎng)站的數據實(shí)時(shí)自動(dòng)更新,那么我們需要在“屬性”中進(jìn)行設置??梢栽O置“允許后臺刷新”、“刷新頻率”、“打開(kāi)文件時(shí)刷新數據”等。
拿到數據之后,就需要對數據進(jìn)行處理,而處理數據是比較重要的一環(huán)。更多數據處理技巧,請關(guān)注我!
鄭重聲明:本文版權歸原作者所有,轉載文章僅出于傳播更多信息之目的。如果作者信息標注有誤,請盡快聯(lián)系我們修改或刪除,謝謝。 查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(一下如何用Excel快速抓取網(wǎng)頁(yè)數據(圖)的技巧)
網(wǎng)站 上的數據源是我們統計分析的重要信息來(lái)源。我們生活中經(jīng)常聽(tīng)到一個(gè)詞叫“爬蟲(chóng)”,它可以快速爬取網(wǎng)頁(yè)上的數據,這對于數據分析相關(guān)的工作來(lái)說(shuō)是極其重要的,也是必備的技能之一。但是,大多數爬蟲(chóng)都需要編程知識,普通人很難上手。今天我將向您展示如何使用 Excel 快速抓取 Web 數據。
1、首先打開(kāi)要抓取數據的網(wǎng)站,復制網(wǎng)站的地址。

2、創(chuàng )建一個(gè)新的 Excel 工作簿,然后單擊“數據”菜單 >“獲取外部數據”選項卡中的“來(lái)自 網(wǎng)站”選項。

在彈出的“New Web Query”對話(huà)框中,在地址欄中輸入要捕獲的網(wǎng)站的地址,點(diǎn)擊“Go”

點(diǎn)擊黃色導入箭頭,選擇要抓取的部分,如圖。點(diǎn)擊導入。

3、選擇存儲數據的位置(默認選中的單元格),點(diǎn)擊確定。一般建議將數據存儲在“A1”單元格中。



4、如果想讓Excel工作簿數據根據網(wǎng)站的數據實(shí)時(shí)自動(dòng)更新,那么我們需要在“屬性”中進(jìn)行設置??梢栽O置“允許后臺刷新”、“刷新頻率”、“打開(kāi)文件時(shí)刷新數據”等。

拿到數據之后,就需要對數據進(jìn)行處理,而處理數據是比較重要的一環(huán)。更多數據處理技巧,請關(guān)注我!
鄭重聲明:本文版權歸原作者所有,轉載文章僅出于傳播更多信息之目的。如果作者信息標注有誤,請盡快聯(lián)系我們修改或刪除,謝謝。
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(通用爬蟲(chóng)如何獲取一個(gè)新網(wǎng)站的工作流程及解決方法)
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 60 次瀏覽 ? 2022-02-28 22:20
萬(wàn)能爬蟲(chóng)是一個(gè)自動(dòng)提取網(wǎng)頁(yè)的程序。它從互聯(lián)網(wǎng)上為搜索引擎下載網(wǎng)頁(yè),是搜索引擎的重要組成部分。
萬(wàn)能爬蟲(chóng)從一個(gè)或多個(gè)初始網(wǎng)頁(yè)的URL開(kāi)始,獲取初始網(wǎng)頁(yè)上的URL。在爬取網(wǎng)頁(yè)的過(guò)程中,不斷地從當前頁(yè)面中提取新的 URL 并放入隊列中,直到滿(mǎn)足系統的某個(gè)停止條件。圖1展示了一般爬蟲(chóng)爬取網(wǎng)頁(yè)的過(guò)程。
通用網(wǎng)絡(luò )爬蟲(chóng)從 Internet 采集網(wǎng)頁(yè)和 采集 信息。這些網(wǎng)頁(yè)信息用于為搜索引擎的索引提供支持。它決定了整個(gè)引擎系統的內容是否豐富,信息是否及時(shí),從而決定其性能的好壞。直接影響搜索引擎的效果。
但是用于搜索引擎的通用爬蟲(chóng)的爬取行為需要遵守一定的規則,遵守一些命令或文件的內容,比如標有nofollow的鏈接,或者Robots協(xié)議(后面會(huì )有相關(guān)介紹) .
了解更多:搜索引擎工作流程
搜索引擎是通用爬蟲(chóng)最重要的應用領(lǐng)域,也是大家使用網(wǎng)絡(luò )功能時(shí)最大的助手。接下來(lái)介紹一下搜索引擎的工作流程,主要包括以下幾個(gè)步驟。
1. 爬網(wǎng)
搜索引擎使用通用爬蟲(chóng)來(lái)爬取網(wǎng)頁(yè)?;竟ぷ髁鞒膛c其他爬蟲(chóng)類(lèi)似。一般步驟如下:
(1)先選擇一部分種子URL,將這些URL放入待爬取的URL隊列中;
(2)取出要爬取的URL,解析DNS得到主機的IP,下載該URL對應的網(wǎng)頁(yè),存入下載的網(wǎng)頁(yè)庫,將這些URL放入已爬取的URL隊列中.
(3)分析已經(jīng)爬取的URL隊列中的URL,分析其中的其他URL,將這些URL放入待爬取的URL隊列中,從而進(jìn)入下一個(gè)循環(huán)。
那么搜索引擎如何獲得一個(gè)新的網(wǎng)站 URL呢?
?。?)新增網(wǎng)站主動(dòng)向搜索引擎提交網(wǎng)址:(如百度)。
?。?)在其他網(wǎng)站上設置新的網(wǎng)站外部鏈接(盡量在搜索引擎爬蟲(chóng)范圍內)。
?。?)搜索引擎與DNS解析服務(wù)商(如DNSPod等)合作,新的網(wǎng)站域名會(huì )被快速抓取。
2. 數據存儲
搜索引擎通過(guò)爬蟲(chóng)爬取網(wǎng)頁(yè)后,將數據存儲在原創(chuàng )頁(yè)面數據庫中。頁(yè)面數據與用戶(hù)瀏覽器獲取的 HTML 完全相同。
搜索引擎蜘蛛在抓取頁(yè)面時(shí)也會(huì )進(jìn)行某些重復內容檢測。一旦他們遇到大量抄襲、采集 或復制訪(fǎng)問(wèn)權重低的網(wǎng)站 上的內容,很有可能不再使用。爬行。
3. 預處理
搜索引擎將從爬蟲(chóng)中抓取回頁(yè)面并執行各種預處理步驟,包括:
· 提取文本
·中文分詞 查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(通用爬蟲(chóng)如何獲取一個(gè)新網(wǎng)站的工作流程及解決方法)
萬(wàn)能爬蟲(chóng)是一個(gè)自動(dòng)提取網(wǎng)頁(yè)的程序。它從互聯(lián)網(wǎng)上為搜索引擎下載網(wǎng)頁(yè),是搜索引擎的重要組成部分。
萬(wàn)能爬蟲(chóng)從一個(gè)或多個(gè)初始網(wǎng)頁(yè)的URL開(kāi)始,獲取初始網(wǎng)頁(yè)上的URL。在爬取網(wǎng)頁(yè)的過(guò)程中,不斷地從當前頁(yè)面中提取新的 URL 并放入隊列中,直到滿(mǎn)足系統的某個(gè)停止條件。圖1展示了一般爬蟲(chóng)爬取網(wǎng)頁(yè)的過(guò)程。

通用網(wǎng)絡(luò )爬蟲(chóng)從 Internet 采集網(wǎng)頁(yè)和 采集 信息。這些網(wǎng)頁(yè)信息用于為搜索引擎的索引提供支持。它決定了整個(gè)引擎系統的內容是否豐富,信息是否及時(shí),從而決定其性能的好壞。直接影響搜索引擎的效果。
但是用于搜索引擎的通用爬蟲(chóng)的爬取行為需要遵守一定的規則,遵守一些命令或文件的內容,比如標有nofollow的鏈接,或者Robots協(xié)議(后面會(huì )有相關(guān)介紹) .
了解更多:搜索引擎工作流程
搜索引擎是通用爬蟲(chóng)最重要的應用領(lǐng)域,也是大家使用網(wǎng)絡(luò )功能時(shí)最大的助手。接下來(lái)介紹一下搜索引擎的工作流程,主要包括以下幾個(gè)步驟。
1. 爬網(wǎng)
搜索引擎使用通用爬蟲(chóng)來(lái)爬取網(wǎng)頁(yè)?;竟ぷ髁鞒膛c其他爬蟲(chóng)類(lèi)似。一般步驟如下:
(1)先選擇一部分種子URL,將這些URL放入待爬取的URL隊列中;
(2)取出要爬取的URL,解析DNS得到主機的IP,下載該URL對應的網(wǎng)頁(yè),存入下載的網(wǎng)頁(yè)庫,將這些URL放入已爬取的URL隊列中.
(3)分析已經(jīng)爬取的URL隊列中的URL,分析其中的其他URL,將這些URL放入待爬取的URL隊列中,從而進(jìn)入下一個(gè)循環(huán)。
那么搜索引擎如何獲得一個(gè)新的網(wǎng)站 URL呢?
?。?)新增網(wǎng)站主動(dòng)向搜索引擎提交網(wǎng)址:(如百度)。
?。?)在其他網(wǎng)站上設置新的網(wǎng)站外部鏈接(盡量在搜索引擎爬蟲(chóng)范圍內)。
?。?)搜索引擎與DNS解析服務(wù)商(如DNSPod等)合作,新的網(wǎng)站域名會(huì )被快速抓取。
2. 數據存儲
搜索引擎通過(guò)爬蟲(chóng)爬取網(wǎng)頁(yè)后,將數據存儲在原創(chuàng )頁(yè)面數據庫中。頁(yè)面數據與用戶(hù)瀏覽器獲取的 HTML 完全相同。
搜索引擎蜘蛛在抓取頁(yè)面時(shí)也會(huì )進(jìn)行某些重復內容檢測。一旦他們遇到大量抄襲、采集 或復制訪(fǎng)問(wèn)權重低的網(wǎng)站 上的內容,很有可能不再使用。爬行。
3. 預處理
搜索引擎將從爬蟲(chóng)中抓取回頁(yè)面并執行各種預處理步驟,包括:
· 提取文本
·中文分詞
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(【】一個(gè)一級-spider頁(yè)面())
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 82 次瀏覽 ? 2022-02-28 22:18
前言
在研究數據之前,我零零散散地寫(xiě)了一些數據爬蟲(chóng),但我寫(xiě)的比較隨意。很多地方現在看起來(lái)不太合理。這次比較空閑,本來(lái)想重構之前的項目。
后來(lái)利用這個(gè)周末簡(jiǎn)單的重新寫(xiě)了一個(gè)項目,就是這個(gè)項目guwen-spider。目前這種爬蟲(chóng)還是比較簡(jiǎn)單的類(lèi)型,直接爬取頁(yè)面,然后從頁(yè)面中提取數據,將數據保存到數據庫中。
通過(guò)和我之前寫(xiě)的比較,我認為難點(diǎn)在于整個(gè)程序的健壯性和相應的容錯機制。其實(shí)昨天在寫(xiě)代碼的過(guò)程中就體現出來(lái)了。真正的主代碼其實(shí)寫(xiě)得很快,大部分時(shí)間都花在了
做穩定性調試,尋求更合理的方式處理數據與過(guò)程控制的關(guān)系。
背景
項目背景是抓取一級頁(yè)面,即目錄列表,點(diǎn)擊目錄進(jìn)入章節和長(cháng)度列表,點(diǎn)擊章節或長(cháng)度進(jìn)入具體內容頁(yè)面。
概述
本項目github地址:guwen-spider(PS:***臉上有彩蛋~~逃跑
項目技術(shù)細節
項目中大量使用了 ES7 的 async 函數,更直觀(guān)的反映了程序的流程。為方便起見(jiàn),在遍歷數據的過(guò)程中直接使用了眾所周知的 async 庫,所以難免會(huì )用到回調 promise。因為數據處理發(fā)生在回調函數中,難免會(huì )遇到一些數據傳輸問(wèn)題。,其實(shí)可以直接用ES7的async await寫(xiě)一個(gè)方法來(lái)實(shí)現同樣的功能。其實(shí)這里最好的部分是使用Class的靜態(tài)方法來(lái)封裝數據庫的操作。顧名思義,靜態(tài)方法就像原型一樣,不占用額外空間。
該項目主要使用
ES7 的 async await 協(xié)程做異步邏輯處理。使用 npm 的異步庫進(jìn)行循環(huán)遍歷和并發(fā)請求操作。使用log4js做日志處理,使用cheerio處理dom操作。使用 mongoose 連接 mongoDB 進(jìn)行數據存儲和操作。
目錄結構
項目實(shí)現計劃分析
條目是典型的多級爬取案例,目前只有書(shū)單、圖書(shū)條目對應的章節列表、章節鏈接對應的內容三個(gè)等級。有兩種方法可以獲取這樣的結構。一種是直接從外層抓取到內層,然后在內層抓取后執行下一個(gè)外層,另一種是先將外層保存到數據庫中。,然后根據外層爬取所有內章的鏈接,再次保存,然后從數據庫中查詢(xún)對應的鏈接單元爬取內容。這兩種方案各有優(yōu)缺點(diǎn)。其實(shí)這兩種方法我都試過(guò)了。后者有一個(gè)優(yōu)勢,因為三個(gè)層次是分開(kāi)捕獲的,以便盡可能多地保存相關(guān)章節。數據。你可以想象,如果按照正常邏輯使用前者
遍歷一級目錄抓取對應的二級章節目錄,然后遍歷章節列表抓取內容。當三級內容單元被爬取,需要保存的時(shí)候,如果需要大量的一級目錄信息,那么這些分層數據之間的數據傳輸,想想應該是比較復雜的事情。因此,單獨保存數據在一定程度上避免了不必要的復雜數據傳輸。
目前我們已經(jīng)考慮到,我們想要采集的古籍數量并不是很多,涵蓋各種經(jīng)文和歷史的古籍也只有大約180本。它和章節內容本身是一個(gè)很小的數據,即一個(gè)集合中有180條文檔記錄。這180本書(shū)的所有章節共有16000個(gè)章節,對應的需要訪(fǎng)問(wèn)16000個(gè)頁(yè)面才能爬取到相應的內容。所以選擇第二個(gè)應該是合理的。
項目實(shí)現
主流程有bookListInit、chapterListInit、contentListInit三個(gè)方法,分別是抓取圖書(shū)目錄、章節列表、圖書(shū)內容的方法,都是公開(kāi)暴露的初始化方法。通過(guò) async 可以控制這三種方法的運行過(guò)程。取書(shū)目錄后,將數據存入數據庫,然后將執行結果返回給主程序。如果操作成功,主程序會(huì )根據書(shū)單執行章節列表的獲取。,以同樣的方式爬取書(shū)籍的內容。
項目主入口
/**??*?爬蟲(chóng)抓取主入口??*/?const?start?=?async()?=>?{?????let?booklistRes?=?await?bookListInit();?????if?(!booklistRes)?{?????????logger.warn('書(shū)籍列表抓取出錯,程序終止...');?????????return;?????}?????logger.info('書(shū)籍列表抓取成功,現在進(jìn)行書(shū)籍章節抓取...');??????let?chapterlistRes?=?await?chapterListInit();?????if?(!chapterlistRes)?{?????????logger.warn('書(shū)籍章節列表抓取出錯,程序終止...');?????????return;?????}?????logger.info('書(shū)籍章節列表抓取成功,現在進(jìn)行書(shū)籍內容抓取...');??????let?contentListRes?=?await?contentListInit();?????if?(!contentListRes)?{?????????logger.warn('書(shū)籍章節內容抓取出錯,程序終止...');?????????return;?????}?????logger.info('書(shū)籍內容抓取成功');?}?//?開(kāi)始入口?if?(typeof?bookListInit?===?'function'?&&?typeof?chapterListInit?===?'function')?{?????//?開(kāi)始抓取?????start();?}?
介紹了 bookListInit、chapterListInit、contentListInit 三個(gè)方法
書(shū)單.js
/**??*?初始化入口??*/?const?chapterListInit?=?async()?=>?{?????const?list?=?await?bookHelper.getBookList(bookListModel);?????if?(!list)?{?????????logger.error('初始化查詢(xún)書(shū)籍目錄失敗');?????}?????logger.info('開(kāi)始抓取書(shū)籍章節列表,書(shū)籍目錄共:'?+?list.length?+?'條');?????let?res?=?await?asyncGetChapter(list);?????return?res;?};?
章節列表.js
/**??*?初始化入口??*/?const?contentListInit?=?async()?=>?{?????//獲取書(shū)籍列表?????const?list?=?await?bookHelper.getBookLi(bookListModel);?????if?(!list)?{?????????logger.error('初始化查詢(xún)書(shū)籍目錄失敗');?????????return;?????}?????const?res?=?await?mapBookList(list);?????if?(!res)?{?????????logger.error('抓取章節信息,調用?getCurBookSectionList()?進(jìn)行串行遍歷操作,執行完成回調出錯,錯誤信息已打印,請查看日志!');?????????return;?????}?????return?res;?}?
關(guān)于內容抓取的思考
圖書(shū)目錄抓取的邏輯其實(shí)很簡(jiǎn)單。只需要使用 async.mapLimit 做一次遍歷就可以保存數據,但是我們保存內容的簡(jiǎn)化邏輯其實(shí)就是遍歷章節列表,抓取鏈接中的內容。但實(shí)際情況是,鏈接數多達數萬(wàn)。從內存使用的角度來(lái)看,我們不能將它們全部保存到一個(gè)數組中然后遍歷它,所以我們需要將內容捕獲統一起來(lái)。
常見(jiàn)的遍歷方式是每次查詢(xún)一定數量進(jìn)行爬取。缺點(diǎn)是分類(lèi)只用了一定的量,數據之間沒(méi)有關(guān)聯(lián),分批插入。如果有錯誤,在容錯方面會(huì )出現一些小問(wèn)題,我們認為單獨保存一本書(shū)作為集合會(huì )有問(wèn)題。因此,我們采用第二種方法來(lái)捕獲和保存圖書(shū)單元中的內容。
這里使用了方法async.mapLimit(list, 1, (series, callback) => {}) 進(jìn)行遍歷,不可避免地用到了回調,感覺(jué)很惡心。async.mapLimit() 的第二個(gè)參數可以設置同時(shí)請求的數量。
提取后如何保存數據是個(gè)問(wèn)題
這里我們通過(guò)key對數據進(jìn)行分類(lèi),每次根據key獲取鏈接,并進(jìn)行遍歷。這樣做的好處是保存的數據是一個(gè)整體?,F在我們考慮數據保存的問(wèn)題。
1、可以整體插入
優(yōu)點(diǎn):快速的數據庫操作不浪費時(shí)間。
缺點(diǎn):有的書(shū)可能有幾百章,也就是說(shuō)插入前必須保存幾百頁(yè)的內容,這樣也很消耗內存,可能會(huì )導致程序運行不穩定。
2、可以作為每篇文章插入數據庫文章。
優(yōu)點(diǎn):頁(yè)面爬取保存的方式,可以及時(shí)保存數據。即使出現后續錯誤,也無(wú)需重新保存之前的章節。
缺點(diǎn):也明顯慢。想爬幾萬(wàn)個(gè)頁(yè)面,做幾萬(wàn)個(gè)*N的數據庫操作,仔細想想。您還可以制作緩存以一次保存一定數量的記錄。不錯的選擇。
/**??*?遍歷單條書(shū)籍下所有章節?調用內容抓取方法??*?@param?{*}?list???*/?const?mapSectionList?=?(list)?=>?{?????return?new?Promise((resolve,?reject)?=>?{?????????async.mapLimit(list,?1,?(series,?callback)?=>?{?????????????let?doc?=?series._doc;?????????????getContent(doc,?callback)?????????},?(err,?result)?=>?{?????????????if?(err)?{?????????????????logger.error('書(shū)籍目錄抓取異步執行出錯!');?????????????????logger.error(err);?????????????????reject(false);?????????????????return;?????????????}?????????????const?bookName?=?list[0].bookName;?????????????const?key?=?list[0].key;??????????????//?以整體為單元進(jìn)行保存?????????????saveAllContentToDB(result,?bookName,?key,?resolve);??????????????//以每篇文章作為單元進(jìn)行保存?????????????//?logger.info(bookName?+?'數據抓取完成,進(jìn)入下一部書(shū)籍抓取函數...');?????????????//?resolve(true);??????????})?????})?}?
兩者各有利弊,這里我們都嘗試過(guò)。準備了兩個(gè)錯誤保存集合,errContentModel 和 error采集Model。插入錯誤時(shí),將信息分別保存到相應的集合中。您可以選擇兩者之一。之所以添加集合保存數據,是為了方便一次性查看和后續操作,無(wú)需查看日志。
?。≒S,其實(shí)error采集Model集合可以完全使用,errContentModel集合可以完整保存章節信息)
//保存出錯的數據名稱(chēng)?const?errorSpider?=?mongoose.Schema({?????chapter:?String,?????section:?String,?????url:?String,?????key:?String,?????bookName:?String,?????author:?String,?})?//?保存出錯的數據名稱(chēng)?只保留key?和?bookName信息?const?errorCollection?=?mongoose.Schema({?????key:?String,?????bookName:?String,?})?
我們將每本書(shū)信息的內容放入一個(gè)新的集合中,集合以key命名。
總結
其實(shí)這個(gè)項目寫(xiě)的主要難點(diǎn)在于程序穩定性的控制,容錯機制的設置,以及錯誤的記錄。目前這個(gè)項目基本上可以一次性直接運行整個(gè)流程。但是,程序設計上肯定還存在很多問(wèn)題。歡迎指正和交流。
復活節彩蛋
寫(xiě)完這個(gè)項目,我做了一個(gè)基于React網(wǎng)站的頁(yè)面瀏覽前端和一個(gè)基于koa2.x開(kāi)發(fā)的服務(wù)器。整體技術(shù)棧相當于 React + Redux + Koa2,前后端服務(wù)分別部署,各自能夠更好的去除前后端服務(wù)的耦合。例如,同一組服務(wù)器端代碼不僅可以為 Web 提供支持,還可以為移動(dòng)和應用程序提供支持。目前整套還是很簡(jiǎn)單的,但是可以滿(mǎn)足基本的查詢(xún)和瀏覽功能。希望以后有時(shí)間讓項目更加豐富。
該項目非常簡(jiǎn)單,但有一個(gè)額外的環(huán)境用于學(xué)習和研究從前端到服務(wù)器端的開(kāi)發(fā)。 查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(【】一個(gè)一級-spider頁(yè)面())
前言
在研究數據之前,我零零散散地寫(xiě)了一些數據爬蟲(chóng),但我寫(xiě)的比較隨意。很多地方現在看起來(lái)不太合理。這次比較空閑,本來(lái)想重構之前的項目。
后來(lái)利用這個(gè)周末簡(jiǎn)單的重新寫(xiě)了一個(gè)項目,就是這個(gè)項目guwen-spider。目前這種爬蟲(chóng)還是比較簡(jiǎn)單的類(lèi)型,直接爬取頁(yè)面,然后從頁(yè)面中提取數據,將數據保存到數據庫中。
通過(guò)和我之前寫(xiě)的比較,我認為難點(diǎn)在于整個(gè)程序的健壯性和相應的容錯機制。其實(shí)昨天在寫(xiě)代碼的過(guò)程中就體現出來(lái)了。真正的主代碼其實(shí)寫(xiě)得很快,大部分時(shí)間都花在了
做穩定性調試,尋求更合理的方式處理數據與過(guò)程控制的關(guān)系。

背景
項目背景是抓取一級頁(yè)面,即目錄列表,點(diǎn)擊目錄進(jìn)入章節和長(cháng)度列表,點(diǎn)擊章節或長(cháng)度進(jìn)入具體內容頁(yè)面。
概述
本項目github地址:guwen-spider(PS:***臉上有彩蛋~~逃跑
項目技術(shù)細節
項目中大量使用了 ES7 的 async 函數,更直觀(guān)的反映了程序的流程。為方便起見(jiàn),在遍歷數據的過(guò)程中直接使用了眾所周知的 async 庫,所以難免會(huì )用到回調 promise。因為數據處理發(fā)生在回調函數中,難免會(huì )遇到一些數據傳輸問(wèn)題。,其實(shí)可以直接用ES7的async await寫(xiě)一個(gè)方法來(lái)實(shí)現同樣的功能。其實(shí)這里最好的部分是使用Class的靜態(tài)方法來(lái)封裝數據庫的操作。顧名思義,靜態(tài)方法就像原型一樣,不占用額外空間。
該項目主要使用
ES7 的 async await 協(xié)程做異步邏輯處理。使用 npm 的異步庫進(jìn)行循環(huán)遍歷和并發(fā)請求操作。使用log4js做日志處理,使用cheerio處理dom操作。使用 mongoose 連接 mongoDB 進(jìn)行數據存儲和操作。
目錄結構
項目實(shí)現計劃分析
條目是典型的多級爬取案例,目前只有書(shū)單、圖書(shū)條目對應的章節列表、章節鏈接對應的內容三個(gè)等級。有兩種方法可以獲取這樣的結構。一種是直接從外層抓取到內層,然后在內層抓取后執行下一個(gè)外層,另一種是先將外層保存到數據庫中。,然后根據外層爬取所有內章的鏈接,再次保存,然后從數據庫中查詢(xún)對應的鏈接單元爬取內容。這兩種方案各有優(yōu)缺點(diǎn)。其實(shí)這兩種方法我都試過(guò)了。后者有一個(gè)優(yōu)勢,因為三個(gè)層次是分開(kāi)捕獲的,以便盡可能多地保存相關(guān)章節。數據。你可以想象,如果按照正常邏輯使用前者
遍歷一級目錄抓取對應的二級章節目錄,然后遍歷章節列表抓取內容。當三級內容單元被爬取,需要保存的時(shí)候,如果需要大量的一級目錄信息,那么這些分層數據之間的數據傳輸,想想應該是比較復雜的事情。因此,單獨保存數據在一定程度上避免了不必要的復雜數據傳輸。
目前我們已經(jīng)考慮到,我們想要采集的古籍數量并不是很多,涵蓋各種經(jīng)文和歷史的古籍也只有大約180本。它和章節內容本身是一個(gè)很小的數據,即一個(gè)集合中有180條文檔記錄。這180本書(shū)的所有章節共有16000個(gè)章節,對應的需要訪(fǎng)問(wèn)16000個(gè)頁(yè)面才能爬取到相應的內容。所以選擇第二個(gè)應該是合理的。
項目實(shí)現
主流程有bookListInit、chapterListInit、contentListInit三個(gè)方法,分別是抓取圖書(shū)目錄、章節列表、圖書(shū)內容的方法,都是公開(kāi)暴露的初始化方法。通過(guò) async 可以控制這三種方法的運行過(guò)程。取書(shū)目錄后,將數據存入數據庫,然后將執行結果返回給主程序。如果操作成功,主程序會(huì )根據書(shū)單執行章節列表的獲取。,以同樣的方式爬取書(shū)籍的內容。
項目主入口
/**??*?爬蟲(chóng)抓取主入口??*/?const?start?=?async()?=>?{?????let?booklistRes?=?await?bookListInit();?????if?(!booklistRes)?{?????????logger.warn('書(shū)籍列表抓取出錯,程序終止...');?????????return;?????}?????logger.info('書(shū)籍列表抓取成功,現在進(jìn)行書(shū)籍章節抓取...');??????let?chapterlistRes?=?await?chapterListInit();?????if?(!chapterlistRes)?{?????????logger.warn('書(shū)籍章節列表抓取出錯,程序終止...');?????????return;?????}?????logger.info('書(shū)籍章節列表抓取成功,現在進(jìn)行書(shū)籍內容抓取...');??????let?contentListRes?=?await?contentListInit();?????if?(!contentListRes)?{?????????logger.warn('書(shū)籍章節內容抓取出錯,程序終止...');?????????return;?????}?????logger.info('書(shū)籍內容抓取成功');?}?//?開(kāi)始入口?if?(typeof?bookListInit?===?'function'?&&?typeof?chapterListInit?===?'function')?{?????//?開(kāi)始抓取?????start();?}?
介紹了 bookListInit、chapterListInit、contentListInit 三個(gè)方法
書(shū)單.js
/**??*?初始化入口??*/?const?chapterListInit?=?async()?=>?{?????const?list?=?await?bookHelper.getBookList(bookListModel);?????if?(!list)?{?????????logger.error('初始化查詢(xún)書(shū)籍目錄失敗');?????}?????logger.info('開(kāi)始抓取書(shū)籍章節列表,書(shū)籍目錄共:'?+?list.length?+?'條');?????let?res?=?await?asyncGetChapter(list);?????return?res;?};?
章節列表.js
/**??*?初始化入口??*/?const?contentListInit?=?async()?=>?{?????//獲取書(shū)籍列表?????const?list?=?await?bookHelper.getBookLi(bookListModel);?????if?(!list)?{?????????logger.error('初始化查詢(xún)書(shū)籍目錄失敗');?????????return;?????}?????const?res?=?await?mapBookList(list);?????if?(!res)?{?????????logger.error('抓取章節信息,調用?getCurBookSectionList()?進(jìn)行串行遍歷操作,執行完成回調出錯,錯誤信息已打印,請查看日志!');?????????return;?????}?????return?res;?}?
關(guān)于內容抓取的思考
圖書(shū)目錄抓取的邏輯其實(shí)很簡(jiǎn)單。只需要使用 async.mapLimit 做一次遍歷就可以保存數據,但是我們保存內容的簡(jiǎn)化邏輯其實(shí)就是遍歷章節列表,抓取鏈接中的內容。但實(shí)際情況是,鏈接數多達數萬(wàn)。從內存使用的角度來(lái)看,我們不能將它們全部保存到一個(gè)數組中然后遍歷它,所以我們需要將內容捕獲統一起來(lái)。
常見(jiàn)的遍歷方式是每次查詢(xún)一定數量進(jìn)行爬取。缺點(diǎn)是分類(lèi)只用了一定的量,數據之間沒(méi)有關(guān)聯(lián),分批插入。如果有錯誤,在容錯方面會(huì )出現一些小問(wèn)題,我們認為單獨保存一本書(shū)作為集合會(huì )有問(wèn)題。因此,我們采用第二種方法來(lái)捕獲和保存圖書(shū)單元中的內容。
這里使用了方法async.mapLimit(list, 1, (series, callback) => {}) 進(jìn)行遍歷,不可避免地用到了回調,感覺(jué)很惡心。async.mapLimit() 的第二個(gè)參數可以設置同時(shí)請求的數量。
提取后如何保存數據是個(gè)問(wèn)題
這里我們通過(guò)key對數據進(jìn)行分類(lèi),每次根據key獲取鏈接,并進(jìn)行遍歷。這樣做的好處是保存的數據是一個(gè)整體?,F在我們考慮數據保存的問(wèn)題。
1、可以整體插入
優(yōu)點(diǎn):快速的數據庫操作不浪費時(shí)間。
缺點(diǎn):有的書(shū)可能有幾百章,也就是說(shuō)插入前必須保存幾百頁(yè)的內容,這樣也很消耗內存,可能會(huì )導致程序運行不穩定。
2、可以作為每篇文章插入數據庫文章。
優(yōu)點(diǎn):頁(yè)面爬取保存的方式,可以及時(shí)保存數據。即使出現后續錯誤,也無(wú)需重新保存之前的章節。
缺點(diǎn):也明顯慢。想爬幾萬(wàn)個(gè)頁(yè)面,做幾萬(wàn)個(gè)*N的數據庫操作,仔細想想。您還可以制作緩存以一次保存一定數量的記錄。不錯的選擇。
/**??*?遍歷單條書(shū)籍下所有章節?調用內容抓取方法??*?@param?{*}?list???*/?const?mapSectionList?=?(list)?=>?{?????return?new?Promise((resolve,?reject)?=>?{?????????async.mapLimit(list,?1,?(series,?callback)?=>?{?????????????let?doc?=?series._doc;?????????????getContent(doc,?callback)?????????},?(err,?result)?=>?{?????????????if?(err)?{?????????????????logger.error('書(shū)籍目錄抓取異步執行出錯!');?????????????????logger.error(err);?????????????????reject(false);?????????????????return;?????????????}?????????????const?bookName?=?list[0].bookName;?????????????const?key?=?list[0].key;??????????????//?以整體為單元進(jìn)行保存?????????????saveAllContentToDB(result,?bookName,?key,?resolve);??????????????//以每篇文章作為單元進(jìn)行保存?????????????//?logger.info(bookName?+?'數據抓取完成,進(jìn)入下一部書(shū)籍抓取函數...');?????????????//?resolve(true);??????????})?????})?}?
兩者各有利弊,這里我們都嘗試過(guò)。準備了兩個(gè)錯誤保存集合,errContentModel 和 error采集Model。插入錯誤時(shí),將信息分別保存到相應的集合中。您可以選擇兩者之一。之所以添加集合保存數據,是為了方便一次性查看和后續操作,無(wú)需查看日志。
?。≒S,其實(shí)error采集Model集合可以完全使用,errContentModel集合可以完整保存章節信息)
//保存出錯的數據名稱(chēng)?const?errorSpider?=?mongoose.Schema({?????chapter:?String,?????section:?String,?????url:?String,?????key:?String,?????bookName:?String,?????author:?String,?})?//?保存出錯的數據名稱(chēng)?只保留key?和?bookName信息?const?errorCollection?=?mongoose.Schema({?????key:?String,?????bookName:?String,?})?
我們將每本書(shū)信息的內容放入一個(gè)新的集合中,集合以key命名。
總結
其實(shí)這個(gè)項目寫(xiě)的主要難點(diǎn)在于程序穩定性的控制,容錯機制的設置,以及錯誤的記錄。目前這個(gè)項目基本上可以一次性直接運行整個(gè)流程。但是,程序設計上肯定還存在很多問(wèn)題。歡迎指正和交流。
復活節彩蛋
寫(xiě)完這個(gè)項目,我做了一個(gè)基于React網(wǎng)站的頁(yè)面瀏覽前端和一個(gè)基于koa2.x開(kāi)發(fā)的服務(wù)器。整體技術(shù)棧相當于 React + Redux + Koa2,前后端服務(wù)分別部署,各自能夠更好的去除前后端服務(wù)的耦合。例如,同一組服務(wù)器端代碼不僅可以為 Web 提供支持,還可以為移動(dòng)和應用程序提供支持。目前整套還是很簡(jiǎn)單的,但是可以滿(mǎn)足基本的查詢(xún)和瀏覽功能。希望以后有時(shí)間讓項目更加豐富。
該項目非常簡(jiǎn)單,但有一個(gè)額外的環(huán)境用于學(xué)習和研究從前端到服務(wù)器端的開(kāi)發(fā)。
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(無(wú)需你讓我學(xué)Gooseeker我就只學(xué)它吧?|?無(wú)需)
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 354 次瀏覽 ? 2022-02-26 21:19
當您剛開(kāi)始使用數據可視化時(shí),主要關(guān)注點(diǎn)之一通常是學(xué)習制作各種圖表類(lèi)型。
但是用那些原創(chuàng )數據練習了半天,心里會(huì )有些不安和松懈。畢竟沒(méi)有真正投入實(shí)戰的練習都是假的,各種基礎數據都是我用來(lái)數據可視化的。菜,不不不!
通常,我也會(huì )去互聯(lián)網(wǎng)查找一些現有的數據,但它并不總是適合我的胃口。我無(wú)法完全自由地找到我想要的數據,并做我感興趣的可視化分析。所以,這是理所當然的,我迫不及待地想了解爬行動(dòng)物。
我不知道如何編程。如果想在短時(shí)間內快速掌握爬蟲(chóng)技巧,只能使用網(wǎng)頁(yè)信息抓取軟件,所以@squirrel給我推薦了他的課程《無(wú)需編程即可輕松獲取網(wǎng)絡(luò )數據》,學(xué)習Jisouke Gooseeker Web Crawler。
因為他的課程非常簡(jiǎn)潔易懂,而且Gooseeker的操作真的很簡(jiǎn)單,所以可以很快上手,一個(gè)晚上就爬一個(gè)簡(jiǎn)單的網(wǎng)站。
以前覺(jué)得爬網(wǎng)數據很難,現在可以這么輕松地爬取信息,真的很興奮!
所以,如果你和我一樣,沒(méi)有編程基礎,又想根據自己的意愿獲取更多的數據信息,可以嘗試學(xué)習 Gooseeker 網(wǎng)絡(luò )爬蟲(chóng)。
Gooseeker的好處主要有:
Gooseeker擁有獨立的網(wǎng)絡(luò )爬蟲(chóng)瀏覽器,也可以依賴(lài)火狐瀏覽器一起打包下載。
我選擇的軟件版本是火狐版本。安裝完成后會(huì )在火狐瀏覽器的工具欄上生成一個(gè)插件。單擊“工具”以查看“MS 計算機”和“DS 計算機”。提取工作將在兩個(gè)平臺上執行。
當然,我們還需要注冊一個(gè)賬號,方便使用它來(lái)管理爬蟲(chóng)規則,在社區互動(dòng),下載資源等。
在我學(xué)習期間,有一位老司機(@squirrel)帶我去飛行。確實(shí)讓我少走了很多彎路,大大提高了我的學(xué)習效率,但是作為一個(gè)好學(xué)的學(xué)生……學(xué)姐,你不能讓我學(xué)Gooseeeker,我就只學(xué)吧?肯定還有很多其他類(lèi)似的工具,我需要更多地了解它們!
于是偷偷了解了其他網(wǎng)絡(luò )數據采集器的優(yōu)劣,對比對比,發(fā)現差距確實(shí)不大。黑貓和白貓,能抓到老鼠的貓就是好貓。對于學(xué)習來(lái)說(shuō),真的沒(méi)必要執著(zhù)于工具。
我用Gooseeker前后免費爬取了幾十條網(wǎng)站數據,基本上所有網(wǎng)站信息都可以通過(guò)它輕松獲取,還有一小部分網(wǎng)站需要走彎路。
它可以實(shí)現的爬蟲(chóng)任務(wù)包括:分層爬取、翻頁(yè)、動(dòng)態(tài)網(wǎng)頁(yè)爬取等基本爬取方式,還支持爬蟲(chóng)組(不是很好用)等等。
我先學(xué)了Squirrel的課程,學(xué)會(huì )了用它爬取數據后,就去官網(wǎng)了解了更多細節。Gooseeker的官網(wǎng)社區比較齊全。上面有很多文檔/視頻教程,還有別人制定的免費/付費規則。您也可以在線(xiàn)進(jìn)行數據DIY。
其產(chǎn)品天數軟件中的APP資源也非常豐富,可以高效獲取電商、微博數據和做數據挖掘、SaaS模型軟件。
其中,文本分割和標注工具——天語(yǔ)影音對我特別有吸引力。它可以輕松完成文本的分詞和可視化分析。有機會(huì )一定要試試(寫(xiě)論文)。
但是我個(gè)人覺(jué)得上面的視頻教程都不好。很多人都說(shuō)Gooseeeker前期很難上手。我認為這與他們在上面獲得的教程資源的質(zhì)量有限無(wú)關(guān)。
總的來(lái)說(shuō),這是一款免費好用的爬蟲(chóng)神器!Wall Crack推薦小伙伴們去其官網(wǎng)下載軟件學(xué)習,可以輕松搞定一個(gè)看似遙不可及,實(shí)則又傻又甜的技能。
在接下來(lái)的幾篇文章中,我會(huì )為大家介紹幾個(gè)實(shí)際案例。如有任何問(wèn)題,歡迎交流討論。
資源: 查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(無(wú)需你讓我學(xué)Gooseeker我就只學(xué)它吧?|?無(wú)需)
當您剛開(kāi)始使用數據可視化時(shí),主要關(guān)注點(diǎn)之一通常是學(xué)習制作各種圖表類(lèi)型。
但是用那些原創(chuàng )數據練習了半天,心里會(huì )有些不安和松懈。畢竟沒(méi)有真正投入實(shí)戰的練習都是假的,各種基礎數據都是我用來(lái)數據可視化的。菜,不不不!
通常,我也會(huì )去互聯(lián)網(wǎng)查找一些現有的數據,但它并不總是適合我的胃口。我無(wú)法完全自由地找到我想要的數據,并做我感興趣的可視化分析。所以,這是理所當然的,我迫不及待地想了解爬行動(dòng)物。
我不知道如何編程。如果想在短時(shí)間內快速掌握爬蟲(chóng)技巧,只能使用網(wǎng)頁(yè)信息抓取軟件,所以@squirrel給我推薦了他的課程《無(wú)需編程即可輕松獲取網(wǎng)絡(luò )數據》,學(xué)習Jisouke Gooseeker Web Crawler。
因為他的課程非常簡(jiǎn)潔易懂,而且Gooseeker的操作真的很簡(jiǎn)單,所以可以很快上手,一個(gè)晚上就爬一個(gè)簡(jiǎn)單的網(wǎng)站。
以前覺(jué)得爬網(wǎng)數據很難,現在可以這么輕松地爬取信息,真的很興奮!
所以,如果你和我一樣,沒(méi)有編程基礎,又想根據自己的意愿獲取更多的數據信息,可以嘗試學(xué)習 Gooseeker 網(wǎng)絡(luò )爬蟲(chóng)。

Gooseeker的好處主要有:

Gooseeker擁有獨立的網(wǎng)絡(luò )爬蟲(chóng)瀏覽器,也可以依賴(lài)火狐瀏覽器一起打包下載。
我選擇的軟件版本是火狐版本。安裝完成后會(huì )在火狐瀏覽器的工具欄上生成一個(gè)插件。單擊“工具”以查看“MS 計算機”和“DS 計算機”。提取工作將在兩個(gè)平臺上執行。
當然,我們還需要注冊一個(gè)賬號,方便使用它來(lái)管理爬蟲(chóng)規則,在社區互動(dòng),下載資源等。

在我學(xué)習期間,有一位老司機(@squirrel)帶我去飛行。確實(shí)讓我少走了很多彎路,大大提高了我的學(xué)習效率,但是作為一個(gè)好學(xué)的學(xué)生……學(xué)姐,你不能讓我學(xué)Gooseeeker,我就只學(xué)吧?肯定還有很多其他類(lèi)似的工具,我需要更多地了解它們!
于是偷偷了解了其他網(wǎng)絡(luò )數據采集器的優(yōu)劣,對比對比,發(fā)現差距確實(shí)不大。黑貓和白貓,能抓到老鼠的貓就是好貓。對于學(xué)習來(lái)說(shuō),真的沒(méi)必要執著(zhù)于工具。
我用Gooseeker前后免費爬取了幾十條網(wǎng)站數據,基本上所有網(wǎng)站信息都可以通過(guò)它輕松獲取,還有一小部分網(wǎng)站需要走彎路。
它可以實(shí)現的爬蟲(chóng)任務(wù)包括:分層爬取、翻頁(yè)、動(dòng)態(tài)網(wǎng)頁(yè)爬取等基本爬取方式,還支持爬蟲(chóng)組(不是很好用)等等。
我先學(xué)了Squirrel的課程,學(xué)會(huì )了用它爬取數據后,就去官網(wǎng)了解了更多細節。Gooseeker的官網(wǎng)社區比較齊全。上面有很多文檔/視頻教程,還有別人制定的免費/付費規則。您也可以在線(xiàn)進(jìn)行數據DIY。
其產(chǎn)品天數軟件中的APP資源也非常豐富,可以高效獲取電商、微博數據和做數據挖掘、SaaS模型軟件。

其中,文本分割和標注工具——天語(yǔ)影音對我特別有吸引力。它可以輕松完成文本的分詞和可視化分析。有機會(huì )一定要試試(寫(xiě)論文)。
但是我個(gè)人覺(jué)得上面的視頻教程都不好。很多人都說(shuō)Gooseeeker前期很難上手。我認為這與他們在上面獲得的教程資源的質(zhì)量有限無(wú)關(guān)。
總的來(lái)說(shuō),這是一款免費好用的爬蟲(chóng)神器!Wall Crack推薦小伙伴們去其官網(wǎng)下載軟件學(xué)習,可以輕松搞定一個(gè)看似遙不可及,實(shí)則又傻又甜的技能。
在接下來(lái)的幾篇文章中,我會(huì )為大家介紹幾個(gè)實(shí)際案例。如有任何問(wèn)題,歡迎交流討論。
資源:
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(爬蟲(chóng)在數據分析領(lǐng)域的應用,如何幫助我們提升數據分析質(zhì)量)
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 243 次瀏覽 ? 2022-03-14 12:15
在當今信息化和數字化的時(shí)代,人們離不開(kāi)網(wǎng)絡(luò )搜索,但想想看,在搜索過(guò)程中,你真的可以得到相關(guān)信息,因為有人在幫你過(guò)濾相關(guān)內容,呈現在你面前。
就像在餐館里一樣,你點(diǎn)了土豆然后得到它們,因為有人幫你在土豆、蘿卜、西紅柿等中找到它們,然后有人把它們帶到你的餐桌上。在網(wǎng)上,這兩個(gè)動(dòng)作是一個(gè)叫爬蟲(chóng)的同學(xué)為你實(shí)現的。
也就是說(shuō),沒(méi)有爬蟲(chóng),就沒(méi)有今天的檢索,就無(wú)法準確查找信息和高效獲取數據。今天DataHunter就來(lái)談?wù)勁老x(chóng)在數據分析領(lǐng)域的應用,以及它如何幫助我們提高數據分析的質(zhì)量。
一、數據時(shí)代,爬蟲(chóng)的本質(zhì)是提高效率
網(wǎng)絡(luò )爬蟲(chóng),又稱(chēng)網(wǎng)絡(luò )機器人,可以代替人自動(dòng)瀏覽網(wǎng)絡(luò )信息,采集和組織數據。
它是一個(gè)程序,其基本原理是向網(wǎng)站/網(wǎng)絡(luò )發(fā)起請求,獲取資源后分析提取有用數據。從技術(shù)上講,就是通過(guò)程序模擬瀏覽器請求站點(diǎn)的行為,將站點(diǎn)返回的HTML代碼/JSON數據/二進(jìn)制數據(圖片、視頻)爬取到本地,然后提取您需要的數據并將其存儲以供使用。
每個(gè)程序都有自己的規則,網(wǎng)絡(luò )爬蟲(chóng)也不例外。它穿梭于世界各地的各種網(wǎng)站之間,根據人們強加的規則將采集信息。我們稱(chēng)這些規則為網(wǎng)絡(luò )爬蟲(chóng)算法。規則是人定的,是人根據自己的目的和需要設計的。因此,根據用戶(hù)的目的,爬蟲(chóng)可以有不同的功能。但所有爬蟲(chóng)的本質(zhì)是方便人們在海量的互聯(lián)網(wǎng)信息中找到并下載自己想要的信息類(lèi)型,從而提高信息獲取效率。
二、爬蟲(chóng)的應用:搜索并幫助企業(yè)做強業(yè)務(wù)
1.搜索引擎:爬取網(wǎng)站為網(wǎng)絡(luò )用戶(hù)提供便利
在互聯(lián)網(wǎng)的早期,能夠提供全球范圍內信息的網(wǎng)站并不多,用戶(hù)也不多。Internet 只是文件傳輸協(xié)議 (FTP) 站點(diǎn)的集合,用戶(hù)可以在其中導航以查找特定的共享文件,并查找和組合 Internet 上可用的分布式數據,創(chuàng )建了一個(gè)稱(chēng)為網(wǎng)絡(luò )爬蟲(chóng)的自動(dòng)化程序 /Robot,它可以爬取網(wǎng)絡(luò )上的所有網(wǎng)頁(yè),然后將所有頁(yè)面的內容復制到數據庫中進(jìn)行索引。這也是最早的搜索引擎。
如今,隨著(zhù)互聯(lián)網(wǎng)的飛速發(fā)展,我們可以在任何搜索引擎中看到來(lái)自世界各地各種網(wǎng)站的信息。百度搜索引擎的爬蟲(chóng)叫百度蜘蛛,360的爬蟲(chóng)叫360Spider,搜狗的爬蟲(chóng)叫搜狗蜘蛛,必應的爬蟲(chóng)叫Bingbot。搜索引擎離不開(kāi)爬蟲(chóng)。
比如百度蜘蛛每天都會(huì )抓取大量的互聯(lián)網(wǎng)信息,抓取優(yōu)質(zhì)信息和收錄。當用戶(hù)在百度搜索引擎上搜索對應的關(guān)鍵詞時(shí),百度會(huì )對關(guān)鍵詞進(jìn)行分析處理,從收錄的網(wǎng)頁(yè)中找出相關(guān)網(wǎng)頁(yè),按照一定的排名規則和結果展示給用戶(hù),工作原理如圖?,F在,我們可以大膽地說(shuō),你每天都在免費享受爬蟲(chóng)的好處。
2.企業(yè):監控輿情,高效獲取有價(jià)值信息
我們說(shuō)過(guò)爬蟲(chóng)的本質(zhì)是提高效率,而爬蟲(chóng)的規則是由人決定的;那么企業(yè)就可以根據自己的業(yè)務(wù)需求設計爬蟲(chóng),第一時(shí)間獲取網(wǎng)絡(luò )上的相關(guān)信息,進(jìn)行清理整合。
在大數據時(shí)代進(jìn)行數據分析,首先要有數據源,網(wǎng)絡(luò )爬蟲(chóng)可以讓我們獲取更多的數據源,同時(shí)根據我們的目的進(jìn)行采集,從而去除很多的無(wú)關(guān)數據。
例如,在進(jìn)行大數據分析或數據挖掘時(shí),可以從一些提供數據統計的網(wǎng)站s,或者從某些文檔或內部資料中獲取數據源。但是,這些獲取數據的方式有時(shí)很難滿(mǎn)足我們的數據需求。此時(shí),我們可以利用爬蟲(chóng)技術(shù)從互聯(lián)網(wǎng)上自動(dòng)獲取更多我們感興趣的數據內容,從而進(jìn)行更深入的數據分析,獲取更多有價(jià)值的信息。
此外,網(wǎng)絡(luò )爬蟲(chóng)還可用于財務(wù)分析,對財務(wù)數據進(jìn)行采集進(jìn)行投資分析;可應用于輿情監測分析、精準客戶(hù)精準營(yíng)銷(xiāo)等各個(gè)領(lǐng)域。
三、企業(yè)常用的4種網(wǎng)絡(luò )爬蟲(chóng)
網(wǎng)絡(luò )爬蟲(chóng)根據實(shí)現的技術(shù)和結構可以分為一般網(wǎng)絡(luò )爬蟲(chóng)、聚焦網(wǎng)絡(luò )爬蟲(chóng)、增量網(wǎng)絡(luò )爬蟲(chóng)和深度網(wǎng)絡(luò )爬蟲(chóng)。但由于網(wǎng)絡(luò )環(huán)境復雜,實(shí)際的網(wǎng)絡(luò )爬蟲(chóng)通常是這幾種爬蟲(chóng)的組合。
1.萬(wàn)能網(wǎng)絡(luò )爬蟲(chóng)
通用網(wǎng)絡(luò )爬蟲(chóng)也稱(chēng)為全網(wǎng)絡(luò )爬蟲(chóng)。顧名思義,要爬取的目標資源在整個(gè)互聯(lián)網(wǎng)上,要爬取的目標數據是巨大的,爬取的范圍也很大。正是因為爬取的數據是海量數據,所以對于這種爬蟲(chóng)來(lái)說(shuō),對爬取的性能要求是非常高的。這種網(wǎng)絡(luò )爬蟲(chóng)主要用于大型搜索引擎,具有很高的應用價(jià)值。
一般的網(wǎng)絡(luò )爬蟲(chóng)主要由初始URL采集、URL隊列、頁(yè)面爬取模塊、頁(yè)面分析模塊、頁(yè)面數據庫、鏈接過(guò)濾模塊等組成。一般網(wǎng)絡(luò )爬蟲(chóng)在爬取時(shí)會(huì )采用一定的爬取策略,主要包括深度優(yōu)先爬取策略和廣度優(yōu)先爬取策略。具體細節將在后面介紹。
2.專(zhuān)注于網(wǎng)絡(luò )爬蟲(chóng)
聚焦網(wǎng)絡(luò )爬蟲(chóng),也稱(chēng)為主題網(wǎng)絡(luò )爬蟲(chóng),是根據預先定義的主題有選擇地爬取網(wǎng)頁(yè)的爬蟲(chóng)。聚焦網(wǎng)絡(luò )爬蟲(chóng)主要用于爬取特定信息,主要為特定類(lèi)型的人提供服務(wù)。
聚焦網(wǎng)絡(luò )爬蟲(chóng)也是由初始URL集合、URL隊列、頁(yè)面爬取模塊、頁(yè)面分析模塊、頁(yè)面數據庫、鏈接過(guò)濾模塊、內容評價(jià)模塊、鏈接評價(jià)模塊等組成。內容評估模塊和鏈接評估模塊可以根據鏈接和內容的重要性確定優(yōu)先訪(fǎng)問(wèn)哪些頁(yè)面。專(zhuān)注于網(wǎng)絡(luò )爬蟲(chóng)的爬取策略主要有四種,如圖:
由于專(zhuān)注的網(wǎng)絡(luò )爬蟲(chóng)可以有目的地根據相應的主題進(jìn)行爬取,在實(shí)際應用過(guò)程中可以節省大量的服務(wù)器資源和寬帶資源,因此具有很強的實(shí)用性。這里我們以網(wǎng)絡(luò )爬蟲(chóng)為例來(lái)了解爬蟲(chóng)運行的工作原理和過(guò)程。
如圖所示,焦點(diǎn)網(wǎng)絡(luò )爬蟲(chóng)有一個(gè)控制中心,負責管理和監控整個(gè)爬蟲(chóng)系統,包括控制用戶(hù)交互、初始化爬蟲(chóng)、確定主題、協(xié)調各個(gè)模塊之間的工作以及控制整個(gè)爬蟲(chóng)系統。爬行過(guò)程。等等:
(1)控制中心將初始URL集合傳遞給URL隊列,頁(yè)面爬取模塊會(huì )從URL隊列中讀取第一批URL列表;
(2)根據這些URL地址,從網(wǎng)上爬取對應的頁(yè)面;爬取后,將爬取的內容發(fā)送到頁(yè)面數據庫進(jìn)行存儲;
(3)在爬取過(guò)程中,會(huì )爬取一些新的URL,此時(shí)需要使用鏈接過(guò)濾模塊,根據指定的主題過(guò)濾掉不相關(guān)的鏈接,然后使用鏈接評價(jià)模塊進(jìn)行根據主題剩余的URL鏈接?;蛘邇热菰u估模塊進(jìn)行優(yōu)先排序,完成后將新的URL地址傳遞給URL隊列,供頁(yè)面爬取模塊使用;
?。?)抓取頁(yè)面并存入頁(yè)面數據庫后,需要使用頁(yè)面分析模塊,根據主題對抓取的頁(yè)面進(jìn)行分析處理,并根據處理結果建立索引庫。當用戶(hù)檢索到相應的信息,就可以從索引數據庫中進(jìn)行相應的檢索,得到相應的結果。
3.增量網(wǎng)絡(luò )爬蟲(chóng)
這里的“incremental”對應于增量更新,意思是在更新過(guò)程中只更新變化的地方,不變的地方不更新。
增量網(wǎng)絡(luò )爬蟲(chóng),在爬取網(wǎng)頁(yè)時(shí),只爬取內容發(fā)生變化的網(wǎng)頁(yè)或新生成的網(wǎng)頁(yè),不會(huì )爬取內容未發(fā)生變化的網(wǎng)頁(yè)。增量網(wǎng)絡(luò )爬蟲(chóng)可以在一定程度上保證爬取的頁(yè)面盡可能的新。
4.深網(wǎng)爬蟲(chóng)
在互聯(lián)網(wǎng)中,網(wǎng)頁(yè)根據存在的程度可以分為表層頁(yè)面和深層頁(yè)面。表面頁(yè)面是指無(wú)需提交表單,使用靜態(tài)鏈接即可到達的靜態(tài)頁(yè)面;而深頁(yè)是提交某個(gè)關(guān)鍵詞后才能獲得的頁(yè)面。在 Internet 中,深層頁(yè)面的數量通常遠大于表面頁(yè)面的數量。
深網(wǎng)爬蟲(chóng)可以爬取互聯(lián)網(wǎng)中的深層頁(yè)面,而要爬取深層頁(yè)面,就需要想辦法自動(dòng)填寫(xiě)相應的表格。深網(wǎng)爬蟲(chóng)主要由 URL 列表、LVS 列表(LVS 指標簽/值集合,即填充表單的數據源)、爬取控制器、解析器、LVS 控制器、表單分析器、表單處理器、響應分析器組成和其他部分。
四、網(wǎng)絡(luò )爬蟲(chóng)的爬取策略
前面我們說(shuō)過(guò),網(wǎng)絡(luò )爬蟲(chóng)算法是基于人對采集信息施加的規則,由于網(wǎng)絡(luò )環(huán)境復雜,算法也多種多樣,也就是爬取策略。這里主要介紹爬取的順序和頻率。
1.爬取順序
網(wǎng)絡(luò )爬蟲(chóng)在爬取過(guò)程中,可能會(huì )出現在爬取的URL列表中的多個(gè)URL地址,因此爬蟲(chóng)會(huì )依次對這些URL地址進(jìn)行爬取。
與一般的網(wǎng)絡(luò )爬蟲(chóng)相比,爬取的順序并不那么重要。但專(zhuān)注于網(wǎng)絡(luò )爬蟲(chóng),爬取的順序與服務(wù)器資源和寬帶資源有關(guān),所以非常重要,一般由爬取策略決定。爬取策略主要包括深度優(yōu)先爬取策略、廣度優(yōu)先爬取策略、大站點(diǎn)優(yōu)先策略、反鏈策略等爬取策略。
如圖,假設有一個(gè)網(wǎng)站,ABCDEFG為站點(diǎn)下的網(wǎng)頁(yè),網(wǎng)頁(yè)的層次結構如圖所示。如果此時(shí)網(wǎng)頁(yè)ABCDEFG都在爬取隊列中,那么根據不同的爬取策略,爬取的順序是不同的。
深度優(yōu)先爬取策略:A→D→E→B→C→F→G
廣度優(yōu)先爬取策略:A→B→C→D→E→F→G
除了以上兩種爬取策略外,還可以使用大站點(diǎn)爬取策略??梢愿鶕鄳W(wǎng)頁(yè)所屬的站點(diǎn)進(jìn)行分類(lèi)。如果某個(gè)網(wǎng)站有大量的網(wǎng)頁(yè),則稱(chēng)為大站點(diǎn)。按照這個(gè)策略,網(wǎng)站擁有的網(wǎng)頁(yè)越多,則越大,優(yōu)先抓取該網(wǎng)頁(yè)在大站點(diǎn)中的URL地址。
此外,還有反向鏈接策略。一個(gè)網(wǎng)頁(yè)的反向鏈接數是指該網(wǎng)頁(yè)被其他網(wǎng)頁(yè)指向的次數。這個(gè)次數代表了該網(wǎng)頁(yè)在一定程度上被其他網(wǎng)頁(yè)推薦的次數。因此,如果按照反向鏈接策略進(jìn)行爬取,那么哪個(gè)網(wǎng)頁(yè)的反向鏈接多,就會(huì )先爬到哪個(gè)頁(yè)面。
但是,在實(shí)際情況中,如果一個(gè)網(wǎng)頁(yè)的優(yōu)先級只是簡(jiǎn)單地由反向鏈接策略來(lái)決定的話(huà),就可能會(huì )出現很多作弊的情況。因此,采用反向鏈接策略需要考慮可靠反向鏈接的數量。除了以上的爬取策略,實(shí)踐中還有很多其他的爬取策略,比如OPIC策略、Partial PageRank策略等等。
2.爬取頻率
網(wǎng)站 網(wǎng)頁(yè)經(jīng)常更新。作為爬蟲(chóng),網(wǎng)站的更新頻率越接近爬蟲(chóng)訪(fǎng)問(wèn)網(wǎng)站的頻率,效果越好。當然,在爬蟲(chóng)服務(wù)器資源有限的情況下,爬蟲(chóng)還需要根據相應的策略,讓不同的網(wǎng)頁(yè)有不同的更新優(yōu)先級。優(yōu)先級高的網(wǎng)頁(yè)會(huì )更新得更快,爬取響應也會(huì )更快。常見(jiàn)的網(wǎng)頁(yè)更新策略有以下三種:
(1)用戶(hù)體驗策略:大部分用戶(hù)使用搜索引擎查詢(xún)某個(gè)關(guān)鍵詞時(shí),只會(huì )關(guān)注排名靠前的網(wǎng)頁(yè)。因此,當爬蟲(chóng)服務(wù)器的資源處于有限,爬蟲(chóng)會(huì )優(yōu)先更新排名靠前的頁(yè)面。
(2)歷史數據策略:是指根據一個(gè)網(wǎng)頁(yè)的歷史更新數據,通過(guò)泊松過(guò)程建模等手段,預測該網(wǎng)頁(yè)下次更新時(shí)間的能力,從而確定下一次更新時(shí)間。抓取網(wǎng)頁(yè)所花費的時(shí)間。
(3)聚類(lèi)分析策略:網(wǎng)頁(yè)可能有不同的內容,但一般來(lái)說(shuō),屬性相似的網(wǎng)頁(yè)更新頻率相似,所以可以對大量的網(wǎng)頁(yè)進(jìn)行聚類(lèi)。爬取的頻率根據設置同類(lèi)型網(wǎng)頁(yè)的平均更新值。
五、網(wǎng)絡(luò )爬蟲(chóng)的實(shí)現技術(shù)
對于實(shí)現技術(shù),本文不展開(kāi),只為有興趣的同學(xué)提供幾種常用語(yǔ)言:Python、Java、PHP、Node.JS、C++、Go語(yǔ)言(另外還有很多開(kāi)發(fā)語(yǔ)言用于網(wǎng)絡(luò )爬蟲(chóng))。
Python:爬蟲(chóng)框架非常豐富,多線(xiàn)程處理能力強,而且易學(xué),代碼簡(jiǎn)潔,優(yōu)點(diǎn)很多。
Java:適合開(kāi)發(fā)大型爬蟲(chóng)項目。
PHP:后端處理能力很強,代碼很簡(jiǎn)潔,模塊豐富,但是并發(fā)能力比較弱。
Node.JS:支持高并發(fā)和多線(xiàn)程。
C++:運行速度快,適合開(kāi)發(fā)大型爬蟲(chóng)項目,成本高。
Go語(yǔ)言:同樣的高并發(fā)能力很強。
六、總結
說(shuō)到爬蟲(chóng),很多人認為它們是網(wǎng)絡(luò )世界中不可能存在的灰色地帶。恭喜你,看完這篇文章,你比很多人都知道。
因為爬蟲(chóng)分為良性爬蟲(chóng)和惡意爬蟲(chóng),比如搜索引擎爬蟲(chóng)。Goodwill爬蟲(chóng)嚴格遵守Robots協(xié)議規范爬取網(wǎng)頁(yè)數據(如URL),它的存在可以增加網(wǎng)站的曝光度,給網(wǎng)站帶來(lái)流量;
惡意爬蟲(chóng),無(wú)視Robots協(xié)議,肆意爬取網(wǎng)站中一些深度不情愿的數據,包括個(gè)人隱私或商業(yè)機密等重要信息。而惡意爬蟲(chóng)的用戶(hù)想要多次大量地從網(wǎng)站獲取信息,所以通常會(huì )在目標網(wǎng)站上投放大量爬蟲(chóng)。如果大量爬蟲(chóng)同時(shí)訪(fǎng)問(wèn)網(wǎng)站,很容易導致網(wǎng)站服務(wù)器超載或崩潰,導致網(wǎng)站算子丟失。
據統計,2017年我國42.2%的互聯(lián)網(wǎng)流量是由網(wǎng)絡(luò )機器人創(chuàng )造的,其中惡意機器(主要是惡意爬蟲(chóng))占21.80%。我們應該合法合理地使用網(wǎng)絡(luò )爬蟲(chóng),這樣才能用科技為企業(yè)帶來(lái)長(cháng)遠發(fā)展,用科學(xué)為社會(huì )創(chuàng )造更高的價(jià)值。
關(guān)于數據獵人
DataHunter是一家專(zhuān)業(yè)的數據分析和商業(yè)智能服務(wù)商,注冊于2014年,團隊核心成員來(lái)自IBM、Oracle、SAP等知名企業(yè),深耕大數據分析領(lǐng)域,擁有十余年豐富的企業(yè)服務(wù)經(jīng)驗。
DataHunter的核心產(chǎn)品Data Analytics智能數據分析平臺和數據大屏設計配置工具Data MAX在行業(yè)中形成了自己的獨特優(yōu)勢,在各行業(yè)積累了眾多標桿客戶(hù)和成功案例。
自成立以來(lái),DataHunter一直致力于為客戶(hù)提供實(shí)時(shí)、高效、智能的數據分析與展示解決方案,幫助企業(yè)查看和分析數據并改善業(yè)務(wù),成為最值得信賴(lài)的數據業(yè)務(wù)公司。 查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(爬蟲(chóng)在數據分析領(lǐng)域的應用,如何幫助我們提升數據分析質(zhì)量)
在當今信息化和數字化的時(shí)代,人們離不開(kāi)網(wǎng)絡(luò )搜索,但想想看,在搜索過(guò)程中,你真的可以得到相關(guān)信息,因為有人在幫你過(guò)濾相關(guān)內容,呈現在你面前。

就像在餐館里一樣,你點(diǎn)了土豆然后得到它們,因為有人幫你在土豆、蘿卜、西紅柿等中找到它們,然后有人把它們帶到你的餐桌上。在網(wǎng)上,這兩個(gè)動(dòng)作是一個(gè)叫爬蟲(chóng)的同學(xué)為你實(shí)現的。
也就是說(shuō),沒(méi)有爬蟲(chóng),就沒(méi)有今天的檢索,就無(wú)法準確查找信息和高效獲取數據。今天DataHunter就來(lái)談?wù)勁老x(chóng)在數據分析領(lǐng)域的應用,以及它如何幫助我們提高數據分析的質(zhì)量。
一、數據時(shí)代,爬蟲(chóng)的本質(zhì)是提高效率
網(wǎng)絡(luò )爬蟲(chóng),又稱(chēng)網(wǎng)絡(luò )機器人,可以代替人自動(dòng)瀏覽網(wǎng)絡(luò )信息,采集和組織數據。
它是一個(gè)程序,其基本原理是向網(wǎng)站/網(wǎng)絡(luò )發(fā)起請求,獲取資源后分析提取有用數據。從技術(shù)上講,就是通過(guò)程序模擬瀏覽器請求站點(diǎn)的行為,將站點(diǎn)返回的HTML代碼/JSON數據/二進(jìn)制數據(圖片、視頻)爬取到本地,然后提取您需要的數據并將其存儲以供使用。

每個(gè)程序都有自己的規則,網(wǎng)絡(luò )爬蟲(chóng)也不例外。它穿梭于世界各地的各種網(wǎng)站之間,根據人們強加的規則將采集信息。我們稱(chēng)這些規則為網(wǎng)絡(luò )爬蟲(chóng)算法。規則是人定的,是人根據自己的目的和需要設計的。因此,根據用戶(hù)的目的,爬蟲(chóng)可以有不同的功能。但所有爬蟲(chóng)的本質(zhì)是方便人們在海量的互聯(lián)網(wǎng)信息中找到并下載自己想要的信息類(lèi)型,從而提高信息獲取效率。
二、爬蟲(chóng)的應用:搜索并幫助企業(yè)做強業(yè)務(wù)
1.搜索引擎:爬取網(wǎng)站為網(wǎng)絡(luò )用戶(hù)提供便利
在互聯(lián)網(wǎng)的早期,能夠提供全球范圍內信息的網(wǎng)站并不多,用戶(hù)也不多。Internet 只是文件傳輸協(xié)議 (FTP) 站點(diǎn)的集合,用戶(hù)可以在其中導航以查找特定的共享文件,并查找和組合 Internet 上可用的分布式數據,創(chuàng )建了一個(gè)稱(chēng)為網(wǎng)絡(luò )爬蟲(chóng)的自動(dòng)化程序 /Robot,它可以爬取網(wǎng)絡(luò )上的所有網(wǎng)頁(yè),然后將所有頁(yè)面的內容復制到數據庫中進(jìn)行索引。這也是最早的搜索引擎。

如今,隨著(zhù)互聯(lián)網(wǎng)的飛速發(fā)展,我們可以在任何搜索引擎中看到來(lái)自世界各地各種網(wǎng)站的信息。百度搜索引擎的爬蟲(chóng)叫百度蜘蛛,360的爬蟲(chóng)叫360Spider,搜狗的爬蟲(chóng)叫搜狗蜘蛛,必應的爬蟲(chóng)叫Bingbot。搜索引擎離不開(kāi)爬蟲(chóng)。
比如百度蜘蛛每天都會(huì )抓取大量的互聯(lián)網(wǎng)信息,抓取優(yōu)質(zhì)信息和收錄。當用戶(hù)在百度搜索引擎上搜索對應的關(guān)鍵詞時(shí),百度會(huì )對關(guān)鍵詞進(jìn)行分析處理,從收錄的網(wǎng)頁(yè)中找出相關(guān)網(wǎng)頁(yè),按照一定的排名規則和結果展示給用戶(hù),工作原理如圖?,F在,我們可以大膽地說(shuō),你每天都在免費享受爬蟲(chóng)的好處。

2.企業(yè):監控輿情,高效獲取有價(jià)值信息
我們說(shuō)過(guò)爬蟲(chóng)的本質(zhì)是提高效率,而爬蟲(chóng)的規則是由人決定的;那么企業(yè)就可以根據自己的業(yè)務(wù)需求設計爬蟲(chóng),第一時(shí)間獲取網(wǎng)絡(luò )上的相關(guān)信息,進(jìn)行清理整合。
在大數據時(shí)代進(jìn)行數據分析,首先要有數據源,網(wǎng)絡(luò )爬蟲(chóng)可以讓我們獲取更多的數據源,同時(shí)根據我們的目的進(jìn)行采集,從而去除很多的無(wú)關(guān)數據。

例如,在進(jìn)行大數據分析或數據挖掘時(shí),可以從一些提供數據統計的網(wǎng)站s,或者從某些文檔或內部資料中獲取數據源。但是,這些獲取數據的方式有時(shí)很難滿(mǎn)足我們的數據需求。此時(shí),我們可以利用爬蟲(chóng)技術(shù)從互聯(lián)網(wǎng)上自動(dòng)獲取更多我們感興趣的數據內容,從而進(jìn)行更深入的數據分析,獲取更多有價(jià)值的信息。
此外,網(wǎng)絡(luò )爬蟲(chóng)還可用于財務(wù)分析,對財務(wù)數據進(jìn)行采集進(jìn)行投資分析;可應用于輿情監測分析、精準客戶(hù)精準營(yíng)銷(xiāo)等各個(gè)領(lǐng)域。
三、企業(yè)常用的4種網(wǎng)絡(luò )爬蟲(chóng)
網(wǎng)絡(luò )爬蟲(chóng)根據實(shí)現的技術(shù)和結構可以分為一般網(wǎng)絡(luò )爬蟲(chóng)、聚焦網(wǎng)絡(luò )爬蟲(chóng)、增量網(wǎng)絡(luò )爬蟲(chóng)和深度網(wǎng)絡(luò )爬蟲(chóng)。但由于網(wǎng)絡(luò )環(huán)境復雜,實(shí)際的網(wǎng)絡(luò )爬蟲(chóng)通常是這幾種爬蟲(chóng)的組合。
1.萬(wàn)能網(wǎng)絡(luò )爬蟲(chóng)
通用網(wǎng)絡(luò )爬蟲(chóng)也稱(chēng)為全網(wǎng)絡(luò )爬蟲(chóng)。顧名思義,要爬取的目標資源在整個(gè)互聯(lián)網(wǎng)上,要爬取的目標數據是巨大的,爬取的范圍也很大。正是因為爬取的數據是海量數據,所以對于這種爬蟲(chóng)來(lái)說(shuō),對爬取的性能要求是非常高的。這種網(wǎng)絡(luò )爬蟲(chóng)主要用于大型搜索引擎,具有很高的應用價(jià)值。

一般的網(wǎng)絡(luò )爬蟲(chóng)主要由初始URL采集、URL隊列、頁(yè)面爬取模塊、頁(yè)面分析模塊、頁(yè)面數據庫、鏈接過(guò)濾模塊等組成。一般網(wǎng)絡(luò )爬蟲(chóng)在爬取時(shí)會(huì )采用一定的爬取策略,主要包括深度優(yōu)先爬取策略和廣度優(yōu)先爬取策略。具體細節將在后面介紹。
2.專(zhuān)注于網(wǎng)絡(luò )爬蟲(chóng)
聚焦網(wǎng)絡(luò )爬蟲(chóng),也稱(chēng)為主題網(wǎng)絡(luò )爬蟲(chóng),是根據預先定義的主題有選擇地爬取網(wǎng)頁(yè)的爬蟲(chóng)。聚焦網(wǎng)絡(luò )爬蟲(chóng)主要用于爬取特定信息,主要為特定類(lèi)型的人提供服務(wù)。
聚焦網(wǎng)絡(luò )爬蟲(chóng)也是由初始URL集合、URL隊列、頁(yè)面爬取模塊、頁(yè)面分析模塊、頁(yè)面數據庫、鏈接過(guò)濾模塊、內容評價(jià)模塊、鏈接評價(jià)模塊等組成。內容評估模塊和鏈接評估模塊可以根據鏈接和內容的重要性確定優(yōu)先訪(fǎng)問(wèn)哪些頁(yè)面。專(zhuān)注于網(wǎng)絡(luò )爬蟲(chóng)的爬取策略主要有四種,如圖:

由于專(zhuān)注的網(wǎng)絡(luò )爬蟲(chóng)可以有目的地根據相應的主題進(jìn)行爬取,在實(shí)際應用過(guò)程中可以節省大量的服務(wù)器資源和寬帶資源,因此具有很強的實(shí)用性。這里我們以網(wǎng)絡(luò )爬蟲(chóng)為例來(lái)了解爬蟲(chóng)運行的工作原理和過(guò)程。

如圖所示,焦點(diǎn)網(wǎng)絡(luò )爬蟲(chóng)有一個(gè)控制中心,負責管理和監控整個(gè)爬蟲(chóng)系統,包括控制用戶(hù)交互、初始化爬蟲(chóng)、確定主題、協(xié)調各個(gè)模塊之間的工作以及控制整個(gè)爬蟲(chóng)系統。爬行過(guò)程。等等:
(1)控制中心將初始URL集合傳遞給URL隊列,頁(yè)面爬取模塊會(huì )從URL隊列中讀取第一批URL列表;
(2)根據這些URL地址,從網(wǎng)上爬取對應的頁(yè)面;爬取后,將爬取的內容發(fā)送到頁(yè)面數據庫進(jìn)行存儲;
(3)在爬取過(guò)程中,會(huì )爬取一些新的URL,此時(shí)需要使用鏈接過(guò)濾模塊,根據指定的主題過(guò)濾掉不相關(guān)的鏈接,然后使用鏈接評價(jià)模塊進(jìn)行根據主題剩余的URL鏈接?;蛘邇热菰u估模塊進(jìn)行優(yōu)先排序,完成后將新的URL地址傳遞給URL隊列,供頁(yè)面爬取模塊使用;
?。?)抓取頁(yè)面并存入頁(yè)面數據庫后,需要使用頁(yè)面分析模塊,根據主題對抓取的頁(yè)面進(jìn)行分析處理,并根據處理結果建立索引庫。當用戶(hù)檢索到相應的信息,就可以從索引數據庫中進(jìn)行相應的檢索,得到相應的結果。
3.增量網(wǎng)絡(luò )爬蟲(chóng)
這里的“incremental”對應于增量更新,意思是在更新過(guò)程中只更新變化的地方,不變的地方不更新。
增量網(wǎng)絡(luò )爬蟲(chóng),在爬取網(wǎng)頁(yè)時(shí),只爬取內容發(fā)生變化的網(wǎng)頁(yè)或新生成的網(wǎng)頁(yè),不會(huì )爬取內容未發(fā)生變化的網(wǎng)頁(yè)。增量網(wǎng)絡(luò )爬蟲(chóng)可以在一定程度上保證爬取的頁(yè)面盡可能的新。
4.深網(wǎng)爬蟲(chóng)
在互聯(lián)網(wǎng)中,網(wǎng)頁(yè)根據存在的程度可以分為表層頁(yè)面和深層頁(yè)面。表面頁(yè)面是指無(wú)需提交表單,使用靜態(tài)鏈接即可到達的靜態(tài)頁(yè)面;而深頁(yè)是提交某個(gè)關(guān)鍵詞后才能獲得的頁(yè)面。在 Internet 中,深層頁(yè)面的數量通常遠大于表面頁(yè)面的數量。

深網(wǎng)爬蟲(chóng)可以爬取互聯(lián)網(wǎng)中的深層頁(yè)面,而要爬取深層頁(yè)面,就需要想辦法自動(dòng)填寫(xiě)相應的表格。深網(wǎng)爬蟲(chóng)主要由 URL 列表、LVS 列表(LVS 指標簽/值集合,即填充表單的數據源)、爬取控制器、解析器、LVS 控制器、表單分析器、表單處理器、響應分析器組成和其他部分。
四、網(wǎng)絡(luò )爬蟲(chóng)的爬取策略
前面我們說(shuō)過(guò),網(wǎng)絡(luò )爬蟲(chóng)算法是基于人對采集信息施加的規則,由于網(wǎng)絡(luò )環(huán)境復雜,算法也多種多樣,也就是爬取策略。這里主要介紹爬取的順序和頻率。
1.爬取順序
網(wǎng)絡(luò )爬蟲(chóng)在爬取過(guò)程中,可能會(huì )出現在爬取的URL列表中的多個(gè)URL地址,因此爬蟲(chóng)會(huì )依次對這些URL地址進(jìn)行爬取。
與一般的網(wǎng)絡(luò )爬蟲(chóng)相比,爬取的順序并不那么重要。但專(zhuān)注于網(wǎng)絡(luò )爬蟲(chóng),爬取的順序與服務(wù)器資源和寬帶資源有關(guān),所以非常重要,一般由爬取策略決定。爬取策略主要包括深度優(yōu)先爬取策略、廣度優(yōu)先爬取策略、大站點(diǎn)優(yōu)先策略、反鏈策略等爬取策略。

如圖,假設有一個(gè)網(wǎng)站,ABCDEFG為站點(diǎn)下的網(wǎng)頁(yè),網(wǎng)頁(yè)的層次結構如圖所示。如果此時(shí)網(wǎng)頁(yè)ABCDEFG都在爬取隊列中,那么根據不同的爬取策略,爬取的順序是不同的。
深度優(yōu)先爬取策略:A→D→E→B→C→F→G
廣度優(yōu)先爬取策略:A→B→C→D→E→F→G
除了以上兩種爬取策略外,還可以使用大站點(diǎn)爬取策略??梢愿鶕鄳W(wǎng)頁(yè)所屬的站點(diǎn)進(jìn)行分類(lèi)。如果某個(gè)網(wǎng)站有大量的網(wǎng)頁(yè),則稱(chēng)為大站點(diǎn)。按照這個(gè)策略,網(wǎng)站擁有的網(wǎng)頁(yè)越多,則越大,優(yōu)先抓取該網(wǎng)頁(yè)在大站點(diǎn)中的URL地址。
此外,還有反向鏈接策略。一個(gè)網(wǎng)頁(yè)的反向鏈接數是指該網(wǎng)頁(yè)被其他網(wǎng)頁(yè)指向的次數。這個(gè)次數代表了該網(wǎng)頁(yè)在一定程度上被其他網(wǎng)頁(yè)推薦的次數。因此,如果按照反向鏈接策略進(jìn)行爬取,那么哪個(gè)網(wǎng)頁(yè)的反向鏈接多,就會(huì )先爬到哪個(gè)頁(yè)面。
但是,在實(shí)際情況中,如果一個(gè)網(wǎng)頁(yè)的優(yōu)先級只是簡(jiǎn)單地由反向鏈接策略來(lái)決定的話(huà),就可能會(huì )出現很多作弊的情況。因此,采用反向鏈接策略需要考慮可靠反向鏈接的數量。除了以上的爬取策略,實(shí)踐中還有很多其他的爬取策略,比如OPIC策略、Partial PageRank策略等等。
2.爬取頻率
網(wǎng)站 網(wǎng)頁(yè)經(jīng)常更新。作為爬蟲(chóng),網(wǎng)站的更新頻率越接近爬蟲(chóng)訪(fǎng)問(wèn)網(wǎng)站的頻率,效果越好。當然,在爬蟲(chóng)服務(wù)器資源有限的情況下,爬蟲(chóng)還需要根據相應的策略,讓不同的網(wǎng)頁(yè)有不同的更新優(yōu)先級。優(yōu)先級高的網(wǎng)頁(yè)會(huì )更新得更快,爬取響應也會(huì )更快。常見(jiàn)的網(wǎng)頁(yè)更新策略有以下三種:

(1)用戶(hù)體驗策略:大部分用戶(hù)使用搜索引擎查詢(xún)某個(gè)關(guān)鍵詞時(shí),只會(huì )關(guān)注排名靠前的網(wǎng)頁(yè)。因此,當爬蟲(chóng)服務(wù)器的資源處于有限,爬蟲(chóng)會(huì )優(yōu)先更新排名靠前的頁(yè)面。
(2)歷史數據策略:是指根據一個(gè)網(wǎng)頁(yè)的歷史更新數據,通過(guò)泊松過(guò)程建模等手段,預測該網(wǎng)頁(yè)下次更新時(shí)間的能力,從而確定下一次更新時(shí)間。抓取網(wǎng)頁(yè)所花費的時(shí)間。
(3)聚類(lèi)分析策略:網(wǎng)頁(yè)可能有不同的內容,但一般來(lái)說(shuō),屬性相似的網(wǎng)頁(yè)更新頻率相似,所以可以對大量的網(wǎng)頁(yè)進(jìn)行聚類(lèi)。爬取的頻率根據設置同類(lèi)型網(wǎng)頁(yè)的平均更新值。
五、網(wǎng)絡(luò )爬蟲(chóng)的實(shí)現技術(shù)
對于實(shí)現技術(shù),本文不展開(kāi),只為有興趣的同學(xué)提供幾種常用語(yǔ)言:Python、Java、PHP、Node.JS、C++、Go語(yǔ)言(另外還有很多開(kāi)發(fā)語(yǔ)言用于網(wǎng)絡(luò )爬蟲(chóng))。
Python:爬蟲(chóng)框架非常豐富,多線(xiàn)程處理能力強,而且易學(xué),代碼簡(jiǎn)潔,優(yōu)點(diǎn)很多。
Java:適合開(kāi)發(fā)大型爬蟲(chóng)項目。
PHP:后端處理能力很強,代碼很簡(jiǎn)潔,模塊豐富,但是并發(fā)能力比較弱。
Node.JS:支持高并發(fā)和多線(xiàn)程。
C++:運行速度快,適合開(kāi)發(fā)大型爬蟲(chóng)項目,成本高。
Go語(yǔ)言:同樣的高并發(fā)能力很強。
六、總結
說(shuō)到爬蟲(chóng),很多人認為它們是網(wǎng)絡(luò )世界中不可能存在的灰色地帶。恭喜你,看完這篇文章,你比很多人都知道。
因為爬蟲(chóng)分為良性爬蟲(chóng)和惡意爬蟲(chóng),比如搜索引擎爬蟲(chóng)。Goodwill爬蟲(chóng)嚴格遵守Robots協(xié)議規范爬取網(wǎng)頁(yè)數據(如URL),它的存在可以增加網(wǎng)站的曝光度,給網(wǎng)站帶來(lái)流量;

惡意爬蟲(chóng),無(wú)視Robots協(xié)議,肆意爬取網(wǎng)站中一些深度不情愿的數據,包括個(gè)人隱私或商業(yè)機密等重要信息。而惡意爬蟲(chóng)的用戶(hù)想要多次大量地從網(wǎng)站獲取信息,所以通常會(huì )在目標網(wǎng)站上投放大量爬蟲(chóng)。如果大量爬蟲(chóng)同時(shí)訪(fǎng)問(wèn)網(wǎng)站,很容易導致網(wǎng)站服務(wù)器超載或崩潰,導致網(wǎng)站算子丟失。
據統計,2017年我國42.2%的互聯(lián)網(wǎng)流量是由網(wǎng)絡(luò )機器人創(chuàng )造的,其中惡意機器(主要是惡意爬蟲(chóng))占21.80%。我們應該合法合理地使用網(wǎng)絡(luò )爬蟲(chóng),這樣才能用科技為企業(yè)帶來(lái)長(cháng)遠發(fā)展,用科學(xué)為社會(huì )創(chuàng )造更高的價(jià)值。
關(guān)于數據獵人
DataHunter是一家專(zhuān)業(yè)的數據分析和商業(yè)智能服務(wù)商,注冊于2014年,團隊核心成員來(lái)自IBM、Oracle、SAP等知名企業(yè),深耕大數據分析領(lǐng)域,擁有十余年豐富的企業(yè)服務(wù)經(jīng)驗。
DataHunter的核心產(chǎn)品Data Analytics智能數據分析平臺和數據大屏設計配置工具Data MAX在行業(yè)中形成了自己的獨特優(yōu)勢,在各行業(yè)積累了眾多標桿客戶(hù)和成功案例。

自成立以來(lái),DataHunter一直致力于為客戶(hù)提供實(shí)時(shí)、高效、智能的數據分析與展示解決方案,幫助企業(yè)查看和分析數據并改善業(yè)務(wù),成為最值得信賴(lài)的數據業(yè)務(wù)公司。
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(利用cookie技術(shù)抓取網(wǎng)頁(yè)靜態(tài)數據這是什么?(組圖))
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 68 次瀏覽 ? 2022-03-13 19:01
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據有很多種不同的方式,我用到的就有采集網(wǎng)頁(yè)靜態(tài)數據(爬蟲(chóng))采集網(wǎng)頁(yè)圖片(webdatasnippet)采集網(wǎng)頁(yè)視頻數據采集網(wǎng)頁(yè)音頻數據采集網(wǎng)頁(yè)視頻采集網(wǎng)頁(yè)圖片采集網(wǎng)頁(yè)文本采集返回的json數據采集cookie數據這種用javascrapy等方式都可以實(shí)現這個(gè)用的比較少,我們可以先思考用requests,selenium等各種庫的用法和原理,一步步的調試實(shí)現。
但是采集網(wǎng)頁(yè)靜態(tài)數據用了再多的shell,模擬用戶(hù)采集數據基本都失敗了,gg有時(shí)候回頭看看采集網(wǎng)頁(yè)靜態(tài)數據,小白用戶(hù)可能會(huì )想,剛來(lái)知乎,肯定是要采集長(cháng)得漂亮的妹子呀,那還要我來(lái)干嘛,偷懶唄。我這就是要教大家偷懶。這里我用到的javascrapy爬蟲(chóng)庫。如何利用瀏覽器ua來(lái)識別瀏覽器,在采集完一個(gè)網(wǎng)頁(yè)之后可以輕松的推斷這個(gè)網(wǎng)頁(yè)是否是正常瀏覽的,還可以實(shí)現轉碼的效果,省的再下一次下載數據了。
就好比我瀏覽某網(wǎng)站,一上來(lái)就瀏覽本站所有的大v的資料,不太好吧。利用cookie技術(shù)抓取網(wǎng)頁(yè)靜態(tài)數據這是什么?cookie技術(shù)就是用cookie在相應網(wǎng)站上存儲一個(gè)數據,從而可以收集那些已經(jīng)登錄了的網(wǎng)站上數據,然后通過(guò)數據抓取框抓取所需數據,加密后再發(fā)回來(lái),進(jìn)一步傳播給服務(wù)器。就好比有些網(wǎng)站,某些已經(jīng)登錄過(guò)的訪(fǎng)客信息是有對應的。
再說(shuō)到這個(gè)cookie技術(shù),其實(shí)就是個(gè)社工庫,看到這個(gè)名字,我能猜到你有一定的網(wǎng)絡(luò )安全常識,我就不多說(shuō)了,平時(shí)可以留意自己瀏覽網(wǎng)站的登錄信息再補充一下,在很多網(wǎng)站上,輸入一個(gè)用戶(hù)名或者密碼后,就可以獲取他所有的所有瀏覽痕跡,過(guò)去有統計過(guò),百度,豆瓣,美團等在百度被騷擾的用戶(hù)是40w大家可以腦補一下。所以一個(gè)人的賬號如果泄露出去,就會(huì )無(wú)孔不入。
我做為一個(gè)小白,也是很無(wú)奈的了,各位高手,各位大神就不要噴我了。哈哈哈(這種是最常見(jiàn)的一種套路,說(shuō)到這里你可能會(huì )大吃一驚,那么如何隱藏自己的cookie?這個(gè)其實(shí)很簡(jiǎn)單,不管是任何的采集,只要是去掉數據,都可以按照通常的方式,只留一個(gè),把輸入的密碼解出來(lái),然后把解密的結果再返回來(lái)一個(gè)簡(jiǎn)單的后綴,去掉所有的https的字眼)手機渣排版還有很多需要補充的,慢慢跟上,預計寫(xiě)十篇,手機上傳圖不易,多多點(diǎn)贊啊。 查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(利用cookie技術(shù)抓取網(wǎng)頁(yè)靜態(tài)數據這是什么?(組圖))
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據有很多種不同的方式,我用到的就有采集網(wǎng)頁(yè)靜態(tài)數據(爬蟲(chóng))采集網(wǎng)頁(yè)圖片(webdatasnippet)采集網(wǎng)頁(yè)視頻數據采集網(wǎng)頁(yè)音頻數據采集網(wǎng)頁(yè)視頻采集網(wǎng)頁(yè)圖片采集網(wǎng)頁(yè)文本采集返回的json數據采集cookie數據這種用javascrapy等方式都可以實(shí)現這個(gè)用的比較少,我們可以先思考用requests,selenium等各種庫的用法和原理,一步步的調試實(shí)現。
但是采集網(wǎng)頁(yè)靜態(tài)數據用了再多的shell,模擬用戶(hù)采集數據基本都失敗了,gg有時(shí)候回頭看看采集網(wǎng)頁(yè)靜態(tài)數據,小白用戶(hù)可能會(huì )想,剛來(lái)知乎,肯定是要采集長(cháng)得漂亮的妹子呀,那還要我來(lái)干嘛,偷懶唄。我這就是要教大家偷懶。這里我用到的javascrapy爬蟲(chóng)庫。如何利用瀏覽器ua來(lái)識別瀏覽器,在采集完一個(gè)網(wǎng)頁(yè)之后可以輕松的推斷這個(gè)網(wǎng)頁(yè)是否是正常瀏覽的,還可以實(shí)現轉碼的效果,省的再下一次下載數據了。
就好比我瀏覽某網(wǎng)站,一上來(lái)就瀏覽本站所有的大v的資料,不太好吧。利用cookie技術(shù)抓取網(wǎng)頁(yè)靜態(tài)數據這是什么?cookie技術(shù)就是用cookie在相應網(wǎng)站上存儲一個(gè)數據,從而可以收集那些已經(jīng)登錄了的網(wǎng)站上數據,然后通過(guò)數據抓取框抓取所需數據,加密后再發(fā)回來(lái),進(jìn)一步傳播給服務(wù)器。就好比有些網(wǎng)站,某些已經(jīng)登錄過(guò)的訪(fǎng)客信息是有對應的。
再說(shuō)到這個(gè)cookie技術(shù),其實(shí)就是個(gè)社工庫,看到這個(gè)名字,我能猜到你有一定的網(wǎng)絡(luò )安全常識,我就不多說(shuō)了,平時(shí)可以留意自己瀏覽網(wǎng)站的登錄信息再補充一下,在很多網(wǎng)站上,輸入一個(gè)用戶(hù)名或者密碼后,就可以獲取他所有的所有瀏覽痕跡,過(guò)去有統計過(guò),百度,豆瓣,美團等在百度被騷擾的用戶(hù)是40w大家可以腦補一下。所以一個(gè)人的賬號如果泄露出去,就會(huì )無(wú)孔不入。
我做為一個(gè)小白,也是很無(wú)奈的了,各位高手,各位大神就不要噴我了。哈哈哈(這種是最常見(jiàn)的一種套路,說(shuō)到這里你可能會(huì )大吃一驚,那么如何隱藏自己的cookie?這個(gè)其實(shí)很簡(jiǎn)單,不管是任何的采集,只要是去掉數據,都可以按照通常的方式,只留一個(gè),把輸入的密碼解出來(lái),然后把解密的結果再返回來(lái)一個(gè)簡(jiǎn)單的后綴,去掉所有的https的字眼)手機渣排版還有很多需要補充的,慢慢跟上,預計寫(xiě)十篇,手機上傳圖不易,多多點(diǎn)贊啊。
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(HTTP請求頭說(shuō)明Allow服務(wù)器支持哪些請求方法(如GET、POST等))
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 70 次瀏覽 ? 2022-03-12 02:02
HTTP 請求標頭提供有關(guān)請求、響應或其他發(fā)送實(shí)體的信息。 (直接搬菜鳥(niǎo)教程)
響應頭描述
允許
服務(wù)器支持哪些請求方式(如GET、POST等)。
內容編碼
文檔的編碼方法。 Content-Type 頭指定的內容類(lèi)型只有在解碼后才能得到。使用 gzip 壓縮文檔可以顯著(zhù)減少 HTML 文檔的下載時(shí)間。 Java 的 GZIPOutputStream 可以很方便地進(jìn)行 gzip 壓縮,但它只支持 Unix 上的 Netscape 和 Windows 上的 IE 4、IE 5。因此,servlet 應該通過(guò)查看 Accept-Encoding 標頭(即 request.getHeader("Accept-Encoding"))來(lái)檢查瀏覽器是否支持 gzip,對于支持 gzip 的瀏覽器返回 gzip 壓縮的 HTML 頁(yè)面,并返回正常其他瀏覽器頁(yè)面的頁(yè)面。
內容長(cháng)度
表示內容長(cháng)度。僅當瀏覽器使用持久 HTTP 連接時(shí)才需要此數據。如果要利用持久連接,可以將輸出文檔寫(xiě)入 ByteArrayOutputStream,完成后檢查其大小,將該值放入 Content-Length 標頭,最后通過(guò) byteArrayStream.writeTo(response .getOutputStream()。
內容類(lèi)型
指示以下文檔屬于哪種 MIME 類(lèi)型。 Servlet 默認為 text/plain,但通常需要明確指定為 text/html。由于經(jīng)常設置 Content-Type,HttpServletResponse 提供了專(zhuān)門(mén)的方法 setContentType。
日期
當前格林威治標準時(shí)間??梢杂胹etDateHeader設置這個(gè)header,避免轉換時(shí)間格式的麻煩。
過(guò)期
何時(shí)應將文檔視為過(guò)期以不再緩存?
最后修改
上次修改文檔的時(shí)間??蛻?hù)端可以通過(guò)If-Modified-Since請求頭提供日期,該請求將被視為條件GET,只返回修改時(shí)間晚于指定時(shí)間的文檔,否則返回304(未修改)狀態(tài)將被退回。 Last-Modified 也可以使用 setDateHeader 方法設置。
位置
指示客戶(hù)端應該去哪里檢索文檔。 Location 通常不是直接設置的,而是通過(guò) HttpServletResponse 的 sendRedirect 方法設置的,該方法也將狀態(tài)碼設置為 302。
刷新
表示瀏覽器刷新文檔的時(shí)間(以秒為單位)。除了刷新當前文檔,還可以使用 setHeader("Refresh", "5; URL=") 讓瀏覽器讀取指定頁(yè)面。
注意這個(gè)功能通常是通過(guò)在HTML頁(yè)面的HEAD區域設置來(lái)實(shí)現的,這是因為自動(dòng)刷新或者重定向不是對于不會(huì )使用 CGI 或 servlet 的 HTML 編寫(xiě)器的人來(lái)說(shuō)可能是非常重要的。不過(guò)對于servlet來(lái)說(shuō),直接設置Refresh header會(huì )更方便。
注意Refresh的意思是“刷新本頁(yè)或N秒后訪(fǎng)問(wèn)指定頁(yè)面”,而不是“每隔N秒刷新本頁(yè)或訪(fǎng)問(wèn)指定頁(yè)面”。因此,持續刷新需要每次發(fā)送一個(gè)Refresh頭,發(fā)送204狀態(tài)碼可以阻止瀏覽器繼續刷新,無(wú)論是使用Refresh頭還是。
注意刷新頭不是HTTP官方規范的一部分1.1,而是一個(gè)擴展,但是Netscape和IE都支持。
服務(wù)器
服務(wù)器名稱(chēng)。 Servlet一般不設置這個(gè)值,而是由Web服務(wù)器自己設置的。
設置-Cookie
設置與頁(yè)面關(guān)聯(lián)的cookie。 Servlet 不應使用 response.setHeader("Set-Cookie", ...),而應使用 HttpServletResponse 提供的專(zhuān)用方法 addCookie。請參閱下面關(guān)于 cookie 設置的討論。
WWW-認證
客戶(hù)端應該在 Authorization 標頭中提供什么類(lèi)型的授權信息?在收錄 401(未授權)狀態(tài)行的響應中需要此標頭。例如 response.setHeader("WWW-Authenticate", "BASIC realm=\"executives\"")。
請注意,servlet 通常不處理此問(wèn)題,而是允許 Web 服務(wù)器的專(zhuān)用機制來(lái)控制對受密碼保護的頁(yè)面(例如 .htaccess)的訪(fǎng)問(wèn)。
1.5 個(gè) Cookie
指存儲在用戶(hù)本地終端上的一些數據(通常是加密的),用于識別用戶(hù)身份和跟蹤會(huì )話(huà)。
cookie 是存儲在計算機瀏覽器目錄中的文本文件。當瀏覽器運行時(shí),它存儲在 RAM 中以發(fā)揮作用(這種 cookie 稱(chēng)為會(huì )話(huà) cookie)。一旦用戶(hù)訪(fǎng)問(wèn) 網(wǎng)站 或服務(wù)器被注銷(xiāo),cookie 就可以存儲在用戶(hù)的本地硬盤(pán)上(這種 cookie 稱(chēng)為 Persistent Cookies)
1.6 認證
一般來(lái)說(shuō),爬蟲(chóng)在抓取和訪(fǎng)問(wèn)網(wǎng)頁(yè)時(shí),會(huì )通過(guò)HTTP請求中的User Agent字段告知自己的身份信息。
1.7 阿賈克斯
Ajax 代表“AsynchronousJavascriptAndXML”(異步 JavaScript 和 XML),它指的是一種用于創(chuàng )建交互式 Web 應用程序的 Web 開(kāi)發(fā)技術(shù)。 Ajax 可以通過(guò)在后臺與服務(wù)器交換少量數據來(lái)異步更新網(wǎng)頁(yè)。這意味著(zhù)可以在不重新加載整個(gè)頁(yè)面的情況下更新頁(yè)面的某些部分。
因為Ajax技術(shù),我們在爬取的時(shí)候,有時(shí)候會(huì )發(fā)現get()的結果并沒(méi)有我們想要的內容,因為在加載頁(yè)面的時(shí)候只有少量的數據交換,而我們得到了什么用爬蟲(chóng)只是第一次。 HTML,然后你需要在開(kāi)發(fā)者工具中找到你想要的數據。等有例子再詳細分析。
1.8 代理
在使用爬蟲(chóng)的過(guò)程中,難免會(huì )遇到帶有反爬蟲(chóng)的網(wǎng)站。這時(shí)候,我們需要一個(gè)代理ip。
使用代理IP,我們可以先從代理獲取代理網(wǎng)站,然后驗證IP是否可用。 查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(HTTP請求頭說(shuō)明Allow服務(wù)器支持哪些請求方法(如GET、POST等))
HTTP 請求標頭提供有關(guān)請求、響應或其他發(fā)送實(shí)體的信息。 (直接搬菜鳥(niǎo)教程)
響應頭描述
允許
服務(wù)器支持哪些請求方式(如GET、POST等)。
內容編碼
文檔的編碼方法。 Content-Type 頭指定的內容類(lèi)型只有在解碼后才能得到。使用 gzip 壓縮文檔可以顯著(zhù)減少 HTML 文檔的下載時(shí)間。 Java 的 GZIPOutputStream 可以很方便地進(jìn)行 gzip 壓縮,但它只支持 Unix 上的 Netscape 和 Windows 上的 IE 4、IE 5。因此,servlet 應該通過(guò)查看 Accept-Encoding 標頭(即 request.getHeader("Accept-Encoding"))來(lái)檢查瀏覽器是否支持 gzip,對于支持 gzip 的瀏覽器返回 gzip 壓縮的 HTML 頁(yè)面,并返回正常其他瀏覽器頁(yè)面的頁(yè)面。
內容長(cháng)度
表示內容長(cháng)度。僅當瀏覽器使用持久 HTTP 連接時(shí)才需要此數據。如果要利用持久連接,可以將輸出文檔寫(xiě)入 ByteArrayOutputStream,完成后檢查其大小,將該值放入 Content-Length 標頭,最后通過(guò) byteArrayStream.writeTo(response .getOutputStream()。
內容類(lèi)型
指示以下文檔屬于哪種 MIME 類(lèi)型。 Servlet 默認為 text/plain,但通常需要明確指定為 text/html。由于經(jīng)常設置 Content-Type,HttpServletResponse 提供了專(zhuān)門(mén)的方法 setContentType。
日期
當前格林威治標準時(shí)間??梢杂胹etDateHeader設置這個(gè)header,避免轉換時(shí)間格式的麻煩。
過(guò)期
何時(shí)應將文檔視為過(guò)期以不再緩存?
最后修改
上次修改文檔的時(shí)間??蛻?hù)端可以通過(guò)If-Modified-Since請求頭提供日期,該請求將被視為條件GET,只返回修改時(shí)間晚于指定時(shí)間的文檔,否則返回304(未修改)狀態(tài)將被退回。 Last-Modified 也可以使用 setDateHeader 方法設置。
位置
指示客戶(hù)端應該去哪里檢索文檔。 Location 通常不是直接設置的,而是通過(guò) HttpServletResponse 的 sendRedirect 方法設置的,該方法也將狀態(tài)碼設置為 302。
刷新
表示瀏覽器刷新文檔的時(shí)間(以秒為單位)。除了刷新當前文檔,還可以使用 setHeader("Refresh", "5; URL=") 讓瀏覽器讀取指定頁(yè)面。
注意這個(gè)功能通常是通過(guò)在HTML頁(yè)面的HEAD區域設置來(lái)實(shí)現的,這是因為自動(dòng)刷新或者重定向不是對于不會(huì )使用 CGI 或 servlet 的 HTML 編寫(xiě)器的人來(lái)說(shuō)可能是非常重要的。不過(guò)對于servlet來(lái)說(shuō),直接設置Refresh header會(huì )更方便。
注意Refresh的意思是“刷新本頁(yè)或N秒后訪(fǎng)問(wèn)指定頁(yè)面”,而不是“每隔N秒刷新本頁(yè)或訪(fǎng)問(wèn)指定頁(yè)面”。因此,持續刷新需要每次發(fā)送一個(gè)Refresh頭,發(fā)送204狀態(tài)碼可以阻止瀏覽器繼續刷新,無(wú)論是使用Refresh頭還是。
注意刷新頭不是HTTP官方規范的一部分1.1,而是一個(gè)擴展,但是Netscape和IE都支持。
服務(wù)器
服務(wù)器名稱(chēng)。 Servlet一般不設置這個(gè)值,而是由Web服務(wù)器自己設置的。
設置-Cookie
設置與頁(yè)面關(guān)聯(lián)的cookie。 Servlet 不應使用 response.setHeader("Set-Cookie", ...),而應使用 HttpServletResponse 提供的專(zhuān)用方法 addCookie。請參閱下面關(guān)于 cookie 設置的討論。
WWW-認證
客戶(hù)端應該在 Authorization 標頭中提供什么類(lèi)型的授權信息?在收錄 401(未授權)狀態(tài)行的響應中需要此標頭。例如 response.setHeader("WWW-Authenticate", "BASIC realm=\"executives\"")。
請注意,servlet 通常不處理此問(wèn)題,而是允許 Web 服務(wù)器的專(zhuān)用機制來(lái)控制對受密碼保護的頁(yè)面(例如 .htaccess)的訪(fǎng)問(wèn)。
1.5 個(gè) Cookie
指存儲在用戶(hù)本地終端上的一些數據(通常是加密的),用于識別用戶(hù)身份和跟蹤會(huì )話(huà)。
cookie 是存儲在計算機瀏覽器目錄中的文本文件。當瀏覽器運行時(shí),它存儲在 RAM 中以發(fā)揮作用(這種 cookie 稱(chēng)為會(huì )話(huà) cookie)。一旦用戶(hù)訪(fǎng)問(wèn) 網(wǎng)站 或服務(wù)器被注銷(xiāo),cookie 就可以存儲在用戶(hù)的本地硬盤(pán)上(這種 cookie 稱(chēng)為 Persistent Cookies)
1.6 認證
一般來(lái)說(shuō),爬蟲(chóng)在抓取和訪(fǎng)問(wèn)網(wǎng)頁(yè)時(shí),會(huì )通過(guò)HTTP請求中的User Agent字段告知自己的身份信息。
1.7 阿賈克斯
Ajax 代表“AsynchronousJavascriptAndXML”(異步 JavaScript 和 XML),它指的是一種用于創(chuàng )建交互式 Web 應用程序的 Web 開(kāi)發(fā)技術(shù)。 Ajax 可以通過(guò)在后臺與服務(wù)器交換少量數據來(lái)異步更新網(wǎng)頁(yè)。這意味著(zhù)可以在不重新加載整個(gè)頁(yè)面的情況下更新頁(yè)面的某些部分。
因為Ajax技術(shù),我們在爬取的時(shí)候,有時(shí)候會(huì )發(fā)現get()的結果并沒(méi)有我們想要的內容,因為在加載頁(yè)面的時(shí)候只有少量的數據交換,而我們得到了什么用爬蟲(chóng)只是第一次。 HTML,然后你需要在開(kāi)發(fā)者工具中找到你想要的數據。等有例子再詳細分析。
1.8 代理
在使用爬蟲(chóng)的過(guò)程中,難免會(huì )遇到帶有反爬蟲(chóng)的網(wǎng)站。這時(shí)候,我們需要一個(gè)代理ip。
使用代理IP,我們可以先從代理獲取代理網(wǎng)站,然后驗證IP是否可用。
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(南陽(yáng)理工學(xué)院ACM題目信息獲取源碼我們知道瀏覽器查看網(wǎng)頁(yè)時(shí) )
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 76 次瀏覽 ? 2022-03-12 02:00
)
南洋理工ACM專(zhuān)題信息
獲取源代碼
我們知道,瀏覽器在瀏覽網(wǎng)頁(yè)時(shí),首先會(huì )向服務(wù)器發(fā)送一個(gè)request請求,服務(wù)器會(huì )根據request請求做一些處理,生成一個(gè)response響應返回給瀏覽器,這個(gè)response收錄我們需要的網(wǎng)頁(yè)(或者數據,一般是靜態(tài)的網(wǎng)站或者服務(wù)器端渲染就是直接返回網(wǎng)頁(yè)),那么我們只需要模仿瀏覽器發(fā)送這個(gè)請求給服務(wù)器下載網(wǎng)頁(yè),而然后等待服務(wù)器發(fā)回響應。
1.引入第三方庫
import requests
from bs4 import BeautifulSoup
import csv
from tqdm import tqdm
2.模擬瀏覽器
Headers = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400'
3. 爬網(wǎng)
r = requests.get(
f'http://www.51mxd.cn/problemset.php-page={pages}.htm', Headers)
r.raise_for_status()
r.encoding = 'utf-8'
BeautifulSoup 網(wǎng)絡(luò )分析
學(xué)習了request,了解了偽裝技巧,終于可以爬到一些正常的web源碼(html文檔)了,但這離最后也是最重要的一步——篩選還差得很遠。這個(gè)過(guò)程就像在沙子里淘金一樣。沒(méi)有合適的篩子,你就會(huì )錯過(guò)有價(jià)值的東西,或者做無(wú)用的工作來(lái)篩掉無(wú)用的東西。
淘金者觀(guān)察土壤并制作篩子。對應爬蟲(chóng)字段就是觀(guān)察html,自定義過(guò)濾器。這里其實(shí)是一個(gè)簡(jiǎn)單的抓取 td 標簽
1.初始化
soup = BeautifulSoup(r.text, 'html.parser')
2.抓取節點(diǎn)
td = soup.find_all('td')
subject = []
for t in td:
if t.string is not None:
subject.append(t.string)
if len(subject) == 5:
subjects.append(subject)
subject = []
保存文件
with open('NYOJ_Subjects.csv', 'w', newline='') as file:
fileWriter = csv.writer(file)
fileWriter.writerow(csvHeaders)
fileWriter.writerows(subjects)
完整的源代碼
URL鏈接中.htm前面的數字是相關(guān)的,所以可以通過(guò)循環(huán)爬取多頁(yè)代碼,找到爬取數據的位置,編寫(xiě)代碼
import requests
from bs4 import BeautifulSoup
import csv
from tqdm import tqdm
Headers = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400'
csvHeaders = ['題號', '難度', '標題', '通過(guò)率', '通過(guò)數/總提交數']
subjects = []
for pages in tqdm(range(1, 11 + 1)):
r = requests.get(
f'http://www.51mxd.cn/problemset.php-page={pages}.htm', Headers)
r.raise_for_status()
r.encoding = 'utf-8'
soup = BeautifulSoup(r.text, 'html.parser')
td = soup.find_all('td')
subject = []
for t in td:
if t.string is not None:
subject.append(t.string)
if len(subject) == 5:
subjects.append(subject)
subject = []
with open('NYOJ_Subjects.csv', 'w', newline='') as file:
fileWriter = csv.writer(file)
fileWriter.writerow(csvHeaders)
fileWriter.writerows(subjects)
運行結果:
查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(南陽(yáng)理工學(xué)院ACM題目信息獲取源碼我們知道瀏覽器查看網(wǎng)頁(yè)時(shí)
)
南洋理工ACM專(zhuān)題信息

獲取源代碼
我們知道,瀏覽器在瀏覽網(wǎng)頁(yè)時(shí),首先會(huì )向服務(wù)器發(fā)送一個(gè)request請求,服務(wù)器會(huì )根據request請求做一些處理,生成一個(gè)response響應返回給瀏覽器,這個(gè)response收錄我們需要的網(wǎng)頁(yè)(或者數據,一般是靜態(tài)的網(wǎng)站或者服務(wù)器端渲染就是直接返回網(wǎng)頁(yè)),那么我們只需要模仿瀏覽器發(fā)送這個(gè)請求給服務(wù)器下載網(wǎng)頁(yè),而然后等待服務(wù)器發(fā)回響應。
1.引入第三方庫
import requests
from bs4 import BeautifulSoup
import csv
from tqdm import tqdm
2.模擬瀏覽器
Headers = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400'
3. 爬網(wǎng)
r = requests.get(
f'http://www.51mxd.cn/problemset.php-page={pages}.htm', Headers)
r.raise_for_status()
r.encoding = 'utf-8'
BeautifulSoup 網(wǎng)絡(luò )分析
學(xué)習了request,了解了偽裝技巧,終于可以爬到一些正常的web源碼(html文檔)了,但這離最后也是最重要的一步——篩選還差得很遠。這個(gè)過(guò)程就像在沙子里淘金一樣。沒(méi)有合適的篩子,你就會(huì )錯過(guò)有價(jià)值的東西,或者做無(wú)用的工作來(lái)篩掉無(wú)用的東西。
淘金者觀(guān)察土壤并制作篩子。對應爬蟲(chóng)字段就是觀(guān)察html,自定義過(guò)濾器。這里其實(shí)是一個(gè)簡(jiǎn)單的抓取 td 標簽

1.初始化
soup = BeautifulSoup(r.text, 'html.parser')
2.抓取節點(diǎn)
td = soup.find_all('td')
subject = []
for t in td:
if t.string is not None:
subject.append(t.string)
if len(subject) == 5:
subjects.append(subject)
subject = []
保存文件
with open('NYOJ_Subjects.csv', 'w', newline='') as file:
fileWriter = csv.writer(file)
fileWriter.writerow(csvHeaders)
fileWriter.writerows(subjects)
完整的源代碼
URL鏈接中.htm前面的數字是相關(guān)的,所以可以通過(guò)循環(huán)爬取多頁(yè)代碼,找到爬取數據的位置,編寫(xiě)代碼
import requests
from bs4 import BeautifulSoup
import csv
from tqdm import tqdm
Headers = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400'
csvHeaders = ['題號', '難度', '標題', '通過(guò)率', '通過(guò)數/總提交數']
subjects = []
for pages in tqdm(range(1, 11 + 1)):
r = requests.get(
f'http://www.51mxd.cn/problemset.php-page={pages}.htm', Headers)
r.raise_for_status()
r.encoding = 'utf-8'
soup = BeautifulSoup(r.text, 'html.parser')
td = soup.find_all('td')
subject = []
for t in td:
if t.string is not None:
subject.append(t.string)
if len(subject) == 5:
subjects.append(subject)
subject = []
with open('NYOJ_Subjects.csv', 'w', newline='') as file:
fileWriter = csv.writer(file)
fileWriter.writerow(csvHeaders)
fileWriter.writerows(subjects)
運行結果:
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(為什么說(shuō)用Python開(kāi)發(fā)爬蟲(chóng)更有優(yōu)勢?Java開(kāi)發(fā)不行嗎?)
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 117 次瀏覽 ? 2022-03-10 00:14
為什么用Python開(kāi)發(fā)爬蟲(chóng)更有優(yōu)勢?不能用Java開(kāi)發(fā)?今天小編就為大家講解一下!
C/C++
各種搜索引擎大多使用C/C++開(kāi)發(fā)爬蟲(chóng),可能是因為搜索引擎爬蟲(chóng)重要的是采集網(wǎng)站信息,對頁(yè)面的解析要求不高。
Python
Python語(yǔ)言具有強大的網(wǎng)絡(luò )功能,可以模擬登錄和解析JavaScript。缺點(diǎn)是網(wǎng)頁(yè)解析。Python 編寫(xiě)程序非常方便,特別是對于專(zhuān)注的爬蟲(chóng)。目標 網(wǎng)站 經(jīng)常更改。使用Python根據目標的變化開(kāi)發(fā)爬蟲(chóng)程序非常方便。
爪哇
Java有很多解析器,對網(wǎng)頁(yè)的解析支持非常好。缺點(diǎn)是網(wǎng)絡(luò )部分支持較差。
對于一般需求,Java 或 Python 都可以完成這項工作。如果需要模擬登錄,選擇Python對抗反爬蟲(chóng)比較方便。如果需要處理復雜的網(wǎng)頁(yè),解析網(wǎng)頁(yè)內容生成結構化數據,或者需要精細解析網(wǎng)頁(yè)內容,可以選擇Java。
選擇 Python 作為實(shí)現爬蟲(chóng)的語(yǔ)言的主要考慮因素是:
(1) 爬取網(wǎng)頁(yè)本身的界面
與其他動(dòng)態(tài)腳本語(yǔ)言(如Perl、Shell)相比,Python的urllib2包提供了更完善的訪(fǎng)問(wèn)web文檔的API;與其他靜態(tài)編程語(yǔ)言(如Java、C#、C++)相比,Python爬取網(wǎng)頁(yè)文檔。界面更簡(jiǎn)潔。
另外,爬取網(wǎng)頁(yè)有時(shí)需要模擬瀏覽器的行為,很多網(wǎng)站被屏蔽用于生硬的爬蟲(chóng)爬取。這時(shí)候我們就需要模擬User Agent的行為來(lái)構造合適的請求,比如模擬用戶(hù)登錄,模擬Session/Cookie的存儲和設置。Python 中有一些優(yōu)秀的第三方包可以為你做這件事,例如 Requests 或 Mechanize。
(2) 爬取后處理
抓取的網(wǎng)頁(yè)通常需要進(jìn)行處理,例如過(guò)濾Html標簽、提取文本等。Python的Beautiful Soup提供了簡(jiǎn)潔的文檔處理功能,可以用極短的代碼完成大部分文檔處理。
其實(shí)很多語(yǔ)言和工具都可以做到以上功能,但是Python可以做到最快最干凈,就像那句“人生苦短,你需要Python”一樣。
(3) 開(kāi)發(fā)效率高
因為爬蟲(chóng)的具體代碼要根據網(wǎng)站進(jìn)行修改,而Python靈活的腳本語(yǔ)言特別適合這個(gè)任務(wù)。
(4) 快速入門(mén)
網(wǎng)上有很多Python教學(xué)資源,方便大家學(xué)習,有問(wèn)題也很容易找到相關(guān)資料。此外,Python 對成熟的爬蟲(chóng)框架也有很強的支持,比如 Scrapy。返回搜狐,查看更多 查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(為什么說(shuō)用Python開(kāi)發(fā)爬蟲(chóng)更有優(yōu)勢?Java開(kāi)發(fā)不行嗎?)
為什么用Python開(kāi)發(fā)爬蟲(chóng)更有優(yōu)勢?不能用Java開(kāi)發(fā)?今天小編就為大家講解一下!

C/C++
各種搜索引擎大多使用C/C++開(kāi)發(fā)爬蟲(chóng),可能是因為搜索引擎爬蟲(chóng)重要的是采集網(wǎng)站信息,對頁(yè)面的解析要求不高。
Python
Python語(yǔ)言具有強大的網(wǎng)絡(luò )功能,可以模擬登錄和解析JavaScript。缺點(diǎn)是網(wǎng)頁(yè)解析。Python 編寫(xiě)程序非常方便,特別是對于專(zhuān)注的爬蟲(chóng)。目標 網(wǎng)站 經(jīng)常更改。使用Python根據目標的變化開(kāi)發(fā)爬蟲(chóng)程序非常方便。
爪哇
Java有很多解析器,對網(wǎng)頁(yè)的解析支持非常好。缺點(diǎn)是網(wǎng)絡(luò )部分支持較差。
對于一般需求,Java 或 Python 都可以完成這項工作。如果需要模擬登錄,選擇Python對抗反爬蟲(chóng)比較方便。如果需要處理復雜的網(wǎng)頁(yè),解析網(wǎng)頁(yè)內容生成結構化數據,或者需要精細解析網(wǎng)頁(yè)內容,可以選擇Java。

選擇 Python 作為實(shí)現爬蟲(chóng)的語(yǔ)言的主要考慮因素是:
(1) 爬取網(wǎng)頁(yè)本身的界面
與其他動(dòng)態(tài)腳本語(yǔ)言(如Perl、Shell)相比,Python的urllib2包提供了更完善的訪(fǎng)問(wèn)web文檔的API;與其他靜態(tài)編程語(yǔ)言(如Java、C#、C++)相比,Python爬取網(wǎng)頁(yè)文檔。界面更簡(jiǎn)潔。
另外,爬取網(wǎng)頁(yè)有時(shí)需要模擬瀏覽器的行為,很多網(wǎng)站被屏蔽用于生硬的爬蟲(chóng)爬取。這時(shí)候我們就需要模擬User Agent的行為來(lái)構造合適的請求,比如模擬用戶(hù)登錄,模擬Session/Cookie的存儲和設置。Python 中有一些優(yōu)秀的第三方包可以為你做這件事,例如 Requests 或 Mechanize。
(2) 爬取后處理
抓取的網(wǎng)頁(yè)通常需要進(jìn)行處理,例如過(guò)濾Html標簽、提取文本等。Python的Beautiful Soup提供了簡(jiǎn)潔的文檔處理功能,可以用極短的代碼完成大部分文檔處理。
其實(shí)很多語(yǔ)言和工具都可以做到以上功能,但是Python可以做到最快最干凈,就像那句“人生苦短,你需要Python”一樣。
(3) 開(kāi)發(fā)效率高
因為爬蟲(chóng)的具體代碼要根據網(wǎng)站進(jìn)行修改,而Python靈活的腳本語(yǔ)言特別適合這個(gè)任務(wù)。
(4) 快速入門(mén)
網(wǎng)上有很多Python教學(xué)資源,方便大家學(xué)習,有問(wèn)題也很容易找到相關(guān)資料。此外,Python 對成熟的爬蟲(chóng)框架也有很強的支持,比如 Scrapy。返回搜狐,查看更多
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(查看更多寫(xiě)博客Python網(wǎng)絡(luò )爬蟲(chóng)反爬源碼分享--蘇飛版)
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 72 次瀏覽 ? 2022-03-10 00:11
阿里云>云棲社區>主題圖>C>c爬蟲(chóng)源碼
推薦活動(dòng):
更多優(yōu)惠>
當前話(huà)題:c網(wǎng)絡(luò )爬蟲(chóng)源碼加入采集
相關(guān)話(huà)題:
C網(wǎng)絡(luò )爬蟲(chóng)源碼相關(guān)博客看更多博文
Python網(wǎng)絡(luò )爬蟲(chóng)反爬破解攻略實(shí)戰
作者:薇薇8128 瀏覽評論:04年前
作者:薇薇,請注明出處。我們經(jīng)常會(huì )寫(xiě)一些網(wǎng)絡(luò )爬蟲(chóng),想必大家都會(huì )有一種感覺(jué),雖然寫(xiě)爬蟲(chóng)不難,但是反爬很難處理,因為大部分網(wǎng)站都有自己的反爬機制,所以我們將更加難以抓取這些數據。但是,對于每一種反爬機制,我們其實(shí)都會(huì )有相應的解決方案。作為一個(gè)爬蟲(chóng),我們,
閱讀全文
C#HttpHelper爬蟲(chóng)源碼分享--蘇飛版
作者:蘇飛2071 瀏覽評論:03年前
簡(jiǎn)介C#HttpHelper實(shí)現了C#HttpWebRequest爬取時(shí)忽略編碼、忽略證書(shū)、忽略cookie的功能,實(shí)現代理的功能。有了它,您可以發(fā)出 Get 和 Post 請求,并且可以輕松設置 cookie、證書(shū)、代理和編碼。你不用擔心這個(gè)問(wèn)題,因為類(lèi)會(huì )自動(dòng)為你識別頁(yè)面
閱讀全文
Python網(wǎng)絡(luò )爬蟲(chóng)抓取極品姐姐的視頻并保存到文件
作者:keitwotest1060 瀏覽評論:04年前
項目描述 使用Python編寫(xiě)一個(gè)網(wǎng)絡(luò )爬蟲(chóng)爬取Best Sister的視頻并保存到文件中使用工具示例 Python2.7.X, pycharm 使用方法 創(chuàng )建視頻爬取Best Sister in pycharm .py 文件,并在當前目錄下創(chuàng )建video文件夾,用于存放采集到的視頻文件,編寫(xiě)代碼,運行
閱讀全文
Java版網(wǎng)絡(luò )爬蟲(chóng)基礎(轉)
作者:developerguy851 瀏覽評論:06年前
網(wǎng)絡(luò )爬蟲(chóng)不僅可以爬取網(wǎng)站網(wǎng)頁(yè)和圖片,甚至可以實(shí)現搶票、網(wǎng)上購買(mǎi)、機票查詢(xún)。這幾天看了一些基礎知識,記錄下來(lái)。網(wǎng)頁(yè)之間的關(guān)系可以看成一個(gè)大圖,圖的遍歷可以分為深度優(yōu)先和廣度優(yōu)先。網(wǎng)絡(luò )爬蟲(chóng)采取的廣度優(yōu)先方式總結如下:2個(gè)數組,一個(gè)
閱讀全文
C# 網(wǎng)絡(luò )爬蟲(chóng)
作者:Street Corner Box 712 查看評論:05 年前
公司的編輯妹需要爬取網(wǎng)頁(yè)的內容,讓我幫我做一個(gè)簡(jiǎn)單的爬取工具。這是抓取網(wǎng)頁(yè)的內容??磥?lái)這對大家來(lái)說(shuō)并不難,不過(guò)這里有一些小改動(dòng),代碼提供,請參考 1 private string GetHttpWebRequest(string url) 2 { 3 Ht
閱讀全文
C#網(wǎng)絡(luò )爬蟲(chóng)--多線(xiàn)程增強版
作者:街角盒飯 688 次瀏覽評論:05 年前
上次給公司的一個(gè)女生做爬蟲(chóng),不是很精致。這次是在公司項目中使用的,所以做了一些改動(dòng)。該函數添加了一個(gè)URL圖片采集,下載,線(xiàn)程處理接口URL圖片下載等。說(shuō)說(shuō)思路:總理在初始網(wǎng)站采集圖片去獲取初始網(wǎng)站的所有內容到初始網(wǎng)站 采集 鏈接并將 采集 的鏈接放入隊列以繼續 采集 圖片
閱讀全文
一篇文章文章教你使用Python網(wǎng)絡(luò )爬蟲(chóng)爬取評論區百度貼吧圖片和視頻
作者:python進(jìn)階26人查看評論:01年前
[一、項目背景]百度貼吧是全球最大的中文交流平臺。你是不是和我一樣,有時(shí)候看到評論區的圖片就想下載?或者觀(guān)看視頻并想下載?今天小編帶大家通過(guò)搜索關(guān)鍵詞,在評論區獲取圖片和視頻。[二、項目目標]實(shí)現貼吧獲取的圖片或視頻可以保存在
閱讀全文
一篇文章文章教你用Python網(wǎng)絡(luò )爬蟲(chóng)搞定差旅攻略
作者:python進(jìn)階13人查看評論:01年前
[一、項目背景] 趣游網(wǎng)提供原創(chuàng )實(shí)用的出境旅游指南、攻略、旅游社區和問(wèn)答平臺,以及智能旅游規劃解決方案,以及簽證、保險、機票、酒店在線(xiàn)預訂、租車(chē)等增值服務(wù)。僑游“鼓勵和幫助中國游客以自己的視角和方式體驗世界”。今天就教大家如何獲取僑友網(wǎng)的城市信息。
閱讀全文 查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(查看更多寫(xiě)博客Python網(wǎng)絡(luò )爬蟲(chóng)反爬源碼分享--蘇飛版)
阿里云>云棲社區>主題圖>C>c爬蟲(chóng)源碼

推薦活動(dòng):
更多優(yōu)惠>
當前話(huà)題:c網(wǎng)絡(luò )爬蟲(chóng)源碼加入采集
相關(guān)話(huà)題:
C網(wǎng)絡(luò )爬蟲(chóng)源碼相關(guān)博客看更多博文
Python網(wǎng)絡(luò )爬蟲(chóng)反爬破解攻略實(shí)戰

作者:薇薇8128 瀏覽評論:04年前
作者:薇薇,請注明出處。我們經(jīng)常會(huì )寫(xiě)一些網(wǎng)絡(luò )爬蟲(chóng),想必大家都會(huì )有一種感覺(jué),雖然寫(xiě)爬蟲(chóng)不難,但是反爬很難處理,因為大部分網(wǎng)站都有自己的反爬機制,所以我們將更加難以抓取這些數據。但是,對于每一種反爬機制,我們其實(shí)都會(huì )有相應的解決方案。作為一個(gè)爬蟲(chóng),我們,
閱讀全文
C#HttpHelper爬蟲(chóng)源碼分享--蘇飛版

作者:蘇飛2071 瀏覽評論:03年前
簡(jiǎn)介C#HttpHelper實(shí)現了C#HttpWebRequest爬取時(shí)忽略編碼、忽略證書(shū)、忽略cookie的功能,實(shí)現代理的功能。有了它,您可以發(fā)出 Get 和 Post 請求,并且可以輕松設置 cookie、證書(shū)、代理和編碼。你不用擔心這個(gè)問(wèn)題,因為類(lèi)會(huì )自動(dòng)為你識別頁(yè)面
閱讀全文
Python網(wǎng)絡(luò )爬蟲(chóng)抓取極品姐姐的視頻并保存到文件

作者:keitwotest1060 瀏覽評論:04年前
項目描述 使用Python編寫(xiě)一個(gè)網(wǎng)絡(luò )爬蟲(chóng)爬取Best Sister的視頻并保存到文件中使用工具示例 Python2.7.X, pycharm 使用方法 創(chuàng )建視頻爬取Best Sister in pycharm .py 文件,并在當前目錄下創(chuàng )建video文件夾,用于存放采集到的視頻文件,編寫(xiě)代碼,運行
閱讀全文
Java版網(wǎng)絡(luò )爬蟲(chóng)基礎(轉)

作者:developerguy851 瀏覽評論:06年前
網(wǎng)絡(luò )爬蟲(chóng)不僅可以爬取網(wǎng)站網(wǎng)頁(yè)和圖片,甚至可以實(shí)現搶票、網(wǎng)上購買(mǎi)、機票查詢(xún)。這幾天看了一些基礎知識,記錄下來(lái)。網(wǎng)頁(yè)之間的關(guān)系可以看成一個(gè)大圖,圖的遍歷可以分為深度優(yōu)先和廣度優(yōu)先。網(wǎng)絡(luò )爬蟲(chóng)采取的廣度優(yōu)先方式總結如下:2個(gè)數組,一個(gè)
閱讀全文
C# 網(wǎng)絡(luò )爬蟲(chóng)

作者:Street Corner Box 712 查看評論:05 年前
公司的編輯妹需要爬取網(wǎng)頁(yè)的內容,讓我幫我做一個(gè)簡(jiǎn)單的爬取工具。這是抓取網(wǎng)頁(yè)的內容??磥?lái)這對大家來(lái)說(shuō)并不難,不過(guò)這里有一些小改動(dòng),代碼提供,請參考 1 private string GetHttpWebRequest(string url) 2 { 3 Ht
閱讀全文
C#網(wǎng)絡(luò )爬蟲(chóng)--多線(xiàn)程增強版

作者:街角盒飯 688 次瀏覽評論:05 年前
上次給公司的一個(gè)女生做爬蟲(chóng),不是很精致。這次是在公司項目中使用的,所以做了一些改動(dòng)。該函數添加了一個(gè)URL圖片采集,下載,線(xiàn)程處理接口URL圖片下載等。說(shuō)說(shuō)思路:總理在初始網(wǎng)站采集圖片去獲取初始網(wǎng)站的所有內容到初始網(wǎng)站 采集 鏈接并將 采集 的鏈接放入隊列以繼續 采集 圖片
閱讀全文
一篇文章文章教你使用Python網(wǎng)絡(luò )爬蟲(chóng)爬取評論區百度貼吧圖片和視頻

作者:python進(jìn)階26人查看評論:01年前
[一、項目背景]百度貼吧是全球最大的中文交流平臺。你是不是和我一樣,有時(shí)候看到評論區的圖片就想下載?或者觀(guān)看視頻并想下載?今天小編帶大家通過(guò)搜索關(guān)鍵詞,在評論區獲取圖片和視頻。[二、項目目標]實(shí)現貼吧獲取的圖片或視頻可以保存在
閱讀全文
一篇文章文章教你用Python網(wǎng)絡(luò )爬蟲(chóng)搞定差旅攻略

作者:python進(jìn)階13人查看評論:01年前
[一、項目背景] 趣游網(wǎng)提供原創(chuàng )實(shí)用的出境旅游指南、攻略、旅游社區和問(wèn)答平臺,以及智能旅游規劃解決方案,以及簽證、保險、機票、酒店在線(xiàn)預訂、租車(chē)等增值服務(wù)。僑游“鼓勵和幫助中國游客以自己的視角和方式體驗世界”。今天就教大家如何獲取僑友網(wǎng)的城市信息。
閱讀全文
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據( 風(fēng)中蹦迪03-0803:07閱讀4網(wǎng)站SEO優(yōu)化關(guān)注實(shí)戰)
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 59 次瀏覽 ? 2022-03-09 20:14
風(fēng)中蹦迪03-0803:07閱讀4網(wǎng)站SEO優(yōu)化關(guān)注實(shí)戰)
隨風(fēng)起舞
03-08 03:07 閱讀4 網(wǎng)站SEO優(yōu)化
專(zhuān)注于
【網(wǎng)絡(luò )爬蟲(chóng)學(xué)習】實(shí)戰,爬取網(wǎng)頁(yè)和貼吧數據
戰斗一
抓取您想要的網(wǎng)頁(yè)并將其保存到本地計算機。
首先我們簡(jiǎn)單分析下要編寫(xiě)的爬蟲(chóng)程序,可以分為以下三個(gè)部分:
理清邏輯后,我們就可以正式編寫(xiě)爬蟲(chóng)程序了。
導入所需模塊
from urllib import request, parse
連接 URL 地址
定義 URL 變量并連接 url 地址。代碼如下所示:
url = ‘http://www.baidu.com/s?wd={}‘
word = input(‘請輸入想要搜索的內容:‘)
params = parse.quote(word)
full_url = url.format(params)
向 URL 發(fā)送請求
發(fā)送請求主要分為以下幾個(gè)步驟:
代碼如下所示:
# 重構請求頭
headers = {
‘User-Agent‘:
‘Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0‘
}
# 創(chuàng )建請求對應
req = request.Request(url=full_url, headers=headers)
# 獲取響應對象
res = request.urlopen(req)
# 獲取響應內容
html = res.read().decode(‘utf-8‘)
另存為本地文件
將爬取的照片保存到本地,這里需要使用Python編程文件IO操作,代碼如下:
filename = word + ‘.html‘
with open(filename, ‘w‘, encoding=‘utf-8‘) as f:
f.write(html)
完整的程序如下所示:
from urllib import request, parse
# 1.拼url地址
url = ‘http://www.baidu.com/s?wd={}‘
word = input(‘請輸入想要搜索的內容:‘)
params = parse.quote(word)
full_url = url.format(params)
# 2.發(fā)請求保存到本地
# 重構請求頭
headers = {
‘User-Agent‘:
‘Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0‘
}
# 創(chuàng )建請求對應
req = request.Request(url=full_url, headers=headers)
# 獲取響應對象
res = request.urlopen(req)
# 獲取響應內容
html = res.read().decode(‘utf-8‘)
# 3.保存文件至當前目錄
filename = word + ‘.html‘
with open(filename, ‘w‘, encoding=‘utf-8‘) as f:
f.write(html)
嘗試運行程序,進(jìn)入RioTianの博客園,確認搜索,在當前工作目錄下會(huì )找到“RioTianの博客園.html”文件。
函數式編程修飾符
Python函數式編程可以讓程序的思路更清晰,更容易理解。接下來(lái),利用函數式編程的思想,對上面的代碼進(jìn)行修改。
定義相應的函數,調用該函數執行爬蟲(chóng)程序。修改后的代碼如下所示:
from urllib import request, parse
# 拼接URL地址
def get_url(word):
url = ‘http://www.baidu.com/s?{}‘
# 此處使用urlencode()進(jìn)行編碼
params = parse.urlencode({‘wd‘: word})
url = url.format(params)
return url
# 發(fā)請求,保存本地文件
def request_url(url, filename):
headers = {
‘User-Agent‘:
‘Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0‘
}
# 請求對象 + 響應對象 + 提取內容
req = request.Request(url=url, headers=headers)
res = request.urlopen(req)
html = res.read().decode(‘utf-8‘)
# 保存文件至本地
with open(filename, ‘w‘, encoding=‘utf-8‘) as f:
f.write(html)
# 主程序入口
if __name__ == ‘__main__‘:
word = input(‘請輸入搜索內容:‘)
url = get_url(word)
filename = word + ‘.html‘
request_url(url, filename)
除了使用函數式編程,還可以使用面向對象的編程方式(實(shí)戰二),后續內容會(huì )介紹。
第二幕
爬百度貼吧(Python爬蟲(chóng),編程,只抓取貼吧的前5頁(yè)。
確定頁(yè)面類(lèi)型
通過(guò)簡(jiǎn)單的分析,我們可以知道要爬取的頁(yè)面是靜態(tài)網(wǎng)頁(yè),分析方法很簡(jiǎn)單:打開(kāi)百度貼吧,搜索“Python爬蟲(chóng)”,復制其中任意一條信息出現的頁(yè)面,如“爬蟲(chóng)需要http代理”,然后右鍵選擇查看源代碼,在源代碼頁(yè)面使用Ctrl+F快捷鍵搜索剛剛復制的數據,如下圖:
從上圖可以看出,頁(yè)面中的所有信息都收錄在源頁(yè)面中,不需要單獨從數據庫中加載數據,所以頁(yè)面是靜態(tài)頁(yè)面。
找出 URL 變化的規律性
接下來(lái),查找要抓取的頁(yè)面的 URL 模式。搜索“Python爬蟲(chóng)”后,貼吧的首頁(yè)網(wǎng)址如下:
https://tieba.baidu.com/f?ie=utf-8&kw=python爬蟲(chóng)&fr=search
點(diǎn)擊第二頁(yè),其url信息如下:
https://tieba.baidu.com/f?kw=python爬蟲(chóng)&ie=utf-8&pn=50
點(diǎn)擊第三頁(yè),url信息如下:
https://tieba.baidu.com/f?kw=python爬蟲(chóng)&ie=utf-8&pn=100
再次點(diǎn)擊第一頁(yè),url信息如下:
https://tieba.baidu.com/f?kw=python爬蟲(chóng)&ie=utf-8&pn=0
如果還是不能確定,可以繼續多瀏覽幾頁(yè)。最后發(fā)現url有兩個(gè)查詢(xún)參數kw和pn,pn參數有規律是這樣的:
第n頁(yè):pn=(n-1)*50
#參數params
pn=(page-1)*50
params={
‘kw‘:name,
‘pn‘:str(pn)
}
url地址可以簡(jiǎn)寫(xiě)為:
https://tieba.baidu.com/f?kw=python爬蟲(chóng)&pn=450
編寫(xiě)爬蟲(chóng)
爬蟲(chóng)程序以類(lèi)的形式編寫(xiě),在類(lèi)下編寫(xiě)不同的功能函數。代碼如下:
from urllib import request,parse
import time
import random
from ua_info import ua_list #使用自定義的ua池
#定義一個(gè)爬蟲(chóng)類(lèi)
class TiebaSpider(object):
#初始化url屬性
def __init__(self):
self.url=‘http://tieba.baidu.com/f?{}‘
# 1.請求函數,得到頁(yè)面,傳統三步
def get_html(self,url):
req=request.Request(url=url,headers={‘User-Agent‘:random.choice(ua_list)})
res=request.urlopen(req)
#windows會(huì )存在亂碼問(wèn)題,需要使用 gbk解碼,并使用ignore忽略不能處理的字節
#linux不會(huì )存在上述問(wèn)題,可以直接使用decode(‘utf-8‘)解碼
html=res.read().decode("gbk","ignore")
return html
# 2.解析函數,此處代碼暫時(shí)省略,還沒(méi)介紹解析模塊
def parse_html(self):
pass
# 3.保存文件函數
def save_html(self,filename,html):
with open(filename,‘w‘) as f:
f.write(html)
# 4.入口函數
def run(self):
name=input(‘輸入貼吧名:‘)
begin=int(input(‘輸入起始頁(yè):‘))
stop=int(input(‘輸入終止頁(yè):‘))
# +1 操作保證能夠取到整數
for page in range(begin,stop+1):
pn=(page-1)*50
params={
‘kw‘:name,
‘pn‘:str(pn)
}
#拼接URL地址
params=parse.urlencode(params)
url=self.url.format(params)
#發(fā)請求
html=self.get_html(url)
#定義路徑
filename=‘{}-{}頁(yè).html‘.format(name,page)
self.save_html(filename,html)
#提示
print(‘第%d頁(yè)抓取成功‘%page)
#每爬取一個(gè)頁(yè)面隨機休眠1-2秒鐘的時(shí)間
time.sleep(random.randint(1,2))
#以腳本的形式啟動(dòng)爬蟲(chóng)
if __name__==‘__main__‘:
start=time.time()
spider=TiebaSpider() #實(shí)例化一個(gè)對象spider
spider.run() #調用入口函數
end=time.time()
#查看程序執行時(shí)間
print(‘執行時(shí)間:%.2f‘%(end-start)) #爬蟲(chóng)執行時(shí)間
程序執行后,爬取的文件會(huì )保存到Pycharm的當前工作目錄下,輸出為:
輸入貼吧名:python爬蟲(chóng)
輸入起始頁(yè):1
輸入終止頁(yè):2
第1頁(yè)抓取成功
第2頁(yè)抓取成功
執行時(shí)間:12.25
以面向對象的方式編寫(xiě)爬蟲(chóng)程序時(shí),思路簡(jiǎn)單,邏輯清晰,非常容易理解。上述代碼主要包括四個(gè)功能函數,分別負責不同的功能,總結如下:
1) 請求函數
request函數的最終結果是返回一個(gè)HTML對象,方便后續函數調用。
2) 分析函數
解析函數用于解析 HTML 頁(yè)面。常見(jiàn)的解析模塊有正則解析模塊和bs4解析模塊。通過(guò)分析頁(yè)面,提取出需要的數據,在后續內容中會(huì )詳細介紹。
3) 保存數據功能
該函數負責將采集到的數據保存到數據庫,如MySQL、MongoDB等,或者保存為文件格式,如csv、txt、excel等。
4) 入口函數
入口函數作為整個(gè)爬蟲(chóng)程序的橋梁,通過(guò)調用不同的函數函數實(shí)現最終的數據抓取。入口函數的主要任務(wù)是組織數據,比如要搜索的貼吧的名字,編碼url參數,拼接url地址,定義文件存儲路徑。
履帶結構
用面向對象的方式編寫(xiě)爬蟲(chóng)程序時(shí),邏輯結構是比較固定的,總結如下:
# 程序結構
class xxxSpider(object):
def __init__(self):
# 定義常用變量,比如url或計數變量等
def get_html(self):
# 獲取響應內容函數,使用隨機User-Agent
def parse_html(self):
# 使用正則表達式來(lái)解析頁(yè)面,提取數據
def write_html(self):
# 將提取的數據按要求保存,csv、MySQL數據庫等
def run(self):
# 主函數,用來(lái)控制整體邏輯
if __name__ == ‘__main__‘:
# 程序開(kāi)始運行時(shí)間
spider = xxxSpider()
spider.run()
注意:掌握以上編程邏輯將有助于您后續的學(xué)習。
爬蟲(chóng)隨機休眠
在入口函數代碼中,收錄以下代碼:
# 每爬取一個(gè)頁(yè)面隨機休眠1-2秒鐘的時(shí)間
time.sleep(random.randint(1,2))
爬蟲(chóng)訪(fǎng)問(wèn) 網(wǎng)站 會(huì )非???,這與正常的人類(lèi)點(diǎn)擊行為非常不符。因此,通過(guò)隨機休眠,爬蟲(chóng)可以模仿人類(lèi)點(diǎn)擊網(wǎng)站,使得網(wǎng)站不容易察覺(jué)是爬蟲(chóng)訪(fǎng)問(wèn)網(wǎng)站,但這樣做的代價(jià)是影響程序的執行效率。
焦點(diǎn)爬蟲(chóng)是一個(gè)執行效率低的程序,提高其性能是業(yè)界一直關(guān)注的問(wèn)題。于是,高效的 Python 爬蟲(chóng)框架 Scrapy 應運而生。
原版的: 查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(
風(fēng)中蹦迪03-0803:07閱讀4網(wǎng)站SEO優(yōu)化關(guān)注實(shí)戰)
隨風(fēng)起舞
03-08 03:07 閱讀4 網(wǎng)站SEO優(yōu)化
專(zhuān)注于
【網(wǎng)絡(luò )爬蟲(chóng)學(xué)習】實(shí)戰,爬取網(wǎng)頁(yè)和貼吧數據

戰斗一
抓取您想要的網(wǎng)頁(yè)并將其保存到本地計算機。
首先我們簡(jiǎn)單分析下要編寫(xiě)的爬蟲(chóng)程序,可以分為以下三個(gè)部分:
理清邏輯后,我們就可以正式編寫(xiě)爬蟲(chóng)程序了。
導入所需模塊
from urllib import request, parse
連接 URL 地址
定義 URL 變量并連接 url 地址。代碼如下所示:
url = ‘http://www.baidu.com/s?wd={}‘
word = input(‘請輸入想要搜索的內容:‘)
params = parse.quote(word)
full_url = url.format(params)
向 URL 發(fā)送請求
發(fā)送請求主要分為以下幾個(gè)步驟:
代碼如下所示:
# 重構請求頭
headers = {
‘User-Agent‘:
‘Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0‘
}
# 創(chuàng )建請求對應
req = request.Request(url=full_url, headers=headers)
# 獲取響應對象
res = request.urlopen(req)
# 獲取響應內容
html = res.read().decode(‘utf-8‘)
另存為本地文件
將爬取的照片保存到本地,這里需要使用Python編程文件IO操作,代碼如下:
filename = word + ‘.html‘
with open(filename, ‘w‘, encoding=‘utf-8‘) as f:
f.write(html)
完整的程序如下所示:
from urllib import request, parse
# 1.拼url地址
url = ‘http://www.baidu.com/s?wd={}‘
word = input(‘請輸入想要搜索的內容:‘)
params = parse.quote(word)
full_url = url.format(params)
# 2.發(fā)請求保存到本地
# 重構請求頭
headers = {
‘User-Agent‘:
‘Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0‘
}
# 創(chuàng )建請求對應
req = request.Request(url=full_url, headers=headers)
# 獲取響應對象
res = request.urlopen(req)
# 獲取響應內容
html = res.read().decode(‘utf-8‘)
# 3.保存文件至當前目錄
filename = word + ‘.html‘
with open(filename, ‘w‘, encoding=‘utf-8‘) as f:
f.write(html)
嘗試運行程序,進(jìn)入RioTianの博客園,確認搜索,在當前工作目錄下會(huì )找到“RioTianの博客園.html”文件。
函數式編程修飾符
Python函數式編程可以讓程序的思路更清晰,更容易理解。接下來(lái),利用函數式編程的思想,對上面的代碼進(jìn)行修改。
定義相應的函數,調用該函數執行爬蟲(chóng)程序。修改后的代碼如下所示:
from urllib import request, parse
# 拼接URL地址
def get_url(word):
url = ‘http://www.baidu.com/s?{}‘
# 此處使用urlencode()進(jìn)行編碼
params = parse.urlencode({‘wd‘: word})
url = url.format(params)
return url
# 發(fā)請求,保存本地文件
def request_url(url, filename):
headers = {
‘User-Agent‘:
‘Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0‘
}
# 請求對象 + 響應對象 + 提取內容
req = request.Request(url=url, headers=headers)
res = request.urlopen(req)
html = res.read().decode(‘utf-8‘)
# 保存文件至本地
with open(filename, ‘w‘, encoding=‘utf-8‘) as f:
f.write(html)
# 主程序入口
if __name__ == ‘__main__‘:
word = input(‘請輸入搜索內容:‘)
url = get_url(word)
filename = word + ‘.html‘
request_url(url, filename)
除了使用函數式編程,還可以使用面向對象的編程方式(實(shí)戰二),后續內容會(huì )介紹。
第二幕
爬百度貼吧(Python爬蟲(chóng),編程,只抓取貼吧的前5頁(yè)。
確定頁(yè)面類(lèi)型
通過(guò)簡(jiǎn)單的分析,我們可以知道要爬取的頁(yè)面是靜態(tài)網(wǎng)頁(yè),分析方法很簡(jiǎn)單:打開(kāi)百度貼吧,搜索“Python爬蟲(chóng)”,復制其中任意一條信息出現的頁(yè)面,如“爬蟲(chóng)需要http代理”,然后右鍵選擇查看源代碼,在源代碼頁(yè)面使用Ctrl+F快捷鍵搜索剛剛復制的數據,如下圖:
從上圖可以看出,頁(yè)面中的所有信息都收錄在源頁(yè)面中,不需要單獨從數據庫中加載數據,所以頁(yè)面是靜態(tài)頁(yè)面。
找出 URL 變化的規律性
接下來(lái),查找要抓取的頁(yè)面的 URL 模式。搜索“Python爬蟲(chóng)”后,貼吧的首頁(yè)網(wǎng)址如下:
https://tieba.baidu.com/f?ie=utf-8&kw=python爬蟲(chóng)&fr=search
點(diǎn)擊第二頁(yè),其url信息如下:
https://tieba.baidu.com/f?kw=python爬蟲(chóng)&ie=utf-8&pn=50
點(diǎn)擊第三頁(yè),url信息如下:
https://tieba.baidu.com/f?kw=python爬蟲(chóng)&ie=utf-8&pn=100
再次點(diǎn)擊第一頁(yè),url信息如下:
https://tieba.baidu.com/f?kw=python爬蟲(chóng)&ie=utf-8&pn=0
如果還是不能確定,可以繼續多瀏覽幾頁(yè)。最后發(fā)現url有兩個(gè)查詢(xún)參數kw和pn,pn參數有規律是這樣的:
第n頁(yè):pn=(n-1)*50
#參數params
pn=(page-1)*50
params={
‘kw‘:name,
‘pn‘:str(pn)
}
url地址可以簡(jiǎn)寫(xiě)為:
https://tieba.baidu.com/f?kw=python爬蟲(chóng)&pn=450
編寫(xiě)爬蟲(chóng)
爬蟲(chóng)程序以類(lèi)的形式編寫(xiě),在類(lèi)下編寫(xiě)不同的功能函數。代碼如下:
from urllib import request,parse
import time
import random
from ua_info import ua_list #使用自定義的ua池
#定義一個(gè)爬蟲(chóng)類(lèi)
class TiebaSpider(object):
#初始化url屬性
def __init__(self):
self.url=‘http://tieba.baidu.com/f?{}‘
# 1.請求函數,得到頁(yè)面,傳統三步
def get_html(self,url):
req=request.Request(url=url,headers={‘User-Agent‘:random.choice(ua_list)})
res=request.urlopen(req)
#windows會(huì )存在亂碼問(wèn)題,需要使用 gbk解碼,并使用ignore忽略不能處理的字節
#linux不會(huì )存在上述問(wèn)題,可以直接使用decode(‘utf-8‘)解碼
html=res.read().decode("gbk","ignore")
return html
# 2.解析函數,此處代碼暫時(shí)省略,還沒(méi)介紹解析模塊
def parse_html(self):
pass
# 3.保存文件函數
def save_html(self,filename,html):
with open(filename,‘w‘) as f:
f.write(html)
# 4.入口函數
def run(self):
name=input(‘輸入貼吧名:‘)
begin=int(input(‘輸入起始頁(yè):‘))
stop=int(input(‘輸入終止頁(yè):‘))
# +1 操作保證能夠取到整數
for page in range(begin,stop+1):
pn=(page-1)*50
params={
‘kw‘:name,
‘pn‘:str(pn)
}
#拼接URL地址
params=parse.urlencode(params)
url=self.url.format(params)
#發(fā)請求
html=self.get_html(url)
#定義路徑
filename=‘{}-{}頁(yè).html‘.format(name,page)
self.save_html(filename,html)
#提示
print(‘第%d頁(yè)抓取成功‘%page)
#每爬取一個(gè)頁(yè)面隨機休眠1-2秒鐘的時(shí)間
time.sleep(random.randint(1,2))
#以腳本的形式啟動(dòng)爬蟲(chóng)
if __name__==‘__main__‘:
start=time.time()
spider=TiebaSpider() #實(shí)例化一個(gè)對象spider
spider.run() #調用入口函數
end=time.time()
#查看程序執行時(shí)間
print(‘執行時(shí)間:%.2f‘%(end-start)) #爬蟲(chóng)執行時(shí)間
程序執行后,爬取的文件會(huì )保存到Pycharm的當前工作目錄下,輸出為:
輸入貼吧名:python爬蟲(chóng)
輸入起始頁(yè):1
輸入終止頁(yè):2
第1頁(yè)抓取成功
第2頁(yè)抓取成功
執行時(shí)間:12.25
以面向對象的方式編寫(xiě)爬蟲(chóng)程序時(shí),思路簡(jiǎn)單,邏輯清晰,非常容易理解。上述代碼主要包括四個(gè)功能函數,分別負責不同的功能,總結如下:
1) 請求函數
request函數的最終結果是返回一個(gè)HTML對象,方便后續函數調用。
2) 分析函數
解析函數用于解析 HTML 頁(yè)面。常見(jiàn)的解析模塊有正則解析模塊和bs4解析模塊。通過(guò)分析頁(yè)面,提取出需要的數據,在后續內容中會(huì )詳細介紹。
3) 保存數據功能
該函數負責將采集到的數據保存到數據庫,如MySQL、MongoDB等,或者保存為文件格式,如csv、txt、excel等。
4) 入口函數
入口函數作為整個(gè)爬蟲(chóng)程序的橋梁,通過(guò)調用不同的函數函數實(shí)現最終的數據抓取。入口函數的主要任務(wù)是組織數據,比如要搜索的貼吧的名字,編碼url參數,拼接url地址,定義文件存儲路徑。
履帶結構
用面向對象的方式編寫(xiě)爬蟲(chóng)程序時(shí),邏輯結構是比較固定的,總結如下:
# 程序結構
class xxxSpider(object):
def __init__(self):
# 定義常用變量,比如url或計數變量等
def get_html(self):
# 獲取響應內容函數,使用隨機User-Agent
def parse_html(self):
# 使用正則表達式來(lái)解析頁(yè)面,提取數據
def write_html(self):
# 將提取的數據按要求保存,csv、MySQL數據庫等
def run(self):
# 主函數,用來(lái)控制整體邏輯
if __name__ == ‘__main__‘:
# 程序開(kāi)始運行時(shí)間
spider = xxxSpider()
spider.run()
注意:掌握以上編程邏輯將有助于您后續的學(xué)習。
爬蟲(chóng)隨機休眠
在入口函數代碼中,收錄以下代碼:
# 每爬取一個(gè)頁(yè)面隨機休眠1-2秒鐘的時(shí)間
time.sleep(random.randint(1,2))
爬蟲(chóng)訪(fǎng)問(wèn) 網(wǎng)站 會(huì )非???,這與正常的人類(lèi)點(diǎn)擊行為非常不符。因此,通過(guò)隨機休眠,爬蟲(chóng)可以模仿人類(lèi)點(diǎn)擊網(wǎng)站,使得網(wǎng)站不容易察覺(jué)是爬蟲(chóng)訪(fǎng)問(wèn)網(wǎng)站,但這樣做的代價(jià)是影響程序的執行效率。
焦點(diǎn)爬蟲(chóng)是一個(gè)執行效率低的程序,提高其性能是業(yè)界一直關(guān)注的問(wèn)題。于是,高效的 Python 爬蟲(chóng)框架 Scrapy 應運而生。
原版的:
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(【每日一題】抓取網(wǎng)頁(yè)數據(模擬訪(fǎng)問(wèn)))
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 99 次瀏覽 ? 2022-03-09 16:06
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(模擬訪(fǎng)問(wèn)),保存數據庫:oracle、mysql等:兩種方式,一種是批量重復查詢(xún),一種是join。
二、提取多份數據批量重復查詢(xún):1.先明確下choosewithundefined_scans的意思:choosewithundefined_scans包含兩個(gè)undefined_width參數,它表示當前網(wǎng)頁(yè)不存在的重復的頁(yè)數,每個(gè)頁(yè)面都會(huì )有十萬(wàn)個(gè)頁(yè)面。查詢(xún)的是總頁(yè)數。2.如果choosewithundefined_scans沒(méi)有參數,表示指定可以查詢(xún)的頁(yè)面數。
例如查詢(xún)的是總頁(yè)數。3.總頁(yè)數是203000+,那就說(shuō)明總共有9000萬(wàn)頁(yè)面4.準備數據:獲取總頁(yè)數數據庫createprogram"jdbcusernameclassprogram:cn-simple-username://admin";數據庫表格test_logimportorg.apache.hibernate.hibernate.connector.oracle.util.hibernateconnector23;引用的數據庫為mysql:jdbc[initialization=mysqlstandardmvcframework]{"name":"jdbc","username":"simplename","password":"jdbc://admin//","table":"com.xxx.xxx.account","type":"simple","auto_increment":10,"names":["account","account1","account2"]}5.業(yè)務(wù)邏輯:判斷總頁(yè)數量,當總頁(yè)數為203000+就停止并行傳輸,如果不為203000+就向上傳送,如果203000+就返回4007,但是實(shí)際true,說(shuō)明總頁(yè)數低于203000+則不存在,返回4008。
prepareview28second。javapublicclasspreparepoint28second{privatestaticfinalint[]hundred=1000000;privatestaticfinalint[]dayofweek=600000;privatestaticfinalint[]yearofweek=4000000;privatestaticfinalint[]username=null;privatestaticfinalint[]password=null;privatestaticfinalint[]table=null;privatestaticfinalbooleanredirectversion="001";privatestaticfinalvoidfieldschema_createparameter(voidschema(voidresourcea)newvoid(voidfield。
1));privatestaticfinalvoidschemaformat_schema(voidschema(voidfield
1)newvoid(voidfield
2));privatestaticfinalvoidschemaformat2(voidschema(voidfield
2)newvoid(voidfield
3));privatestaticfinalbooleanusername2011=false;privatestaticfinalvoidusername2012=false;privatestaticfinalvoidusername2013=false;privatestaticfinal 查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(【每日一題】抓取網(wǎng)頁(yè)數據(模擬訪(fǎng)問(wèn)))
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(模擬訪(fǎng)問(wèn)),保存數據庫:oracle、mysql等:兩種方式,一種是批量重復查詢(xún),一種是join。
二、提取多份數據批量重復查詢(xún):1.先明確下choosewithundefined_scans的意思:choosewithundefined_scans包含兩個(gè)undefined_width參數,它表示當前網(wǎng)頁(yè)不存在的重復的頁(yè)數,每個(gè)頁(yè)面都會(huì )有十萬(wàn)個(gè)頁(yè)面。查詢(xún)的是總頁(yè)數。2.如果choosewithundefined_scans沒(méi)有參數,表示指定可以查詢(xún)的頁(yè)面數。
例如查詢(xún)的是總頁(yè)數。3.總頁(yè)數是203000+,那就說(shuō)明總共有9000萬(wàn)頁(yè)面4.準備數據:獲取總頁(yè)數數據庫createprogram"jdbcusernameclassprogram:cn-simple-username://admin";數據庫表格test_logimportorg.apache.hibernate.hibernate.connector.oracle.util.hibernateconnector23;引用的數據庫為mysql:jdbc[initialization=mysqlstandardmvcframework]{"name":"jdbc","username":"simplename","password":"jdbc://admin//","table":"com.xxx.xxx.account","type":"simple","auto_increment":10,"names":["account","account1","account2"]}5.業(yè)務(wù)邏輯:判斷總頁(yè)數量,當總頁(yè)數為203000+就停止并行傳輸,如果不為203000+就向上傳送,如果203000+就返回4007,但是實(shí)際true,說(shuō)明總頁(yè)數低于203000+則不存在,返回4008。
prepareview28second。javapublicclasspreparepoint28second{privatestaticfinalint[]hundred=1000000;privatestaticfinalint[]dayofweek=600000;privatestaticfinalint[]yearofweek=4000000;privatestaticfinalint[]username=null;privatestaticfinalint[]password=null;privatestaticfinalint[]table=null;privatestaticfinalbooleanredirectversion="001";privatestaticfinalvoidfieldschema_createparameter(voidschema(voidresourcea)newvoid(voidfield。
1));privatestaticfinalvoidschemaformat_schema(voidschema(voidfield
1)newvoid(voidfield
2));privatestaticfinalvoidschemaformat2(voidschema(voidfield
2)newvoid(voidfield
3));privatestaticfinalbooleanusername2011=false;privatestaticfinalvoidusername2012=false;privatestaticfinalvoidusername2013=false;privatestaticfinal
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據( 兩個(gè)重要的包()預處理器定義(_szbuffer))
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 56 次瀏覽 ? 2022-03-09 01:15
兩個(gè)重要的包()預處理器定義(_szbuffer))
在windows下的C++通過(guò)Http協(xié)議實(shí)現對網(wǎng)頁(yè)的內容抓?。?br /> 首先介紹兩個(gè)重要的包(一般是linux下的開(kāi)源數據包,windows下的動(dòng)態(tài)鏈接庫dll):curl包和pthreads_dll,其中curl包被解釋為命令行瀏覽器,由調用curl_easy_setopt等內置函數可以實(shí)現對特定網(wǎng)頁(yè)內容的獲?。ㄒ_編譯導入的curl鏈接庫,需要另外一個(gè)包C-ares)。pthreads 是一個(gè)多線(xiàn)程控制包,其中包括互斥變量的鎖定和解鎖。程序進(jìn)程分配等功能。
下載地址:點(diǎn)擊打開(kāi)鏈接。其中,正確導入外部動(dòng)態(tài)鏈接庫需要步驟:1.Project->Properties->Configuration Properties->C/C++->General->Additional Include Directories(添加include的路徑),2.Project- >Properties->Configuration Properties->Linker->General->Additional Library Directory(添加lib收錄的路徑);3、在Linker->Input->Additional Dependencies(添加了libcurld.lib;pthreadVC2.lib;ws2_3 2.lib;winmm.lib;wldap32.lib;areslib.lib) 4 , 在 c/c++->預處理器->預處理器定義(_CONSOLE;BUILDING_LIBCURL;HTTP_ONLY)
具體實(shí)現過(guò)程介紹:
1:自定義hashTable結構,存放獲取到的字符串字符。以hashTable類(lèi)的形式實(shí)現,包括hash表集合類(lèi)型,以及add、find等幾個(gè)常用的字符串hash函數
代碼:
///HashTable.h
#ifndef HashTable_H
#define HashTable_H
#include
#include
#include
class HashTable
{
public:
HashTable(void);
~HashTable(void);
unsigned int ForceAdd(const std::string& str);
unsigned int Find(const std::string& str);
/*string的常見(jiàn)的hash方式*/
unsigned int RSHash(const std::string& str);
unsigned int JSHash (const std::string& str);
unsigned int PJWHash (const std::string& str);
unsigned int ELFHash (const std::string& str);
unsigned int BKDRHash(const std::string& str);
unsigned int SDBMHash(const std::string& str);
unsigned int DJBHash (const std::string& str);
unsigned int DEKHash (const std::string& str);
unsigned int BPHash (const std::string& str);
unsigned int FNVHash (const std::string& str);
unsigned int APHash (const std::string& str);
private:
std::set HashFunctionResultSet;
std::vector hhh;
};
#endif
/////HashTable.cpp
#include "HashTable.h"
HashTable::HashTable(void)
{
}
HashTable::~HashTable(void)
{
}
unsigned int HashTable::ForceAdd(const std::string& str)
{
unsigned int i=ELFHash(str);
HashFunctionResultSet.insert(i);
return i;
}
unsigned int HashTable::Find(const std::string& str)
{
int ff=hhh.size();
const unsigned int i=ELFHash(str);
std::set::const_iterator it;
if(HashFunctionResultSet.size()>0)
{
it=HashFunctionResultSet.find(i);
if(it==HashFunctionResultSet.end())
return -1;
}
else
{
return -1;
}
return i;
}
/*幾種常見(jiàn)的字符串hash方式實(shí)現函數*/
unsigned int HashTable::APHash(const std::string& str)
{
unsigned int hash=0xAAAAAAAA;
for(std::size_t i=0;i 3)) :
(~((hash > 5)));
}
return hash;
}
unsigned int HashTable::BKDRHash(const std::string& str)
{
unsigned int seed=131; //31 131 1313 13131 131313 etc
unsigned int hash=0;
for(std::size_t i=0;isetBuffer((char*)buffer,size,nmemb);
}
bool Http::InitCurl(const std::string& url, std::string& szbuffer)
{
pthread_mutex_init(&m_http_mutex,NULL);
Http::m_szUrl=url;
CURLcode result;
if(m_pcurl)
{
curl_easy_setopt(m_pcurl, CURLOPT_ERRORBUFFER, Http::m_errorBuffer);
curl_easy_setopt(m_pcurl, CURLOPT_URL,m_szUrl.c_str());
curl_easy_setopt(m_pcurl, CURLOPT_HEADER, 0);
curl_easy_setopt(m_pcurl, CURLOPT_FOLLOWLOCATION, 1);
curl_easy_setopt(m_pcurl, CURLOPT_WRITEFUNCTION,Http::writer);
curl_easy_setopt(m_pcurl, CURLOPT_WRITEDATA,this);
result = curl_easy_perform(m_pcurl);
}
if(result!=CURLE_OK)
return false;
szbuffer=m_szbuffer;
m_szbuffer.clear();
m_szUrl.clear();
pthread_mutex_destroy(&m_http_mutex);
return true;
}
bool Http::DeInitCurl()
{
curl_easy_cleanup(m_pcurl);
curl_global_cleanup();
m_pcurl = NULL;
return true;
}
const string Http::getBuffer()
{
return m_szbuffer;
}
string Http::setUrl()
{
return Http::m_szUrl;
}
void Http::setUrl(const std::string& url)
{
Http::m_szUrl = url;
}
其中,m_szbuffer存放的是網(wǎng)頁(yè)的內容。初始網(wǎng)頁(yè)的內容存儲在 Init 函數的形參中。 查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(
兩個(gè)重要的包()預處理器定義(_szbuffer))
在windows下的C++通過(guò)Http協(xié)議實(shí)現對網(wǎng)頁(yè)的內容抓?。?br /> 首先介紹兩個(gè)重要的包(一般是linux下的開(kāi)源數據包,windows下的動(dòng)態(tài)鏈接庫dll):curl包和pthreads_dll,其中curl包被解釋為命令行瀏覽器,由調用curl_easy_setopt等內置函數可以實(shí)現對特定網(wǎng)頁(yè)內容的獲?。ㄒ_編譯導入的curl鏈接庫,需要另外一個(gè)包C-ares)。pthreads 是一個(gè)多線(xiàn)程控制包,其中包括互斥變量的鎖定和解鎖。程序進(jìn)程分配等功能。
下載地址:點(diǎn)擊打開(kāi)鏈接。其中,正確導入外部動(dòng)態(tài)鏈接庫需要步驟:1.Project->Properties->Configuration Properties->C/C++->General->Additional Include Directories(添加include的路徑),2.Project- >Properties->Configuration Properties->Linker->General->Additional Library Directory(添加lib收錄的路徑);3、在Linker->Input->Additional Dependencies(添加了libcurld.lib;pthreadVC2.lib;ws2_3 2.lib;winmm.lib;wldap32.lib;areslib.lib) 4 , 在 c/c++->預處理器->預處理器定義(_CONSOLE;BUILDING_LIBCURL;HTTP_ONLY)
具體實(shí)現過(guò)程介紹:
1:自定義hashTable結構,存放獲取到的字符串字符。以hashTable類(lèi)的形式實(shí)現,包括hash表集合類(lèi)型,以及add、find等幾個(gè)常用的字符串hash函數
代碼:
///HashTable.h
#ifndef HashTable_H
#define HashTable_H
#include
#include
#include
class HashTable
{
public:
HashTable(void);
~HashTable(void);
unsigned int ForceAdd(const std::string& str);
unsigned int Find(const std::string& str);
/*string的常見(jiàn)的hash方式*/
unsigned int RSHash(const std::string& str);
unsigned int JSHash (const std::string& str);
unsigned int PJWHash (const std::string& str);
unsigned int ELFHash (const std::string& str);
unsigned int BKDRHash(const std::string& str);
unsigned int SDBMHash(const std::string& str);
unsigned int DJBHash (const std::string& str);
unsigned int DEKHash (const std::string& str);
unsigned int BPHash (const std::string& str);
unsigned int FNVHash (const std::string& str);
unsigned int APHash (const std::string& str);
private:
std::set HashFunctionResultSet;
std::vector hhh;
};
#endif
/////HashTable.cpp
#include "HashTable.h"
HashTable::HashTable(void)
{
}
HashTable::~HashTable(void)
{
}
unsigned int HashTable::ForceAdd(const std::string& str)
{
unsigned int i=ELFHash(str);
HashFunctionResultSet.insert(i);
return i;
}
unsigned int HashTable::Find(const std::string& str)
{
int ff=hhh.size();
const unsigned int i=ELFHash(str);
std::set::const_iterator it;
if(HashFunctionResultSet.size()>0)
{
it=HashFunctionResultSet.find(i);
if(it==HashFunctionResultSet.end())
return -1;
}
else
{
return -1;
}
return i;
}
/*幾種常見(jiàn)的字符串hash方式實(shí)現函數*/
unsigned int HashTable::APHash(const std::string& str)
{
unsigned int hash=0xAAAAAAAA;
for(std::size_t i=0;i 3)) :
(~((hash > 5)));
}
return hash;
}
unsigned int HashTable::BKDRHash(const std::string& str)
{
unsigned int seed=131; //31 131 1313 13131 131313 etc
unsigned int hash=0;
for(std::size_t i=0;isetBuffer((char*)buffer,size,nmemb);
}
bool Http::InitCurl(const std::string& url, std::string& szbuffer)
{
pthread_mutex_init(&m_http_mutex,NULL);
Http::m_szUrl=url;
CURLcode result;
if(m_pcurl)
{
curl_easy_setopt(m_pcurl, CURLOPT_ERRORBUFFER, Http::m_errorBuffer);
curl_easy_setopt(m_pcurl, CURLOPT_URL,m_szUrl.c_str());
curl_easy_setopt(m_pcurl, CURLOPT_HEADER, 0);
curl_easy_setopt(m_pcurl, CURLOPT_FOLLOWLOCATION, 1);
curl_easy_setopt(m_pcurl, CURLOPT_WRITEFUNCTION,Http::writer);
curl_easy_setopt(m_pcurl, CURLOPT_WRITEDATA,this);
result = curl_easy_perform(m_pcurl);
}
if(result!=CURLE_OK)
return false;
szbuffer=m_szbuffer;
m_szbuffer.clear();
m_szUrl.clear();
pthread_mutex_destroy(&m_http_mutex);
return true;
}
bool Http::DeInitCurl()
{
curl_easy_cleanup(m_pcurl);
curl_global_cleanup();
m_pcurl = NULL;
return true;
}
const string Http::getBuffer()
{
return m_szbuffer;
}
string Http::setUrl()
{
return Http::m_szUrl;
}
void Http::setUrl(const std::string& url)
{
Http::m_szUrl = url;
}
其中,m_szbuffer存放的是網(wǎng)頁(yè)的內容。初始網(wǎng)頁(yè)的內容存儲在 Init 函數的形參中。
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據( 網(wǎng)絡(luò )爬蟲(chóng)框架圖框架)
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 75 次瀏覽 ? 2022-03-09 01:14
網(wǎng)絡(luò )爬蟲(chóng)框架圖框架)
搜索引擎網(wǎng)絡(luò )爬蟲(chóng)如何高效地將互聯(lián)網(wǎng)上萬(wàn)億網(wǎng)頁(yè)爬取到本地鏡像?
一、爬蟲(chóng)框架
上圖是一個(gè)簡(jiǎn)單的網(wǎng)絡(luò )爬蟲(chóng)框架圖。從種子網(wǎng)址入手,如圖,一步步工作后,將網(wǎng)頁(yè)存入數據庫。當然,勤勞的蜘蛛可能還需要做更多的工作,比如網(wǎng)頁(yè)的去重和網(wǎng)頁(yè)的反作弊。
或許,我們可以將網(wǎng)頁(yè)視為蜘蛛的晚餐,其中包括:
下載的網(wǎng)頁(yè)。被蜘蛛爬過(guò)的網(wǎng)頁(yè)內容被放到了肚子里。
過(guò)期網(wǎng)頁(yè)。蜘蛛每次都要爬很多網(wǎng)頁(yè),有的已經(jīng)在肚子里壞掉了。
要下載的頁(yè)面。當它看到食物時(shí),蜘蛛就會(huì )去抓它。
知名網(wǎng)站。它還沒(méi)有被下載和發(fā)現,但是蜘蛛可以感知它們并且遲早會(huì )抓住它。
不可知的網(wǎng)頁(yè)?;ヂ?lián)網(wǎng)太大了,很多頁(yè)面蜘蛛都找不到,而且可能永遠也找不到。這部分占比很高。
通過(guò)以上劃分,我們可以清楚地了解搜索引擎蜘蛛的工作以及它們面臨的挑戰。大多數蜘蛛都是按照這個(gè)框架爬行的。但這并不完全確定。一切總是特別的。根據不同的功能,蜘蛛系統有一些差異。
二、爬蟲(chóng)種類(lèi)
1.批量式蜘蛛。
這種蜘蛛有明確的抓取范圍和目標,當蜘蛛完成目標和任務(wù)時(shí)停止抓取。具體目標是什么?它可能是抓取的頁(yè)面數、頁(yè)面大小、抓取時(shí)間等。
2.增量蜘蛛
這種蜘蛛不同于批處理型蜘蛛,它們會(huì )不斷地爬取,并且會(huì )定期對爬取的網(wǎng)頁(yè)進(jìn)行爬取和更新。由于 Internet 上的網(wǎng)頁(yè)在不斷更新,增量爬蟲(chóng)需要能夠反映這種更新。
3.垂直蜘蛛
此類(lèi)蜘蛛僅關(guān)注特定主題或特定行業(yè)頁(yè)面。以health網(wǎng)站為例,這種專(zhuān)門(mén)的爬蟲(chóng)只會(huì )爬取健康相關(guān)的話(huà)題,其他話(huà)題的頁(yè)面不會(huì )被爬取。測試這個(gè)蜘蛛的難點(diǎn)在于如何更準確地識別內容所屬的行業(yè)。目前很多垂直行業(yè)網(wǎng)站都需要這種蜘蛛去搶。
三、搶奪策略
爬蟲(chóng)通過(guò)種子URL進(jìn)行爬取和擴展,列出大量待爬取的URL。但是,要抓取的 URL 數量巨大。蜘蛛如何確定爬行的順序?爬蟲(chóng)的策略有很多,但最終的目標是先爬取重要的網(wǎng)頁(yè)。評價(jià)頁(yè)面是否重要,蜘蛛會(huì )根據頁(yè)面內容的程度原創(chuàng )、鏈接權重分析等多種方法進(jìn)行計算。比較有代表性的爬取策略如下:
1. 廣度優(yōu)先策略
寬度優(yōu)先是指蜘蛛爬取一個(gè)網(wǎng)頁(yè)后,會(huì )繼續按順序爬取該網(wǎng)頁(yè)中收錄的其他頁(yè)面。這個(gè)想法看似簡(jiǎn)單,但實(shí)際上非常實(shí)用。因為大部分網(wǎng)頁(yè)都是有優(yōu)先級的,所以在頁(yè)面上優(yōu)先推薦重要的頁(yè)面。
2. PageRank 策略
PageRank是一種非常有名的鏈接分析方法,主要用來(lái)衡量網(wǎng)頁(yè)的權威性。例如,Google 的 PR 就是典型的 PageRank 算法。通過(guò)PageRank算法我們可以找出哪些頁(yè)面更重要,然后蜘蛛會(huì )優(yōu)先抓取這些重要的頁(yè)面。
3.大網(wǎng)站優(yōu)先策略
這個(gè)很容易理解,大網(wǎng)站通常內容頁(yè)比較多,質(zhì)量也會(huì )比較高。蜘蛛會(huì )首先分析網(wǎng)站分類(lèi)和屬性。如果這個(gè)網(wǎng)站已經(jīng)是收錄很多,或者在搜索引擎系統中的權重很高,則優(yōu)先考慮收錄。
4.網(wǎng)頁(yè)更新
互聯(lián)網(wǎng)上的大部分頁(yè)面都會(huì )更新,所以蜘蛛存儲的頁(yè)面需要及時(shí)更新以保持一致性。打個(gè)比方:一個(gè)頁(yè)面之前排名很好,如果頁(yè)面被刪除了但仍然排名,那么體驗很差。因此,搜索引擎需要知道這些并隨時(shí)更新頁(yè)面,并將新的頁(yè)面提供給用戶(hù)。常用的網(wǎng)頁(yè)更新策略有三種:歷史參考策略和用戶(hù)體驗策略。整群抽樣策略。
1. 歷史參考策略
這是基于假設的更新策略。例如,如果你的網(wǎng)頁(yè)以前經(jīng)常更新,那么搜索引擎也認為你的網(wǎng)頁(yè)以后會(huì )經(jīng)常更新,蜘蛛也會(huì )根據這個(gè)規則定期網(wǎng)站對網(wǎng)頁(yè)進(jìn)行爬取。這也是為什么點(diǎn)水一直強調網(wǎng)站內容需要定期更新的原因。
2. 用戶(hù)體驗策略
一般來(lái)說(shuō),用戶(hù)只查看搜索結果前三頁(yè)的內容,很少有人看到后面的頁(yè)面。用戶(hù)體驗策略是搜索引擎根據用戶(hù)的這一特征進(jìn)行更新。例如,一個(gè)網(wǎng)頁(yè)可能發(fā)布得較早,并且有一段時(shí)間沒(méi)有更新,但用戶(hù)仍然覺(jué)得它有用并點(diǎn)擊瀏覽,那么搜索引擎可能不會(huì )首先更新這些過(guò)時(shí)的網(wǎng)頁(yè)。這就是為什么新頁(yè)面不一定在搜索結果中排名靠前的原因。排名更多地取決于頁(yè)面的質(zhì)量,而不是更新的時(shí)間。
3.整群抽樣策略
以上兩種更新策略主要參考網(wǎng)頁(yè)的歷史信息。然而,存儲大量歷史信息對于搜索引擎來(lái)說(shuō)是一種負擔。另外,如果收錄是一個(gè)新的網(wǎng)頁(yè),沒(méi)有歷史信息可以參考,怎么辦?聚類(lèi)抽樣策略是指:拿出一些屬性對很多相似的網(wǎng)頁(yè)進(jìn)行分類(lèi),分類(lèi)后的頁(yè)面按照相同的規則進(jìn)行更新。
從了解搜索引擎蜘蛛工作原理的過(guò)程中,我們會(huì )知道:網(wǎng)站內容的相關(guān)性、網(wǎng)站與網(wǎng)頁(yè)內容的更新規律、網(wǎng)頁(yè)鏈接的分布和權重網(wǎng)站 等因素會(huì )影響蜘蛛的爬取效率。知己知彼,讓蜘蛛來(lái)得更猛烈!
更多北碚商城產(chǎn)品介紹:撫順電梯轎廂廣告 查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(
網(wǎng)絡(luò )爬蟲(chóng)框架圖框架)
搜索引擎網(wǎng)絡(luò )爬蟲(chóng)如何高效地將互聯(lián)網(wǎng)上萬(wàn)億網(wǎng)頁(yè)爬取到本地鏡像?
一、爬蟲(chóng)框架

上圖是一個(gè)簡(jiǎn)單的網(wǎng)絡(luò )爬蟲(chóng)框架圖。從種子網(wǎng)址入手,如圖,一步步工作后,將網(wǎng)頁(yè)存入數據庫。當然,勤勞的蜘蛛可能還需要做更多的工作,比如網(wǎng)頁(yè)的去重和網(wǎng)頁(yè)的反作弊。
或許,我們可以將網(wǎng)頁(yè)視為蜘蛛的晚餐,其中包括:
下載的網(wǎng)頁(yè)。被蜘蛛爬過(guò)的網(wǎng)頁(yè)內容被放到了肚子里。
過(guò)期網(wǎng)頁(yè)。蜘蛛每次都要爬很多網(wǎng)頁(yè),有的已經(jīng)在肚子里壞掉了。
要下載的頁(yè)面。當它看到食物時(shí),蜘蛛就會(huì )去抓它。
知名網(wǎng)站。它還沒(méi)有被下載和發(fā)現,但是蜘蛛可以感知它們并且遲早會(huì )抓住它。
不可知的網(wǎng)頁(yè)?;ヂ?lián)網(wǎng)太大了,很多頁(yè)面蜘蛛都找不到,而且可能永遠也找不到。這部分占比很高。
通過(guò)以上劃分,我們可以清楚地了解搜索引擎蜘蛛的工作以及它們面臨的挑戰。大多數蜘蛛都是按照這個(gè)框架爬行的。但這并不完全確定。一切總是特別的。根據不同的功能,蜘蛛系統有一些差異。
二、爬蟲(chóng)種類(lèi)
1.批量式蜘蛛。
這種蜘蛛有明確的抓取范圍和目標,當蜘蛛完成目標和任務(wù)時(shí)停止抓取。具體目標是什么?它可能是抓取的頁(yè)面數、頁(yè)面大小、抓取時(shí)間等。
2.增量蜘蛛
這種蜘蛛不同于批處理型蜘蛛,它們會(huì )不斷地爬取,并且會(huì )定期對爬取的網(wǎng)頁(yè)進(jìn)行爬取和更新。由于 Internet 上的網(wǎng)頁(yè)在不斷更新,增量爬蟲(chóng)需要能夠反映這種更新。
3.垂直蜘蛛
此類(lèi)蜘蛛僅關(guān)注特定主題或特定行業(yè)頁(yè)面。以health網(wǎng)站為例,這種專(zhuān)門(mén)的爬蟲(chóng)只會(huì )爬取健康相關(guān)的話(huà)題,其他話(huà)題的頁(yè)面不會(huì )被爬取。測試這個(gè)蜘蛛的難點(diǎn)在于如何更準確地識別內容所屬的行業(yè)。目前很多垂直行業(yè)網(wǎng)站都需要這種蜘蛛去搶。
三、搶奪策略
爬蟲(chóng)通過(guò)種子URL進(jìn)行爬取和擴展,列出大量待爬取的URL。但是,要抓取的 URL 數量巨大。蜘蛛如何確定爬行的順序?爬蟲(chóng)的策略有很多,但最終的目標是先爬取重要的網(wǎng)頁(yè)。評價(jià)頁(yè)面是否重要,蜘蛛會(huì )根據頁(yè)面內容的程度原創(chuàng )、鏈接權重分析等多種方法進(jìn)行計算。比較有代表性的爬取策略如下:
1. 廣度優(yōu)先策略

寬度優(yōu)先是指蜘蛛爬取一個(gè)網(wǎng)頁(yè)后,會(huì )繼續按順序爬取該網(wǎng)頁(yè)中收錄的其他頁(yè)面。這個(gè)想法看似簡(jiǎn)單,但實(shí)際上非常實(shí)用。因為大部分網(wǎng)頁(yè)都是有優(yōu)先級的,所以在頁(yè)面上優(yōu)先推薦重要的頁(yè)面。
2. PageRank 策略
PageRank是一種非常有名的鏈接分析方法,主要用來(lái)衡量網(wǎng)頁(yè)的權威性。例如,Google 的 PR 就是典型的 PageRank 算法。通過(guò)PageRank算法我們可以找出哪些頁(yè)面更重要,然后蜘蛛會(huì )優(yōu)先抓取這些重要的頁(yè)面。
3.大網(wǎng)站優(yōu)先策略
這個(gè)很容易理解,大網(wǎng)站通常內容頁(yè)比較多,質(zhì)量也會(huì )比較高。蜘蛛會(huì )首先分析網(wǎng)站分類(lèi)和屬性。如果這個(gè)網(wǎng)站已經(jīng)是收錄很多,或者在搜索引擎系統中的權重很高,則優(yōu)先考慮收錄。
4.網(wǎng)頁(yè)更新
互聯(lián)網(wǎng)上的大部分頁(yè)面都會(huì )更新,所以蜘蛛存儲的頁(yè)面需要及時(shí)更新以保持一致性。打個(gè)比方:一個(gè)頁(yè)面之前排名很好,如果頁(yè)面被刪除了但仍然排名,那么體驗很差。因此,搜索引擎需要知道這些并隨時(shí)更新頁(yè)面,并將新的頁(yè)面提供給用戶(hù)。常用的網(wǎng)頁(yè)更新策略有三種:歷史參考策略和用戶(hù)體驗策略。整群抽樣策略。
1. 歷史參考策略
這是基于假設的更新策略。例如,如果你的網(wǎng)頁(yè)以前經(jīng)常更新,那么搜索引擎也認為你的網(wǎng)頁(yè)以后會(huì )經(jīng)常更新,蜘蛛也會(huì )根據這個(gè)規則定期網(wǎng)站對網(wǎng)頁(yè)進(jìn)行爬取。這也是為什么點(diǎn)水一直強調網(wǎng)站內容需要定期更新的原因。
2. 用戶(hù)體驗策略
一般來(lái)說(shuō),用戶(hù)只查看搜索結果前三頁(yè)的內容,很少有人看到后面的頁(yè)面。用戶(hù)體驗策略是搜索引擎根據用戶(hù)的這一特征進(jìn)行更新。例如,一個(gè)網(wǎng)頁(yè)可能發(fā)布得較早,并且有一段時(shí)間沒(méi)有更新,但用戶(hù)仍然覺(jué)得它有用并點(diǎn)擊瀏覽,那么搜索引擎可能不會(huì )首先更新這些過(guò)時(shí)的網(wǎng)頁(yè)。這就是為什么新頁(yè)面不一定在搜索結果中排名靠前的原因。排名更多地取決于頁(yè)面的質(zhì)量,而不是更新的時(shí)間。
3.整群抽樣策略
以上兩種更新策略主要參考網(wǎng)頁(yè)的歷史信息。然而,存儲大量歷史信息對于搜索引擎來(lái)說(shuō)是一種負擔。另外,如果收錄是一個(gè)新的網(wǎng)頁(yè),沒(méi)有歷史信息可以參考,怎么辦?聚類(lèi)抽樣策略是指:拿出一些屬性對很多相似的網(wǎng)頁(yè)進(jìn)行分類(lèi),分類(lèi)后的頁(yè)面按照相同的規則進(jìn)行更新。
從了解搜索引擎蜘蛛工作原理的過(guò)程中,我們會(huì )知道:網(wǎng)站內容的相關(guān)性、網(wǎng)站與網(wǎng)頁(yè)內容的更新規律、網(wǎng)頁(yè)鏈接的分布和權重網(wǎng)站 等因素會(huì )影響蜘蛛的爬取效率。知己知彼,讓蜘蛛來(lái)得更猛烈!
更多北碚商城產(chǎn)品介紹:撫順電梯轎廂廣告
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據( Scraoy入門(mén)實(shí)例一—Scrapy介紹與安裝ampamp的安裝)
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 91 次瀏覽 ? 2022-03-09 01:12
Scraoy入門(mén)實(shí)例一—Scrapy介紹與安裝ampamp的安裝)
Scraoy入門(mén)示例1-Scrapy介紹與安裝&PyCharm安裝&項目實(shí)戰
一、Scrapy 的安裝
1.Scrapy介紹
Scrapy 是一個(gè)應用程序框架,用于抓取 網(wǎng)站 數據并提取結構化數據。它可以用于一系列程序,包括數據挖掘、信息處理或存儲歷史數據。它最初是為網(wǎng)頁(yè)抓?。ǜ鼫蚀_地說(shuō),網(wǎng)頁(yè)抓?。┒O計的,但也可用于獲取 API(例如 Amazon Associates Web 服務(wù))或通用網(wǎng)絡(luò )爬蟲(chóng)返回的數據。
2.Scrapy 安裝
建議使用 Anaconda 安裝 Scrapy
Anaconda 是一個(gè)開(kāi)源包和環(huán)境管理神器。Anaconda 包括 180 多個(gè)科學(xué)包及其依賴(lài)項,包括 conda 和 Python。從官網(wǎng)下載安裝Anaconda(個(gè)人版),根據自己的系統選擇下載,安裝,選擇next繼續安裝,Install for選項選擇Just for me,選擇安裝位置,等待安裝完成。
安裝完成后,打開(kāi)命令行,輸入conda install scrapy,根據提示按Y,即可下載所有Scrapy及其依賴(lài)包,從而完成安裝。
注意:使用命令行安裝scrapy包時(shí),會(huì )出現下載超時(shí)問(wèn)題,即下載失敗。我們可以通過(guò)修改scrapy包的鏡像文件來(lái)提高scrapy包的下載速度。你可以參考博客:
這時(shí)候測試Scrapy是否安裝成功:在命令行窗口輸入scrapy,回車(chē)。如果出現如下界面,則表示安裝成功:
二、安裝 PyCharm
1.PyCharm介紹
PyCharm 是一個(gè) Python IDE,擁有一套完整的工具,可以幫助用戶(hù)在使用 Python 語(yǔ)言進(jìn)行開(kāi)發(fā)時(shí)提高效率,例如調試、語(yǔ)法高亮、項目管理、代碼跳轉、智能提示、自動(dòng)完成、單元測試和版本控制。此外,IDE 還提供高級功能以支持 Django 框架下的專(zhuān)業(yè) Web 開(kāi)發(fā)。
2.PyCharm 安裝
進(jìn)入PyCharm官網(wǎng),直接點(diǎn)擊DownLoad下載,左邊是專(zhuān)業(yè)版,右邊是社區版,社區版免費,專(zhuān)業(yè)版免費試用。
如果我們之前沒(méi)有下載過(guò)Python解釋器,可以在等待安裝的同時(shí)下載Python解釋器,進(jìn)入Python官網(wǎng),根據系統和版本下載對應的壓縮包。安裝完成后,在環(huán)境變量 Path 中配置 Python 解釋器的安裝路徑。你可以參考博客:
三、Scrapy 抓豆瓣項目在行動(dòng)
前提條件:如果要在 PyCharm 中使用 Scrapy,首先必須在 PyCharm 中安裝支持的 Scrapy 包。流程如下,點(diǎn)擊文件>>設置... 兩個(gè)包,如果點(diǎn)擊的時(shí)候看到一個(gè)Scrapy包,那么就不需要安裝了,繼續下一步。
如果沒(méi)有Scrapy包,點(diǎn)擊“+”,搜索Scrapy包,點(diǎn)擊Install Package進(jìn)行安裝
等待安裝完成。
1.新項目
打開(kāi)新安裝的PyCharm,使用軟件終端中的pycharm工具,如果找不到PyCharm終端在哪里,就是左下角的Terminal。
輸入命令:scrapy startproject douban 這是使用命令行新建爬蟲(chóng)項目,如下圖,圖中項目名稱(chēng)為pythonProject
然后在命令行輸入命令:cd douban進(jìn)入生成項目的根目錄
然后在終端繼續輸入命令:scrapy genspider douban_spider 生成douban_spider爬蟲(chóng)文件。
此時(shí)的項目結構如下圖所示:
2.明確目標
我們要練習的 網(wǎng)站 是:
假設,我們獲取 top250 電影的序列號、電影名稱(chēng)、介紹、星級、評論數、電影描述選項
至此,我們在 items.py 文件中定義抓取的數據項,代碼如下:
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/lat ... .html
import scrapy
class DoubanItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
# 序列號
serial_number = scrapy.Field();
# 電影名
movie_name = scrapy.Field();
# 介紹
introduce = scrapy.Field();
# 星級
star = scrapy.Field();
# 評價(jià)數
evaluate = scrapy.Field();
# 描述
describe = scrapy.Field();
pass
3.接下來(lái),我們需要創(chuàng )建爬蟲(chóng)并存儲爬取的內容
在douban_spider.py爬蟲(chóng)文件中編寫(xiě)具體的邏輯代碼,如下:
# -*- coding: utf-8 -*-
import scrapy
from ..items import DoubanItem
class DoubanSpiderSpider(scrapy.Spider):
name = "douban_spider"
# 允許的域名
allowed_domains = ["movie.douban.com"]
# 入口URL
start_urls = ["https://movie.douban.com/top250"]
def parse(self, response):
movie_list = response.xpath("//div[@class="article"]//ol[@class="grid_view"]/li")
#循環(huán)電影的條目
for i_item in movie_list:
#導入item,進(jìn)行數據解析
douban_item = DoubanItem()
douban_item["serial_number"] = i_item.xpath(".//div[@class="item"]//em/text()").extract_first()
douban_item["movie_name"] = i_item.xpath(".//div[@class="info"]//div[@class="hd"]/a/span[1]/text()").extract_first()
#如果文件有多行進(jìn)行解析
content = i_item.xpath(".//div[@class="info"]//div[@class="bd"]/p[1]/text()").extract()
for i_content in content:
content_s ="".join( i_content.split())
douban_item["introduce"] = content_s
douban_item["star"] = i_item.xpath(".//span[@class="rating_num"]/text()").extract_first()
douban_item["evaluate"] = i_item.xpath(".//div[@class="star"]//span[4]/text()").extract_first()
douban_item["describe"] = i_item.xpath(".//p[@class="quote"]/span/text()").extract_first()
print(douban_item)
yield douban_item
#解析下一頁(yè),取后一頁(yè)的XPATH
next_link = response.xpath("//span[@class="next"]/link/@href").extract()
if next_link:
next_link = next_link[0]
yield scrapy.Request("https://movie.douban.com/top250"+next_link,callback=self.parse)
這個(gè)時(shí)候不需要運行這個(gè)python文件,因為我們不單獨使用,所以不需要運行,允許報錯。import引入的問(wèn)題,主目錄的絕對路徑和相對路徑,原因是我們使用的是相對路徑“..items”,對相關(guān)內容感興趣的同學(xué)可以去網(wǎng)上找一下此類(lèi)問(wèn)題的解釋.
4.存儲內容
將爬取的內容存儲為 json 或 csv 格式的文件
在命令行輸入:scrapy crawl douban_spider -o test.json 或者 scrapy crawl douban_spider -o test.csv
將爬取的數據存儲在 json 文件或 csv 文件中。
執行爬取命令后,當鼠標聚焦到項目面板時(shí),會(huì )顯示生成的 json 文件或 csv 文件。打開(kāi)json或者csv文件后,如果里面什么都沒(méi)有,那么我們需要做進(jìn)一步的修改,修改代理USER_AGENT的內容,
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.8 Safari/537.36"
如果存儲在json文件中,所有內容都會(huì )以十六進(jìn)制形式顯示,可以通過(guò)相應的方法進(jìn)行轉碼。這里就不多解釋了,如下圖所示:
并且存儲在csv文件中,它會(huì )直接顯示我們要爬取的所有內容,如下圖:
至此,我們就完成了網(wǎng)站具體內容的爬取。接下來(lái),我們需要對爬取的數據進(jìn)行處理。
分界線(xiàn) —————————————————————————————————————————————- 分界線(xiàn)
Scraoy 入門(mén)示例 2 - 使用管道實(shí)現
在本次實(shí)戰中,需要重新創(chuàng )建項目或者安裝scrapy包。參考上面的內容,新建項目的方法也參考上面的內容,這里不再贅述。
項目目錄結構如下圖所示:
一、流水線(xiàn)介紹
當我們通過(guò)Spider爬取數據,通過(guò)Item采集數據時(shí),我們需要對數據做一些處理,因為我們爬取的數據不一定是我們想要的最終數據,可能還需要對數據進(jìn)行清洗和驗證。數據有效性。Scripy 中的 Pipeline 組件用于數據處理。Pipeline 組件是一個(gè)收錄特定接口的類(lèi)。它通常只負責一項功能的數據處理。在一個(gè)項目中可以同時(shí)啟用多個(gè)管道。
二、在items.py中定義你要抓取的數據
首先打開(kāi)一個(gè)新的pycharm項目,通過(guò)終端新建一個(gè)項目教程,在item中定義你要抓取的數據,比如電影名,代碼如下:
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/lat ... .html
import scrapy
class TutorialItem(scrapy.Item):
# define the fields for your item here like:
name = scrapy.Field()
pass
class DoubanmovieItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
moiveName = scrapy.Field()
三、定義 pipeline.py 文件
每個(gè) item 管道組件都是一個(gè)獨立的 pyhton 類(lèi),必須實(shí)現 process_item(self, item, spider) 方法。每個(gè)item管道組件都需要調用這個(gè)方法。該方法必須返回一個(gè)帶有數據的dict,或者一個(gè)item對象,或者拋出一個(gè)DropItem異常,并且被丟棄的item不會(huì )被后續管道組件處理。定義的 pipelines.py 代碼如下所示:
# Define your item pipelines here
#
# Don"t forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/lat ... .html
# useful for handling different item types with a single interface
from itemadapter import ItemAdapter
class TutorialPipeline(object):
def process_item(self, item, spider):
return item
import time
class DoubanmoviePipeline(object):
def process_item(self, item, spider):
now = time.strftime("%Y-%m-%d", time.localtime())
fileName = "douban" + now + ".txt"
with open(fileName, "a", encoding="utf-8") as fp:
fp.write(item["moiveName"][0]+"")
return item
四、配置設置.py
由于這次使用的是管道,所以我們需要在settings.py中打開(kāi)管道通道注釋?zhuān)⒃谄渲刑砑右粭l新記錄,如下圖所示:
五、寫(xiě)爬蟲(chóng)文件
在tutorial/spiders目錄下創(chuàng )建quotes_spider.py文件,目錄結構如下,編寫(xiě)初步代碼:
quote_spider.py 代碼如下:
import scrapy
from items import DoubanmovieItem
class QuotesSpider(scrapy.Spider):
name = "doubanSpider"
allowed_domains = ["douban.com"]
start_urls = ["http://movie.douban.com/cinema/nowplaying",
"http://movie.douban.com/cinema ... ot%3B]
def parse(self, response):
print("--" * 20 )
#print(response.body)
print("==" * 20 )
subSelector = response.xpath("//li[@class="stitle"]")
items = []
for sub in subSelector:
#print(sub.xpath("normalize-space(./a/text())").extract())
print(sub)
item = DoubanmovieItem()
item["moiveName"] = sub.xpath("normalize-space(./a/text())").extract()
items.append(item)
print(items)
return items
六、從啟動(dòng)文件運行
在豆瓣文件目錄下新建啟動(dòng)文件douban_spider_run.py(文件名可取不同),運行文件查看結果。編寫(xiě)代碼如下:
from scrapy import cmdline
cmdline.execute("scrapy crawl doubanSpider".split())
最后,處理后的爬取數據如下圖(部分)所示:
最后,希望大家在寫(xiě)代碼的時(shí)候可以小心,不要馬虎。實(shí)驗的時(shí)候寫(xiě)了方法DoubanmovieItem作為DobanmovieItem引入,導致整個(gè)程序失敗,而且PyCharm也沒(méi)有告訴我哪里錯了,我到處找問(wèn)題的解決方法也沒(méi)找到。最后查了很多遍,都是在生成方法的時(shí)候才發(fā)現的,所以一定要小心。該錯誤如下圖所示。提示找不到DobanmovieItem模塊。它可能告訴我錯誤的地方。因為懶得找,找了很久。希望大家多多注意!
至此,使用Scrapy抓取網(wǎng)頁(yè)內容,并對抓取到的內容進(jìn)行清理和處理的實(shí)驗已經(jīng)完成。要求熟悉并使用此過(guò)程中的代碼和操作,不要在網(wǎng)上搜索和消化。吸收它并記住它,這是學(xué)習知識的真正方法,而不僅僅是畫(huà)一個(gè)勺子。
本文地址:H5W3 ? python爬蟲(chóng)示例:使用Scrapy爬取網(wǎng)頁(yè)采集數據 查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(
Scraoy入門(mén)實(shí)例一—Scrapy介紹與安裝ampamp的安裝)
https://www.h5w3.com/wp-conten ... 3.jpg 150w" />Scraoy入門(mén)示例1-Scrapy介紹與安裝&PyCharm安裝&項目實(shí)戰
一、Scrapy 的安裝
1.Scrapy介紹
Scrapy 是一個(gè)應用程序框架,用于抓取 網(wǎng)站 數據并提取結構化數據。它可以用于一系列程序,包括數據挖掘、信息處理或存儲歷史數據。它最初是為網(wǎng)頁(yè)抓?。ǜ鼫蚀_地說(shuō),網(wǎng)頁(yè)抓?。┒O計的,但也可用于獲取 API(例如 Amazon Associates Web 服務(wù))或通用網(wǎng)絡(luò )爬蟲(chóng)返回的數據。
2.Scrapy 安裝
建議使用 Anaconda 安裝 Scrapy
Anaconda 是一個(gè)開(kāi)源包和環(huán)境管理神器。Anaconda 包括 180 多個(gè)科學(xué)包及其依賴(lài)項,包括 conda 和 Python。從官網(wǎng)下載安裝Anaconda(個(gè)人版),根據自己的系統選擇下載,安裝,選擇next繼續安裝,Install for選項選擇Just for me,選擇安裝位置,等待安裝完成。
安裝完成后,打開(kāi)命令行,輸入conda install scrapy,根據提示按Y,即可下載所有Scrapy及其依賴(lài)包,從而完成安裝。
注意:使用命令行安裝scrapy包時(shí),會(huì )出現下載超時(shí)問(wèn)題,即下載失敗。我們可以通過(guò)修改scrapy包的鏡像文件來(lái)提高scrapy包的下載速度。你可以參考博客:
這時(shí)候測試Scrapy是否安裝成功:在命令行窗口輸入scrapy,回車(chē)。如果出現如下界面,則表示安裝成功:
https://www.h5w3.com/wp-conten ... 9.png 150w" />二、安裝 PyCharm
1.PyCharm介紹
PyCharm 是一個(gè) Python IDE,擁有一套完整的工具,可以幫助用戶(hù)在使用 Python 語(yǔ)言進(jìn)行開(kāi)發(fā)時(shí)提高效率,例如調試、語(yǔ)法高亮、項目管理、代碼跳轉、智能提示、自動(dòng)完成、單元測試和版本控制。此外,IDE 還提供高級功能以支持 Django 框架下的專(zhuān)業(yè) Web 開(kāi)發(fā)。
2.PyCharm 安裝
進(jìn)入PyCharm官網(wǎng),直接點(diǎn)擊DownLoad下載,左邊是專(zhuān)業(yè)版,右邊是社區版,社區版免費,專(zhuān)業(yè)版免費試用。
如果我們之前沒(méi)有下載過(guò)Python解釋器,可以在等待安裝的同時(shí)下載Python解釋器,進(jìn)入Python官網(wǎng),根據系統和版本下載對應的壓縮包。安裝完成后,在環(huán)境變量 Path 中配置 Python 解釋器的安裝路徑。你可以參考博客:
三、Scrapy 抓豆瓣項目在行動(dòng)
前提條件:如果要在 PyCharm 中使用 Scrapy,首先必須在 PyCharm 中安裝支持的 Scrapy 包。流程如下,點(diǎn)擊文件>>設置... 兩個(gè)包,如果點(diǎn)擊的時(shí)候看到一個(gè)Scrapy包,那么就不需要安裝了,繼續下一步。
https://www.h5w3.com/wp-conten ... 7.png 150w" />如果沒(méi)有Scrapy包,點(diǎn)擊“+”,搜索Scrapy包,點(diǎn)擊Install Package進(jìn)行安裝
https://www.h5w3.com/wp-conten ... 1.png 150w" />等待安裝完成。
1.新項目
打開(kāi)新安裝的PyCharm,使用軟件終端中的pycharm工具,如果找不到PyCharm終端在哪里,就是左下角的Terminal。
輸入命令:scrapy startproject douban 這是使用命令行新建爬蟲(chóng)項目,如下圖,圖中項目名稱(chēng)為pythonProject
https://www.h5w3.com/wp-conten ... 0.png 150w" />然后在命令行輸入命令:cd douban進(jìn)入生成項目的根目錄
然后在終端繼續輸入命令:scrapy genspider douban_spider 生成douban_spider爬蟲(chóng)文件。
此時(shí)的項目結構如下圖所示:
https://www.h5w3.com/wp-conten ... 0.png 136w" />2.明確目標
我們要練習的 網(wǎng)站 是:
假設,我們獲取 top250 電影的序列號、電影名稱(chēng)、介紹、星級、評論數、電影描述選項
至此,我們在 items.py 文件中定義抓取的數據項,代碼如下:
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/lat ... .html
import scrapy
class DoubanItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
# 序列號
serial_number = scrapy.Field();
# 電影名
movie_name = scrapy.Field();
# 介紹
introduce = scrapy.Field();
# 星級
star = scrapy.Field();
# 評價(jià)數
evaluate = scrapy.Field();
# 描述
describe = scrapy.Field();
pass
3.接下來(lái),我們需要創(chuàng )建爬蟲(chóng)并存儲爬取的內容
在douban_spider.py爬蟲(chóng)文件中編寫(xiě)具體的邏輯代碼,如下:
# -*- coding: utf-8 -*-
import scrapy
from ..items import DoubanItem
class DoubanSpiderSpider(scrapy.Spider):
name = "douban_spider"
# 允許的域名
allowed_domains = ["movie.douban.com"]
# 入口URL
start_urls = ["https://movie.douban.com/top250"]
def parse(self, response):
movie_list = response.xpath("//div[@class="article"]//ol[@class="grid_view"]/li")
#循環(huán)電影的條目
for i_item in movie_list:
#導入item,進(jìn)行數據解析
douban_item = DoubanItem()
douban_item["serial_number"] = i_item.xpath(".//div[@class="item"]//em/text()").extract_first()
douban_item["movie_name"] = i_item.xpath(".//div[@class="info"]//div[@class="hd"]/a/span[1]/text()").extract_first()
#如果文件有多行進(jìn)行解析
content = i_item.xpath(".//div[@class="info"]//div[@class="bd"]/p[1]/text()").extract()
for i_content in content:
content_s ="".join( i_content.split())
douban_item["introduce"] = content_s
douban_item["star"] = i_item.xpath(".//span[@class="rating_num"]/text()").extract_first()
douban_item["evaluate"] = i_item.xpath(".//div[@class="star"]//span[4]/text()").extract_first()
douban_item["describe"] = i_item.xpath(".//p[@class="quote"]/span/text()").extract_first()
print(douban_item)
yield douban_item
#解析下一頁(yè),取后一頁(yè)的XPATH
next_link = response.xpath("//span[@class="next"]/link/@href").extract()
if next_link:
next_link = next_link[0]
yield scrapy.Request("https://movie.douban.com/top250"+next_link,callback=self.parse)
這個(gè)時(shí)候不需要運行這個(gè)python文件,因為我們不單獨使用,所以不需要運行,允許報錯。import引入的問(wèn)題,主目錄的絕對路徑和相對路徑,原因是我們使用的是相對路徑“..items”,對相關(guān)內容感興趣的同學(xué)可以去網(wǎng)上找一下此類(lèi)問(wèn)題的解釋.
4.存儲內容
將爬取的內容存儲為 json 或 csv 格式的文件
在命令行輸入:scrapy crawl douban_spider -o test.json 或者 scrapy crawl douban_spider -o test.csv
將爬取的數據存儲在 json 文件或 csv 文件中。
執行爬取命令后,當鼠標聚焦到項目面板時(shí),會(huì )顯示生成的 json 文件或 csv 文件。打開(kāi)json或者csv文件后,如果里面什么都沒(méi)有,那么我們需要做進(jìn)一步的修改,修改代理USER_AGENT的內容,
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.8 Safari/537.36"
https://www.h5w3.com/wp-conten ... 4.png 150w" />如果存儲在json文件中,所有內容都會(huì )以十六進(jìn)制形式顯示,可以通過(guò)相應的方法進(jìn)行轉碼。這里就不多解釋了,如下圖所示:
https://www.h5w3.com/wp-conten ... 4.png 150w" />并且存儲在csv文件中,它會(huì )直接顯示我們要爬取的所有內容,如下圖:
https://www.h5w3.com/wp-conten ... 9.png 150w" />至此,我們就完成了網(wǎng)站具體內容的爬取。接下來(lái),我們需要對爬取的數據進(jìn)行處理。
分界線(xiàn) —————————————————————————————————————————————- 分界線(xiàn)
Scraoy 入門(mén)示例 2 - 使用管道實(shí)現
在本次實(shí)戰中,需要重新創(chuàng )建項目或者安裝scrapy包。參考上面的內容,新建項目的方法也參考上面的內容,這里不再贅述。
項目目錄結構如下圖所示:
https://www.h5w3.com/wp-conten ... 0.png 78w" />一、流水線(xiàn)介紹
當我們通過(guò)Spider爬取數據,通過(guò)Item采集數據時(shí),我們需要對數據做一些處理,因為我們爬取的數據不一定是我們想要的最終數據,可能還需要對數據進(jìn)行清洗和驗證。數據有效性。Scripy 中的 Pipeline 組件用于數據處理。Pipeline 組件是一個(gè)收錄特定接口的類(lèi)。它通常只負責一項功能的數據處理。在一個(gè)項目中可以同時(shí)啟用多個(gè)管道。
二、在items.py中定義你要抓取的數據
首先打開(kāi)一個(gè)新的pycharm項目,通過(guò)終端新建一個(gè)項目教程,在item中定義你要抓取的數據,比如電影名,代碼如下:
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/lat ... .html
import scrapy
class TutorialItem(scrapy.Item):
# define the fields for your item here like:
name = scrapy.Field()
pass
class DoubanmovieItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
moiveName = scrapy.Field()
三、定義 pipeline.py 文件
每個(gè) item 管道組件都是一個(gè)獨立的 pyhton 類(lèi),必須實(shí)現 process_item(self, item, spider) 方法。每個(gè)item管道組件都需要調用這個(gè)方法。該方法必須返回一個(gè)帶有數據的dict,或者一個(gè)item對象,或者拋出一個(gè)DropItem異常,并且被丟棄的item不會(huì )被后續管道組件處理。定義的 pipelines.py 代碼如下所示:
# Define your item pipelines here
#
# Don"t forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/lat ... .html
# useful for handling different item types with a single interface
from itemadapter import ItemAdapter
class TutorialPipeline(object):
def process_item(self, item, spider):
return item
import time
class DoubanmoviePipeline(object):
def process_item(self, item, spider):
now = time.strftime("%Y-%m-%d", time.localtime())
fileName = "douban" + now + ".txt"
with open(fileName, "a", encoding="utf-8") as fp:
fp.write(item["moiveName"][0]+"")
return item
四、配置設置.py
由于這次使用的是管道,所以我們需要在settings.py中打開(kāi)管道通道注釋?zhuān)⒃谄渲刑砑右粭l新記錄,如下圖所示:
https://www.h5w3.com/wp-conten ... 2.png 150w" />五、寫(xiě)爬蟲(chóng)文件
在tutorial/spiders目錄下創(chuàng )建quotes_spider.py文件,目錄結構如下,編寫(xiě)初步代碼:
https://www.h5w3.com/wp-conten ... 0.png 93w" />quote_spider.py 代碼如下:
import scrapy
from items import DoubanmovieItem
class QuotesSpider(scrapy.Spider):
name = "doubanSpider"
allowed_domains = ["douban.com"]
start_urls = ["http://movie.douban.com/cinema/nowplaying",
"http://movie.douban.com/cinema ... ot%3B]
def parse(self, response):
print("--" * 20 )
#print(response.body)
print("==" * 20 )
subSelector = response.xpath("//li[@class="stitle"]")
items = []
for sub in subSelector:
#print(sub.xpath("normalize-space(./a/text())").extract())
print(sub)
item = DoubanmovieItem()
item["moiveName"] = sub.xpath("normalize-space(./a/text())").extract()
items.append(item)
print(items)
return items
六、從啟動(dòng)文件運行
在豆瓣文件目錄下新建啟動(dòng)文件douban_spider_run.py(文件名可取不同),運行文件查看結果。編寫(xiě)代碼如下:
from scrapy import cmdline
cmdline.execute("scrapy crawl doubanSpider".split())
最后,處理后的爬取數據如下圖(部分)所示:
https://www.h5w3.com/wp-conten ... 7.png 150w" />最后,希望大家在寫(xiě)代碼的時(shí)候可以小心,不要馬虎。實(shí)驗的時(shí)候寫(xiě)了方法DoubanmovieItem作為DobanmovieItem引入,導致整個(gè)程序失敗,而且PyCharm也沒(méi)有告訴我哪里錯了,我到處找問(wèn)題的解決方法也沒(méi)找到。最后查了很多遍,都是在生成方法的時(shí)候才發(fā)現的,所以一定要小心。該錯誤如下圖所示。提示找不到DobanmovieItem模塊。它可能告訴我錯誤的地方。因為懶得找,找了很久。希望大家多多注意!
https://www.h5w3.com/wp-conten ... 5.png 150w" />至此,使用Scrapy抓取網(wǎng)頁(yè)內容,并對抓取到的內容進(jìn)行清理和處理的實(shí)驗已經(jīng)完成。要求熟悉并使用此過(guò)程中的代碼和操作,不要在網(wǎng)上搜索和消化。吸收它并記住它,這是學(xué)習知識的真正方法,而不僅僅是畫(huà)一個(gè)勺子。
本文地址:H5W3 ? python爬蟲(chóng)示例:使用Scrapy爬取網(wǎng)頁(yè)采集數據
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(開(kāi)始定位,也即這兩個(gè)寫(xiě)法在XML包中都是適用的)
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 63 次瀏覽 ? 2022-03-07 22:07
開(kāi)始定位,即
div[@class='first']/a/text()
這兩種寫(xiě)法都適用于 XML 包。
由于不是主要內容,更多關(guān)于HTML的知識這里不再贅述。詳細的可以自己學(xué)習HTML和CSS相關(guān)知識,是爬蟲(chóng)的基礎。
我們通常使用chrome瀏覽器右鍵->查看源代碼,或者右鍵要查看的內容->檢查,然后會(huì )看到如下界面:
這時(shí)候如果我們在Khaled Hosseini那一行右鍵,可以右鍵->復制->選擇器或者Xpath直接復制對應的層次定位。需要注意的是,我們還需要將復制的定位代碼替換成XML包可以識別的格式。例如,屬性值使用單引號,“//”表示該類(lèi)型的所有節點(diǎn)等。
下面重點(diǎn)介紹XML中常見(jiàn)的節點(diǎn)定位方法和代碼,可以作為參考:
<p>getNodeSet(doc,'/bookstore/book[1]')
# 選取屬于 bookstore 子元素的最后一個(gè) book 元素。
getNodeSet(doc,'/bookstore/book[last()]')
# 選取最前面的兩個(gè)屬于 bookstore 元素的子元素的 book 元素
getNodeSet(doc,'/bookstore/book[position() 查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(開(kāi)始定位,也即這兩個(gè)寫(xiě)法在XML包中都是適用的)
開(kāi)始定位,即
div[@class='first']/a/text()
這兩種寫(xiě)法都適用于 XML 包。
由于不是主要內容,更多關(guān)于HTML的知識這里不再贅述。詳細的可以自己學(xué)習HTML和CSS相關(guān)知識,是爬蟲(chóng)的基礎。
我們通常使用chrome瀏覽器右鍵->查看源代碼,或者右鍵要查看的內容->檢查,然后會(huì )看到如下界面:

這時(shí)候如果我們在Khaled Hosseini那一行右鍵,可以右鍵->復制->選擇器或者Xpath直接復制對應的層次定位。需要注意的是,我們還需要將復制的定位代碼替換成XML包可以識別的格式。例如,屬性值使用單引號,“//”表示該類(lèi)型的所有節點(diǎn)等。
下面重點(diǎn)介紹XML中常見(jiàn)的節點(diǎn)定位方法和代碼,可以作為參考:
<p>getNodeSet(doc,'/bookstore/book[1]')
# 選取屬于 bookstore 子元素的最后一個(gè) book 元素。
getNodeSet(doc,'/bookstore/book[last()]')
# 選取最前面的兩個(gè)屬于 bookstore 元素的子元素的 book 元素
getNodeSet(doc,'/bookstore/book[position()
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(:網(wǎng)絡(luò )爬蟲(chóng);Python;MySQL;正則表達式;)
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 110 次瀏覽 ? 2022-03-06 05:20
吳永聰
摘要: 近年來(lái),隨著(zhù)互聯(lián)網(wǎng)的發(fā)展,如何有效地從互聯(lián)網(wǎng)上獲取所需信息已成為眾多互聯(lián)網(wǎng)公司競爭研究的新方向。從互聯(lián)網(wǎng)獲取數據最常用的方法是網(wǎng)絡(luò )爬蟲(chóng)。網(wǎng)絡(luò )爬蟲(chóng),也稱(chēng)為網(wǎng)絡(luò )蜘蛛和網(wǎng)絡(luò )機器人,是一種根據特定規則和給定 URL 自動(dòng)采集互聯(lián)網(wǎng)數據和信息的程序。文章討論了網(wǎng)絡(luò )爬蟲(chóng)實(shí)現過(guò)程中的主要問(wèn)題:如何使用python模擬登錄、如何使用正則表達式匹配字符串獲取信息、如何使用mysql存儲數據等,并實(shí)現一個(gè)使用 python 的網(wǎng)絡(luò )爬蟲(chóng)系統。
關(guān)鍵詞:網(wǎng)絡(luò )爬蟲(chóng);Python; MySQL;常用表達
CLC 編號:TP311.11 文號:A文章編號:1006-8228 (2019)08-94-03
摘要:近年來(lái),隨著(zhù)互聯(lián)網(wǎng)的發(fā)展,如何有效地從互聯(lián)網(wǎng)上獲取所需的信息成為眾多互聯(lián)網(wǎng)公司爭相研究的新方向,而最常見(jiàn)的從互聯(lián)網(wǎng)上獲取數據的手段是網(wǎng)絡(luò )爬蟲(chóng)。網(wǎng)絡(luò )爬蟲(chóng)也稱(chēng)為網(wǎng)絡(luò )蜘蛛或網(wǎng)絡(luò )機器人,它是根據給定的 URL 和特定規則自動(dòng)采集互聯(lián)網(wǎng)數據和信息的程序。本文討論了網(wǎng)絡(luò )爬蟲(chóng)實(shí)現中的主要問(wèn)題,如如何使用Python模擬登錄、如何使用正則表達式匹配字符串獲取信息以及如何使用MySQL存儲數據等。最后通過(guò)對Python語(yǔ)言的研究,實(shí)現了一個(gè)基于Python的網(wǎng)絡(luò )爬蟲(chóng)程序系統。
關(guān)鍵詞:網(wǎng)絡(luò )爬蟲(chóng);Python; MySQL;正則表達式
0 前言
在網(wǎng)絡(luò )信息和數據爆炸式增長(cháng)的時(shí)代,盡管互聯(lián)網(wǎng)信息技術(shù)飛速發(fā)展,但仍然難以從如此海量的信息數據中找到真正有用的信息。于是,谷歌、百度、雅虎等搜索引擎應運而生。搜索引擎可以根據用戶(hù)輸入的關(guān)鍵字檢索互聯(lián)網(wǎng)上的網(wǎng)頁(yè),為用戶(hù)查找與關(guān)鍵字相關(guān)或收錄關(guān)鍵字的信息。網(wǎng)絡(luò )爬蟲(chóng)作為搜索引擎的重要組成部分,在信息檢索過(guò)程中發(fā)揮著(zhù)重要作用。因此,網(wǎng)絡(luò )爬蟲(chóng)的研究對搜索引擎的發(fā)展具有重要意義。對于編寫(xiě)網(wǎng)絡(luò )爬蟲(chóng),python有其獨特的優(yōu)勢。比如python中有很多爬蟲(chóng)框架,使得網(wǎng)絡(luò )爬蟲(chóng)爬取數據的效率更高。同時(shí),Python 是一種面向對象的解釋型高級編程語(yǔ)言。它的語(yǔ)法比其他高級編程語(yǔ)言更簡(jiǎn)單、更容易閱讀和理解。因此,使用 Python 實(shí)現網(wǎng)絡(luò )爬蟲(chóng)是一個(gè)不錯的選擇。
1 網(wǎng)絡(luò )爬蟲(chóng)概述
1.1 網(wǎng)絡(luò )爬蟲(chóng)原理
網(wǎng)絡(luò )爬蟲(chóng),又稱(chēng)網(wǎng)絡(luò )蜘蛛、網(wǎng)絡(luò )機器人,主要用于采集互聯(lián)網(wǎng)上的各種資源。它是搜索引擎的重要組成部分,是一種自動(dòng)提取 Internet 上特定頁(yè)面內容的程序。通用搜索引擎網(wǎng)絡(luò )爬蟲(chóng)工作流程[1]:①將種子URL放入等待URL隊列;② 將等待URL從等待URL隊列中取出,進(jìn)行讀取URL、DNS解析、網(wǎng)頁(yè)下載等操作;③ 下載 將下載的網(wǎng)頁(yè)放入下載的網(wǎng)頁(yè)庫;④ 將下載的網(wǎng)頁(yè)網(wǎng)址放入抓取的網(wǎng)址隊列中;爬行循環(huán)。
爬蟲(chóng)的工作流程:①通過(guò)URL抓取頁(yè)面代碼;② 通過(guò)正則匹配獲取頁(yè)面的有用數據或頁(yè)面上有用的URL;③ 對獲取的數據進(jìn)行處理或通過(guò)獲取的新URL進(jìn)入下一輪爬取循環(huán)。
1.2 網(wǎng)絡(luò )爬蟲(chóng)的分類(lèi)
網(wǎng)絡(luò )爬蟲(chóng)大致可以分為一般網(wǎng)絡(luò )爬蟲(chóng)和專(zhuān)注網(wǎng)絡(luò )爬蟲(chóng)[2]。
通用網(wǎng)絡(luò )爬蟲(chóng),又稱(chēng)全網(wǎng)爬蟲(chóng),從一個(gè)或多個(gè)初始URL開(kāi)始,獲取初始頁(yè)面的代碼,同時(shí)從頁(yè)面中提取相關(guān)URL放入隊列中直到滿(mǎn)足程序停止條件。與一般網(wǎng)絡(luò )爬蟲(chóng)相比,聚焦網(wǎng)絡(luò )爬蟲(chóng)的工作流程更為復雜。它需要提前通過(guò)一定的網(wǎng)頁(yè)分析算法過(guò)濾掉一些與主題無(wú)關(guān)的URL,以保證剩余的URL在一定程度上與主題相關(guān)。放入等待抓取的 URL 隊列。然后根據搜索策略,從隊列中選擇下一步要爬取的URL,重復上述操作,直到滿(mǎn)足程序的停止條件。專(zhuān)注的網(wǎng)絡(luò )爬蟲(chóng)可以爬取與主題更相關(guān)的信息。例如,為了快速獲取微博中的數據,我們可以利用聚焦爬蟲(chóng)技術(shù)開(kāi)發(fā)微博數據抓取工具[3-5]。在當今大數據時(shí)代,專(zhuān)注爬蟲(chóng)可以大海撈針,從網(wǎng)絡(luò )數據的海洋中找到人們需要的信息,過(guò)濾掉那些“垃圾數據”(廣告信息等與檢索主題無(wú)關(guān)的數據) )。
2 蟒蛇
Python的作者是荷蘭人Guido von Rossum。1982 年,Guido 獲得了阿姆斯特丹大學(xué)的數學(xué)和計算碩士學(xué)位[6]。相比現在,在他那個(gè)年代,個(gè)人電腦的頻率和內存都非常低,導致電腦的配置偏低。為了讓程序在 PC 上運行,所有編譯器都在其核心進(jìn)行了優(yōu)化,因為如果不進(jìn)行優(yōu)化,更大的數組可能會(huì )填滿(mǎn)內存。Guido 想要編寫(xiě)一種全面、易于學(xué)習、易于使用和可擴展的新語(yǔ)言。1989 年,Guido 開(kāi)始為 Python 語(yǔ)言編寫(xiě)編譯器。
3 系統分析
本系統是一個(gè)基于Python的網(wǎng)絡(luò )爬蟲(chóng)系統,用于登錄并爬取豆瓣上的相冊、日記、話(huà)題、評論等一些動(dòng)態(tài)數據信息。并且可以將關(guān)鍵字查詢(xún)到的動(dòng)態(tài)信息數據存入數據庫,將部分數據存入數據庫,存入本地txt文件,同時(shí)可以將相冊動(dòng)態(tài)中的圖片下載到本地,還記錄專(zhuān)輯信息,在每一頁(yè)上。操作完成后,可以翻頁(yè),選擇頁(yè)面繼續操作。因此系統應滿(mǎn)足以下要求。
?。?)可以通過(guò)驗證碼驗證模擬登錄豆瓣。即不需要通過(guò)瀏覽器登錄,輸入用戶(hù)名、密碼和驗證即可登錄豆瓣??刂婆_中的代碼。
(2)登錄成功后可以抓取豆瓣首頁(yè)的代碼。即通過(guò)登錄成功后的cookie,可以訪(fǎng)問(wèn)游客無(wú)法訪(fǎng)問(wèn)的頁(yè)面,抓取頁(yè)面代碼.
?。?)可以從頁(yè)面代碼中提取出需要的信息,即需要通過(guò)正則表達式匹配等方法從抓取的頁(yè)面中獲取有用的數據信息。
?。?)可以實(shí)現翻頁(yè)和分頁(yè)功能。即訪(fǎng)問(wèn)網(wǎng)站的動(dòng)態(tài)頁(yè)面時(shí),可以通過(guò)在控制臺輸入具體內容進(jìn)行翻頁(yè)或者輸入頁(yè)碼選擇頁(yè)面,然后抓取其他頁(yè)面。
(5)實(shí)現關(guān)鍵字查詢(xún)的功能,爬取找到的數據并存入數據庫表中。即在爬取頁(yè)面獲取數據后,在控制臺輸入關(guān)鍵字即可爬取獲取需要的信息。
(6)可以將爬取的圖片的url下載到本地,圖片的詳細信息可以保存在本地txt[12]。也就是說(shuō),不僅要下載圖片到本地,還有圖片的主題信息、圖片的用戶(hù)、圖片的具體網(wǎng)址等信息都保存在txt文件中。
(7) 將日記等動(dòng)態(tài)信息存儲在不同的本地文件中。即針對抓取到的不同數據信息,采用不同的存儲方式和存儲路徑。
(8)在登錄成功的情況下,可以進(jìn)入個(gè)人中心,將當前用戶(hù)關(guān)注的用戶(hù)信息存儲在數據庫表中。這些信息可能包括用戶(hù)id、昵稱(chēng)、主頁(yè)url、個(gè)性化簽名等
以上是本課程對爬蟲(chóng)系統的一些基本要求,據此可以明確系統的功能。因為這個(gè)系統注重網(wǎng)絡(luò )信息資源的爬取,所以在用戶(hù)交互方面可能不是很美觀(guān)。本系統沒(méi)有編寫(xiě)界面,所有操作都在Eclipse控制臺中進(jìn)行。例如:在控制臺輸入用戶(hù)名、密碼和驗證碼登錄,登錄成功后的頁(yè)面選擇,頁(yè)面選擇后的數據爬取等。
但是系統運行后爬取的數據可以在數據所在的本地txt文件或數據庫中查看。因此,測試系統是否真的可以爬取數據,可以通過(guò)觀(guān)察本地txt文件內容的變化或者數據庫表中記錄的變化來(lái)驗證。
該爬蟲(chóng)系統包括模擬登錄、頁(yè)面爬取、信息爬取、數據存儲等主要功能。其中,頁(yè)面爬取包括翻頁(yè)爬取、頁(yè)面選擇爬取、個(gè)人頁(yè)面爬??;信息爬取包括動(dòng)態(tài)爬取和跟隨用戶(hù)爬??;數據存儲包括寫(xiě)入文件、下載到本地和存儲數據庫,如圖1所示。
自動(dòng)爬取 Internet 信息的程序稱(chēng)為爬蟲(chóng)。它主要由爬蟲(chóng)調度器、URL管理器、網(wǎng)頁(yè)下載器和網(wǎng)頁(yè)解析器組成。
(1)爬蟲(chóng)調度器:程序的入口點(diǎn),主要負責爬蟲(chóng)程序的控制。
?、?網(wǎng)址管理器:
?、?為要爬取的集合添加新的URL;
?、谂袛嘁砑拥腢RL是否已經(jīng)存在;
?、?判斷是否還有待爬取的URL,將待爬取集合中的URL移動(dòng)到爬取集合中。
URL存儲方式:Python內存是set()集合、關(guān)系數據庫、緩存數據庫。
(3)網(wǎng)頁(yè)下載器:根據URL獲取網(wǎng)頁(yè)內容,通過(guò)urllib2和request實(shí)現。
?、染W(wǎng)頁(yè)解析器:從網(wǎng)頁(yè)中提取有價(jià)值的數據。實(shí)現方式包括正則表達式、html.parser、BeautifulSoup、lxml。
4。結論
爬蟲(chóng)是一種自動(dòng)下載網(wǎng)頁(yè)的程序。它根據給定的爬取目標有選擇地訪(fǎng)問(wèn)萬(wàn)維網(wǎng)上的網(wǎng)頁(yè)及其相關(guān)鏈接,以獲取所需的信息。
本文中,爬蟲(chóng)旨在爬取與特定主題內容相關(guān)的網(wǎng)頁(yè),為面向主題的用戶(hù)查詢(xún)準備數據資源,實(shí)現網(wǎng)頁(yè)數據的抓取和分析。
參考:
[1] 曾小虎. 基于主題的微博網(wǎng)絡(luò )爬蟲(chóng)研究[D]. 武漢理工大學(xué), 2014.
[2] 周麗珠,林玲.爬蟲(chóng)技術(shù)研究綜述[J]. 計算機應用,2005. 25 (9): 1965-1969
[3] 周中華,張惠然,謝江。Python中的新浪微博數據爬蟲(chóng)[J]. 計算機應用,2014.34 (11): 3131-3134
[4] 劉晶晶. 面向微博的網(wǎng)絡(luò )爬蟲(chóng)研究與實(shí)現[D]. 復旦大學(xué),2012.
[5] 王靜,朱可,王斌強?;谛畔祿治龅奈⒉┭芯烤C述[J]. 計算機應用, 2012. 32 (7): 2027-2029, 2037.@ >
[6](挪威)Magnus Lie Hetland。思偉,曾俊偉,譚英華,譯。Python基礎教程[M].人民郵電出版社,2014. 查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(:網(wǎng)絡(luò )爬蟲(chóng);Python;MySQL;正則表達式;)
吳永聰

摘要: 近年來(lái),隨著(zhù)互聯(lián)網(wǎng)的發(fā)展,如何有效地從互聯(lián)網(wǎng)上獲取所需信息已成為眾多互聯(lián)網(wǎng)公司競爭研究的新方向。從互聯(lián)網(wǎng)獲取數據最常用的方法是網(wǎng)絡(luò )爬蟲(chóng)。網(wǎng)絡(luò )爬蟲(chóng),也稱(chēng)為網(wǎng)絡(luò )蜘蛛和網(wǎng)絡(luò )機器人,是一種根據特定規則和給定 URL 自動(dòng)采集互聯(lián)網(wǎng)數據和信息的程序。文章討論了網(wǎng)絡(luò )爬蟲(chóng)實(shí)現過(guò)程中的主要問(wèn)題:如何使用python模擬登錄、如何使用正則表達式匹配字符串獲取信息、如何使用mysql存儲數據等,并實(shí)現一個(gè)使用 python 的網(wǎng)絡(luò )爬蟲(chóng)系統。
關(guān)鍵詞:網(wǎng)絡(luò )爬蟲(chóng);Python; MySQL;常用表達
CLC 編號:TP311.11 文號:A文章編號:1006-8228 (2019)08-94-03
摘要:近年來(lái),隨著(zhù)互聯(lián)網(wǎng)的發(fā)展,如何有效地從互聯(lián)網(wǎng)上獲取所需的信息成為眾多互聯(lián)網(wǎng)公司爭相研究的新方向,而最常見(jiàn)的從互聯(lián)網(wǎng)上獲取數據的手段是網(wǎng)絡(luò )爬蟲(chóng)。網(wǎng)絡(luò )爬蟲(chóng)也稱(chēng)為網(wǎng)絡(luò )蜘蛛或網(wǎng)絡(luò )機器人,它是根據給定的 URL 和特定規則自動(dòng)采集互聯(lián)網(wǎng)數據和信息的程序。本文討論了網(wǎng)絡(luò )爬蟲(chóng)實(shí)現中的主要問(wèn)題,如如何使用Python模擬登錄、如何使用正則表達式匹配字符串獲取信息以及如何使用MySQL存儲數據等。最后通過(guò)對Python語(yǔ)言的研究,實(shí)現了一個(gè)基于Python的網(wǎng)絡(luò )爬蟲(chóng)程序系統。
關(guān)鍵詞:網(wǎng)絡(luò )爬蟲(chóng);Python; MySQL;正則表達式
0 前言
在網(wǎng)絡(luò )信息和數據爆炸式增長(cháng)的時(shí)代,盡管互聯(lián)網(wǎng)信息技術(shù)飛速發(fā)展,但仍然難以從如此海量的信息數據中找到真正有用的信息。于是,谷歌、百度、雅虎等搜索引擎應運而生。搜索引擎可以根據用戶(hù)輸入的關(guān)鍵字檢索互聯(lián)網(wǎng)上的網(wǎng)頁(yè),為用戶(hù)查找與關(guān)鍵字相關(guān)或收錄關(guān)鍵字的信息。網(wǎng)絡(luò )爬蟲(chóng)作為搜索引擎的重要組成部分,在信息檢索過(guò)程中發(fā)揮著(zhù)重要作用。因此,網(wǎng)絡(luò )爬蟲(chóng)的研究對搜索引擎的發(fā)展具有重要意義。對于編寫(xiě)網(wǎng)絡(luò )爬蟲(chóng),python有其獨特的優(yōu)勢。比如python中有很多爬蟲(chóng)框架,使得網(wǎng)絡(luò )爬蟲(chóng)爬取數據的效率更高。同時(shí),Python 是一種面向對象的解釋型高級編程語(yǔ)言。它的語(yǔ)法比其他高級編程語(yǔ)言更簡(jiǎn)單、更容易閱讀和理解。因此,使用 Python 實(shí)現網(wǎng)絡(luò )爬蟲(chóng)是一個(gè)不錯的選擇。
1 網(wǎng)絡(luò )爬蟲(chóng)概述
1.1 網(wǎng)絡(luò )爬蟲(chóng)原理
網(wǎng)絡(luò )爬蟲(chóng),又稱(chēng)網(wǎng)絡(luò )蜘蛛、網(wǎng)絡(luò )機器人,主要用于采集互聯(lián)網(wǎng)上的各種資源。它是搜索引擎的重要組成部分,是一種自動(dòng)提取 Internet 上特定頁(yè)面內容的程序。通用搜索引擎網(wǎng)絡(luò )爬蟲(chóng)工作流程[1]:①將種子URL放入等待URL隊列;② 將等待URL從等待URL隊列中取出,進(jìn)行讀取URL、DNS解析、網(wǎng)頁(yè)下載等操作;③ 下載 將下載的網(wǎng)頁(yè)放入下載的網(wǎng)頁(yè)庫;④ 將下載的網(wǎng)頁(yè)網(wǎng)址放入抓取的網(wǎng)址隊列中;爬行循環(huán)。
爬蟲(chóng)的工作流程:①通過(guò)URL抓取頁(yè)面代碼;② 通過(guò)正則匹配獲取頁(yè)面的有用數據或頁(yè)面上有用的URL;③ 對獲取的數據進(jìn)行處理或通過(guò)獲取的新URL進(jìn)入下一輪爬取循環(huán)。
1.2 網(wǎng)絡(luò )爬蟲(chóng)的分類(lèi)
網(wǎng)絡(luò )爬蟲(chóng)大致可以分為一般網(wǎng)絡(luò )爬蟲(chóng)和專(zhuān)注網(wǎng)絡(luò )爬蟲(chóng)[2]。
通用網(wǎng)絡(luò )爬蟲(chóng),又稱(chēng)全網(wǎng)爬蟲(chóng),從一個(gè)或多個(gè)初始URL開(kāi)始,獲取初始頁(yè)面的代碼,同時(shí)從頁(yè)面中提取相關(guān)URL放入隊列中直到滿(mǎn)足程序停止條件。與一般網(wǎng)絡(luò )爬蟲(chóng)相比,聚焦網(wǎng)絡(luò )爬蟲(chóng)的工作流程更為復雜。它需要提前通過(guò)一定的網(wǎng)頁(yè)分析算法過(guò)濾掉一些與主題無(wú)關(guān)的URL,以保證剩余的URL在一定程度上與主題相關(guān)。放入等待抓取的 URL 隊列。然后根據搜索策略,從隊列中選擇下一步要爬取的URL,重復上述操作,直到滿(mǎn)足程序的停止條件。專(zhuān)注的網(wǎng)絡(luò )爬蟲(chóng)可以爬取與主題更相關(guān)的信息。例如,為了快速獲取微博中的數據,我們可以利用聚焦爬蟲(chóng)技術(shù)開(kāi)發(fā)微博數據抓取工具[3-5]。在當今大數據時(shí)代,專(zhuān)注爬蟲(chóng)可以大海撈針,從網(wǎng)絡(luò )數據的海洋中找到人們需要的信息,過(guò)濾掉那些“垃圾數據”(廣告信息等與檢索主題無(wú)關(guān)的數據) )。
2 蟒蛇
Python的作者是荷蘭人Guido von Rossum。1982 年,Guido 獲得了阿姆斯特丹大學(xué)的數學(xué)和計算碩士學(xué)位[6]。相比現在,在他那個(gè)年代,個(gè)人電腦的頻率和內存都非常低,導致電腦的配置偏低。為了讓程序在 PC 上運行,所有編譯器都在其核心進(jìn)行了優(yōu)化,因為如果不進(jìn)行優(yōu)化,更大的數組可能會(huì )填滿(mǎn)內存。Guido 想要編寫(xiě)一種全面、易于學(xué)習、易于使用和可擴展的新語(yǔ)言。1989 年,Guido 開(kāi)始為 Python 語(yǔ)言編寫(xiě)編譯器。
3 系統分析
本系統是一個(gè)基于Python的網(wǎng)絡(luò )爬蟲(chóng)系統,用于登錄并爬取豆瓣上的相冊、日記、話(huà)題、評論等一些動(dòng)態(tài)數據信息。并且可以將關(guān)鍵字查詢(xún)到的動(dòng)態(tài)信息數據存入數據庫,將部分數據存入數據庫,存入本地txt文件,同時(shí)可以將相冊動(dòng)態(tài)中的圖片下載到本地,還記錄專(zhuān)輯信息,在每一頁(yè)上。操作完成后,可以翻頁(yè),選擇頁(yè)面繼續操作。因此系統應滿(mǎn)足以下要求。
?。?)可以通過(guò)驗證碼驗證模擬登錄豆瓣。即不需要通過(guò)瀏覽器登錄,輸入用戶(hù)名、密碼和驗證即可登錄豆瓣??刂婆_中的代碼。
(2)登錄成功后可以抓取豆瓣首頁(yè)的代碼。即通過(guò)登錄成功后的cookie,可以訪(fǎng)問(wèn)游客無(wú)法訪(fǎng)問(wèn)的頁(yè)面,抓取頁(yè)面代碼.
?。?)可以從頁(yè)面代碼中提取出需要的信息,即需要通過(guò)正則表達式匹配等方法從抓取的頁(yè)面中獲取有用的數據信息。
?。?)可以實(shí)現翻頁(yè)和分頁(yè)功能。即訪(fǎng)問(wèn)網(wǎng)站的動(dòng)態(tài)頁(yè)面時(shí),可以通過(guò)在控制臺輸入具體內容進(jìn)行翻頁(yè)或者輸入頁(yè)碼選擇頁(yè)面,然后抓取其他頁(yè)面。
(5)實(shí)現關(guān)鍵字查詢(xún)的功能,爬取找到的數據并存入數據庫表中。即在爬取頁(yè)面獲取數據后,在控制臺輸入關(guān)鍵字即可爬取獲取需要的信息。
(6)可以將爬取的圖片的url下載到本地,圖片的詳細信息可以保存在本地txt[12]。也就是說(shuō),不僅要下載圖片到本地,還有圖片的主題信息、圖片的用戶(hù)、圖片的具體網(wǎng)址等信息都保存在txt文件中。
(7) 將日記等動(dòng)態(tài)信息存儲在不同的本地文件中。即針對抓取到的不同數據信息,采用不同的存儲方式和存儲路徑。
(8)在登錄成功的情況下,可以進(jìn)入個(gè)人中心,將當前用戶(hù)關(guān)注的用戶(hù)信息存儲在數據庫表中。這些信息可能包括用戶(hù)id、昵稱(chēng)、主頁(yè)url、個(gè)性化簽名等
以上是本課程對爬蟲(chóng)系統的一些基本要求,據此可以明確系統的功能。因為這個(gè)系統注重網(wǎng)絡(luò )信息資源的爬取,所以在用戶(hù)交互方面可能不是很美觀(guān)。本系統沒(méi)有編寫(xiě)界面,所有操作都在Eclipse控制臺中進(jìn)行。例如:在控制臺輸入用戶(hù)名、密碼和驗證碼登錄,登錄成功后的頁(yè)面選擇,頁(yè)面選擇后的數據爬取等。
但是系統運行后爬取的數據可以在數據所在的本地txt文件或數據庫中查看。因此,測試系統是否真的可以爬取數據,可以通過(guò)觀(guān)察本地txt文件內容的變化或者數據庫表中記錄的變化來(lái)驗證。
該爬蟲(chóng)系統包括模擬登錄、頁(yè)面爬取、信息爬取、數據存儲等主要功能。其中,頁(yè)面爬取包括翻頁(yè)爬取、頁(yè)面選擇爬取、個(gè)人頁(yè)面爬??;信息爬取包括動(dòng)態(tài)爬取和跟隨用戶(hù)爬??;數據存儲包括寫(xiě)入文件、下載到本地和存儲數據庫,如圖1所示。
自動(dòng)爬取 Internet 信息的程序稱(chēng)為爬蟲(chóng)。它主要由爬蟲(chóng)調度器、URL管理器、網(wǎng)頁(yè)下載器和網(wǎng)頁(yè)解析器組成。
(1)爬蟲(chóng)調度器:程序的入口點(diǎn),主要負責爬蟲(chóng)程序的控制。
?、?網(wǎng)址管理器:
?、?為要爬取的集合添加新的URL;
?、谂袛嘁砑拥腢RL是否已經(jīng)存在;
?、?判斷是否還有待爬取的URL,將待爬取集合中的URL移動(dòng)到爬取集合中。
URL存儲方式:Python內存是set()集合、關(guān)系數據庫、緩存數據庫。
(3)網(wǎng)頁(yè)下載器:根據URL獲取網(wǎng)頁(yè)內容,通過(guò)urllib2和request實(shí)現。
?、染W(wǎng)頁(yè)解析器:從網(wǎng)頁(yè)中提取有價(jià)值的數據。實(shí)現方式包括正則表達式、html.parser、BeautifulSoup、lxml。
4。結論
爬蟲(chóng)是一種自動(dòng)下載網(wǎng)頁(yè)的程序。它根據給定的爬取目標有選擇地訪(fǎng)問(wèn)萬(wàn)維網(wǎng)上的網(wǎng)頁(yè)及其相關(guān)鏈接,以獲取所需的信息。
本文中,爬蟲(chóng)旨在爬取與特定主題內容相關(guān)的網(wǎng)頁(yè),為面向主題的用戶(hù)查詢(xún)準備數據資源,實(shí)現網(wǎng)頁(yè)數據的抓取和分析。
參考:
[1] 曾小虎. 基于主題的微博網(wǎng)絡(luò )爬蟲(chóng)研究[D]. 武漢理工大學(xué), 2014.
[2] 周麗珠,林玲.爬蟲(chóng)技術(shù)研究綜述[J]. 計算機應用,2005. 25 (9): 1965-1969
[3] 周中華,張惠然,謝江。Python中的新浪微博數據爬蟲(chóng)[J]. 計算機應用,2014.34 (11): 3131-3134
[4] 劉晶晶. 面向微博的網(wǎng)絡(luò )爬蟲(chóng)研究與實(shí)現[D]. 復旦大學(xué),2012.
[5] 王靜,朱可,王斌強?;谛畔祿治龅奈⒉┭芯烤C述[J]. 計算機應用, 2012. 32 (7): 2027-2029, 2037.@ >
[6](挪威)Magnus Lie Hetland。思偉,曾俊偉,譚英華,譯。Python基礎教程[M].人民郵電出版社,2014.
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(soup(爬蟲(chóng))隱形條約下的DOM結構,常伴吾身)
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 63 次瀏覽 ? 2022-03-06 02:08
爬行動(dòng)物就像風(fēng),一直陪伴著(zhù)我……
在日常的折騰中,無(wú)論是我的網(wǎng)站被別人爬取,還是別人的網(wǎng)站被我爬取,這就像一個(gè)游戲過(guò)程。雙方在“隱形條約”下完成了各自的任務(wù)。正所謂君子之情如水,我不知道他是誰(shuí),他也不知道我是誰(shuí)。我們互相提供他們需要的信息?;蛟S這種關(guān)系更像是江湖,純潔的江湖,不是說(shuō)盈盈嫣嫣和世界。只談江上輕舟飲酒,竹林歌聲。說(shuō)完,雙方收劍離開(kāi),沒(méi)有人啰嗦一句:“誰(shuí)來(lái)?報名就來(lái)?!?br /> 爬蟲(chóng)的一個(gè)重要部分是數據處理。雖然靜態(tài)加載的網(wǎng)頁(yè)結構千差萬(wàn)別,界面看起來(lái)也不一樣,但是爬取的數據是單一的,都是DOM結構的“后代”。即使你明白過(guò)濾數據的本質(zhì)是處理字符串,但處理它的方法是無(wú)窮無(wú)盡的。以下是根據不同網(wǎng)頁(yè)風(fēng)格對癥下藥。
一:《好孩子》網(wǎng)頁(yè)
特點(diǎn):有完整的DOM結構,雖然有時(shí)會(huì )使用“混亂”的編碼,例如:gb2312等,但其本質(zhì)仍然是“好孩子”。
示例網(wǎng)址:百度搜索廣告牌
分析:看源碼,不難看出Billboard的新聞格式是
子節點(diǎn),而我們需要的部分正是子節點(diǎn)標簽。a標簽的屬性類(lèi)是“l(fā)ist-title”。
像這樣的網(wǎng)頁(yè)是典型的“好孩子”網(wǎng)頁(yè),具有良好的可視化 DOM 結構,所需的信息來(lái)自同一個(gè)結構,解析起來(lái)并不費力。
分析方法:
1.使用BeautifulSoup
部分代碼如下:
從 bs4 導入 BeautifulSoup 作為湯
source_code = "..." #你得到的網(wǎng)頁(yè)的源代碼
湯域 = 湯(源代碼,'lxml')
all_a = soup_dom.find_all('a',attrs={'class':'list-title'})
對于 all_a 中的 a:
href_title = {'href':a.get('href'),'title':a.text}
結果如下:
2、使用xpath方法解析
部分代碼如下:
從 lxml 導入 etree
source_code = "..." #你得到的網(wǎng)頁(yè)的源代碼
all_a = etree.Html(source_code).xpath("//a[@class='list-title']")
對于 all_a 中的 a:
href_title = {'href':a.attrib['href'],'title':a.text}
打?。╤ref_title)
結果如下:
從以上兩種方法可以看出,可以使用bs4或者Xpath來(lái)獲取“好孩子”網(wǎng)頁(yè)的數據。畢竟管教“好孩子”的成本遠低于管教“壞孩子”的成本,所以大家都喜歡好孩子。
二:“壞小子”網(wǎng)頁(yè)
特點(diǎn):大部分是古代(2010年之前)的頁(yè)面,DOM亂七八糟。(有些網(wǎng)頁(yè)甚至只有一個(gè)封閉標簽,其余的都是由
標簽被拆分,甚至使用虛假的 API 頁(yè)面來(lái)“冒充”真實(shí)的 API。)
但是:這些網(wǎng)址大多是丹尼爾博主,不拘一格,當你找到它們時(shí),就像在懸崖下發(fā)現秘密一樣!
示例網(wǎng)址:清華大學(xué)Penny Hot于2003年編寫(xiě)的linuxc教程~yhf/linux_c/
分析:如果能用簡(jiǎn)單的方法,就用簡(jiǎn)單的方法,如果不能用常規的方法
我要再次感謝 PennyHot 組織了我在 2003 年獲得的 Linux C 文檔,以方便您使用!
解決方法:使用正則
示例代碼:
重新進(jìn)口
source_code = "..." #你得到的網(wǎng)頁(yè)的源代碼
compile = pile("[\u4e00-\u9fa5]*") #匹配盡可能多的中文
find_all = compile.findall(source_code)
對于我在 find_all 中:
如果我!=””:
打?。ㄒ唬?br /> 結果如下:
總結:沒(méi)有好方法,只要能拿到自己需要的數據,就是好方法。
最后,感謝為互聯(lián)網(wǎng)后來(lái)者做出貢獻的先輩們。盡管很多人做著(zhù)普通的工作,但他們留下的東西就像寶藏一樣,藏寶圖隱藏在互聯(lián)網(wǎng)的每一個(gè)角落。讓我自強!
2020.3.19 維科斯 查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(soup(爬蟲(chóng))隱形條約下的DOM結構,常伴吾身)
爬行動(dòng)物就像風(fēng),一直陪伴著(zhù)我……
在日常的折騰中,無(wú)論是我的網(wǎng)站被別人爬取,還是別人的網(wǎng)站被我爬取,這就像一個(gè)游戲過(guò)程。雙方在“隱形條約”下完成了各自的任務(wù)。正所謂君子之情如水,我不知道他是誰(shuí),他也不知道我是誰(shuí)。我們互相提供他們需要的信息?;蛟S這種關(guān)系更像是江湖,純潔的江湖,不是說(shuō)盈盈嫣嫣和世界。只談江上輕舟飲酒,竹林歌聲。說(shuō)完,雙方收劍離開(kāi),沒(méi)有人啰嗦一句:“誰(shuí)來(lái)?報名就來(lái)?!?br /> 爬蟲(chóng)的一個(gè)重要部分是數據處理。雖然靜態(tài)加載的網(wǎng)頁(yè)結構千差萬(wàn)別,界面看起來(lái)也不一樣,但是爬取的數據是單一的,都是DOM結構的“后代”。即使你明白過(guò)濾數據的本質(zhì)是處理字符串,但處理它的方法是無(wú)窮無(wú)盡的。以下是根據不同網(wǎng)頁(yè)風(fēng)格對癥下藥。
一:《好孩子》網(wǎng)頁(yè)
特點(diǎn):有完整的DOM結構,雖然有時(shí)會(huì )使用“混亂”的編碼,例如:gb2312等,但其本質(zhì)仍然是“好孩子”。
示例網(wǎng)址:百度搜索廣告牌
分析:看源碼,不難看出Billboard的新聞格式是
子節點(diǎn),而我們需要的部分正是子節點(diǎn)標簽。a標簽的屬性類(lèi)是“l(fā)ist-title”。
像這樣的網(wǎng)頁(yè)是典型的“好孩子”網(wǎng)頁(yè),具有良好的可視化 DOM 結構,所需的信息來(lái)自同一個(gè)結構,解析起來(lái)并不費力。
分析方法:
1.使用BeautifulSoup
部分代碼如下:
從 bs4 導入 BeautifulSoup 作為湯
source_code = "..." #你得到的網(wǎng)頁(yè)的源代碼
湯域 = 湯(源代碼,'lxml')
all_a = soup_dom.find_all('a',attrs={'class':'list-title'})
對于 all_a 中的 a:
href_title = {'href':a.get('href'),'title':a.text}
結果如下:
2、使用xpath方法解析
部分代碼如下:
從 lxml 導入 etree
source_code = "..." #你得到的網(wǎng)頁(yè)的源代碼
all_a = etree.Html(source_code).xpath("//a[@class='list-title']")
對于 all_a 中的 a:
href_title = {'href':a.attrib['href'],'title':a.text}
打?。╤ref_title)
結果如下:
從以上兩種方法可以看出,可以使用bs4或者Xpath來(lái)獲取“好孩子”網(wǎng)頁(yè)的數據。畢竟管教“好孩子”的成本遠低于管教“壞孩子”的成本,所以大家都喜歡好孩子。
二:“壞小子”網(wǎng)頁(yè)
特點(diǎn):大部分是古代(2010年之前)的頁(yè)面,DOM亂七八糟。(有些網(wǎng)頁(yè)甚至只有一個(gè)封閉標簽,其余的都是由
標簽被拆分,甚至使用虛假的 API 頁(yè)面來(lái)“冒充”真實(shí)的 API。)
但是:這些網(wǎng)址大多是丹尼爾博主,不拘一格,當你找到它們時(shí),就像在懸崖下發(fā)現秘密一樣!
示例網(wǎng)址:清華大學(xué)Penny Hot于2003年編寫(xiě)的linuxc教程~yhf/linux_c/
分析:如果能用簡(jiǎn)單的方法,就用簡(jiǎn)單的方法,如果不能用常規的方法
我要再次感謝 PennyHot 組織了我在 2003 年獲得的 Linux C 文檔,以方便您使用!
解決方法:使用正則
示例代碼:
重新進(jìn)口
source_code = "..." #你得到的網(wǎng)頁(yè)的源代碼
compile = pile("[\u4e00-\u9fa5]*") #匹配盡可能多的中文
find_all = compile.findall(source_code)
對于我在 find_all 中:
如果我!=””:
打?。ㄒ唬?br /> 結果如下:
總結:沒(méi)有好方法,只要能拿到自己需要的數據,就是好方法。
最后,感謝為互聯(lián)網(wǎng)后來(lái)者做出貢獻的先輩們。盡管很多人做著(zhù)普通的工作,但他們留下的東西就像寶藏一樣,藏寶圖隱藏在互聯(lián)網(wǎng)的每一個(gè)角落。讓我自強!
2020.3.19 維科斯
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(靜態(tài)網(wǎng)頁(yè)抓取的介紹及應用方法-上海怡健醫學(xué))
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 92 次瀏覽 ? 2022-03-06 02:07
一、靜態(tài)網(wǎng)頁(yè)抓取簡(jiǎn)介
靜態(tài)網(wǎng)頁(yè)是純 HTML 格式的網(wǎng)頁(yè)。早期的 網(wǎng)站 是由靜態(tài)網(wǎng)頁(yè)組成的。靜態(tài)網(wǎng)頁(yè)的數據更容易獲取,因為我們需要的代碼隱藏在 HTML 代碼中。為了抓取靜態(tài)網(wǎng)頁(yè),我們使用 requests 庫。Requests 允許您輕松發(fā)送 HTTP 請求。該庫使用簡(jiǎn)單,功能齊全。
二、獲取響應內容
獲取響應內容的過(guò)程相當于使用瀏覽器的過(guò)程。我們在瀏覽器中輸入URL,瀏覽器會(huì )向服務(wù)器請求內容,服務(wù)器會(huì )返回HTML代碼,瀏覽器會(huì )自動(dòng)解析代碼。我們的爬蟲(chóng)和瀏覽器發(fā)送請求的過(guò)程是一樣的,都是通過(guò)requests向瀏覽器發(fā)送請求,獲取請求內容。
import requests
# 發(fā)送請求,獲取服務(wù)器響應內容
r = requests.get("http://www.santostang.com/")
print("文本編碼:", r.encoding)
print("響應狀態(tài)碼:", r.status_code)
print("字符串方式的響應體:", r.text)
三、自定義請求
我們使用requets發(fā)送請求獲取數據,但是有些網(wǎng)頁(yè)需要設置參數來(lái)獲取需要的數據,那么我們設置這些參數
1. 傳遞 URL 參數
有時(shí)我們需要在 URL 中添加一些參數來(lái)請求特定的數據。URL中加參數的形式是在問(wèn)號之后,以key/value的形式放在URL中。我們可以將參數保存在字典中,并將參數構建到 URL 中。
key_dict = {'key1': 'value1', 'key2': 'value2'}
r = requests.get('http://httpbin.org/get', params=key_dict)
print("URL已經(jīng)正確編碼:", r.url)
print("字符串方式的響應體:\n", r.text)
2. 自定義請求標頭
請求標頭是 Headers 部分,標頭提供有關(guān)請求、響應或其他發(fā)送請求的實(shí)體的信息。簡(jiǎn)單來(lái)說(shuō)就是模擬瀏覽器的作用,所以請求頭是必須要學(xué)習的,那么我們如何構造請求頭,我們使用谷歌瀏覽器??梢渣c(diǎn)擊鼠標右鍵,點(diǎn)擊Check,然后看下圖,可以找到請求需要的參數。
# 構建請求頭
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
'Host': 'www.santostang.com'
}
r = requests.get("http://www.santostang.com/", headers=headers)
print("響應狀態(tài)碼:", r.status_code)
響應狀態(tài)碼: 200
3. 發(fā)送 POST 請求
除了get請求之外,還需要以編碼格式的形式發(fā)送一些數據,有些網(wǎng)站需要登錄才能訪(fǎng)問(wèn),所以需要使用POST請求,我們還需要傳遞一個(gè)字典到請求中的數據參數。發(fā)出請求時(shí),此數據字典將自動(dòng)編碼到表單中。
key_dict = {'key1': 'value1', 'key2': 'value2'}
r = requests.post('http://httpbin.org/post', data=key_dict)
print(r.text)
4. 超時(shí)
有時(shí)候我們發(fā)送一個(gè)請求,服務(wù)器會(huì )很長(cháng)時(shí)間沒(méi)有響應,爬蟲(chóng)會(huì )一直等待。如果爬蟲(chóng)程序執行不順暢,可以使用requests在超時(shí)參數設置的秒數后停止等待響應。我們將其設置為 0.001 秒。
url = "http://www.santostang.com/"
r = requests.get(url, timeout=0.001)
ConnectTimeout: HTTPConnectionPool(host='www.santostang.com', port=80): Max retries exceeded with url: / (Caused by ConnectTimeoutError(, 'Connection to www.santostang.com timed out. (connect timeout=0.001)'))
四、項目實(shí)例
爬豆瓣前250名電影名
# 導入包
import requests
from bs4 import BeautifulSoup
# 發(fā)送請求,獲取響應內容
def get_movies():
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
'Host': 'movie.douban.com'
}
movie_list = []
for i in range(0, 10):
# 構建url,發(fā)送請求
url = "https://movie.douban.com/top250?start={}" + str(i * 25)
r = requests.get(url, headers=headers, timeout=10)
print(str(i + 1), "頁(yè)面響應狀態(tài):", r.status_code)
# 解析網(wǎng)頁(yè)
soup = BeautifulSoup(r.text, "lxml")
div_list = soup.find_all('div', class_= 'hd')
for each in div_list:
movie = each.a.span.text.strip()
movie_list.append(movie)
return movie_list
movies = get_movies()
print(movies)
總結:本篇筆記主要學(xué)習爬取靜態(tài)網(wǎng)頁(yè)時(shí)如何發(fā)送請求,包括url參數的設置方法。最后,實(shí)現一個(gè)小案例。 查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(靜態(tài)網(wǎng)頁(yè)抓取的介紹及應用方法-上海怡健醫學(xué))
一、靜態(tài)網(wǎng)頁(yè)抓取簡(jiǎn)介
靜態(tài)網(wǎng)頁(yè)是純 HTML 格式的網(wǎng)頁(yè)。早期的 網(wǎng)站 是由靜態(tài)網(wǎng)頁(yè)組成的。靜態(tài)網(wǎng)頁(yè)的數據更容易獲取,因為我們需要的代碼隱藏在 HTML 代碼中。為了抓取靜態(tài)網(wǎng)頁(yè),我們使用 requests 庫。Requests 允許您輕松發(fā)送 HTTP 請求。該庫使用簡(jiǎn)單,功能齊全。
二、獲取響應內容
獲取響應內容的過(guò)程相當于使用瀏覽器的過(guò)程。我們在瀏覽器中輸入URL,瀏覽器會(huì )向服務(wù)器請求內容,服務(wù)器會(huì )返回HTML代碼,瀏覽器會(huì )自動(dòng)解析代碼。我們的爬蟲(chóng)和瀏覽器發(fā)送請求的過(guò)程是一樣的,都是通過(guò)requests向瀏覽器發(fā)送請求,獲取請求內容。
import requests
# 發(fā)送請求,獲取服務(wù)器響應內容
r = requests.get("http://www.santostang.com/")
print("文本編碼:", r.encoding)
print("響應狀態(tài)碼:", r.status_code)
print("字符串方式的響應體:", r.text)

三、自定義請求
我們使用requets發(fā)送請求獲取數據,但是有些網(wǎng)頁(yè)需要設置參數來(lái)獲取需要的數據,那么我們設置這些參數
1. 傳遞 URL 參數
有時(shí)我們需要在 URL 中添加一些參數來(lái)請求特定的數據。URL中加參數的形式是在問(wèn)號之后,以key/value的形式放在URL中。我們可以將參數保存在字典中,并將參數構建到 URL 中。
key_dict = {'key1': 'value1', 'key2': 'value2'}
r = requests.get('http://httpbin.org/get', params=key_dict)
print("URL已經(jīng)正確編碼:", r.url)
print("字符串方式的響應體:\n", r.text)

2. 自定義請求標頭
請求標頭是 Headers 部分,標頭提供有關(guān)請求、響應或其他發(fā)送請求的實(shí)體的信息。簡(jiǎn)單來(lái)說(shuō)就是模擬瀏覽器的作用,所以請求頭是必須要學(xué)習的,那么我們如何構造請求頭,我們使用谷歌瀏覽器??梢渣c(diǎn)擊鼠標右鍵,點(diǎn)擊Check,然后看下圖,可以找到請求需要的參數。

# 構建請求頭
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
'Host': 'www.santostang.com'
}
r = requests.get("http://www.santostang.com/", headers=headers)
print("響應狀態(tài)碼:", r.status_code)
響應狀態(tài)碼: 200
3. 發(fā)送 POST 請求
除了get請求之外,還需要以編碼格式的形式發(fā)送一些數據,有些網(wǎng)站需要登錄才能訪(fǎng)問(wèn),所以需要使用POST請求,我們還需要傳遞一個(gè)字典到請求中的數據參數。發(fā)出請求時(shí),此數據字典將自動(dòng)編碼到表單中。
key_dict = {'key1': 'value1', 'key2': 'value2'}
r = requests.post('http://httpbin.org/post', data=key_dict)
print(r.text)

4. 超時(shí)
有時(shí)候我們發(fā)送一個(gè)請求,服務(wù)器會(huì )很長(cháng)時(shí)間沒(méi)有響應,爬蟲(chóng)會(huì )一直等待。如果爬蟲(chóng)程序執行不順暢,可以使用requests在超時(shí)參數設置的秒數后停止等待響應。我們將其設置為 0.001 秒。
url = "http://www.santostang.com/"
r = requests.get(url, timeout=0.001)
ConnectTimeout: HTTPConnectionPool(host='www.santostang.com', port=80): Max retries exceeded with url: / (Caused by ConnectTimeoutError(, 'Connection to www.santostang.com timed out. (connect timeout=0.001)'))
四、項目實(shí)例
爬豆瓣前250名電影名
# 導入包
import requests
from bs4 import BeautifulSoup
# 發(fā)送請求,獲取響應內容
def get_movies():
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
'Host': 'movie.douban.com'
}
movie_list = []
for i in range(0, 10):
# 構建url,發(fā)送請求
url = "https://movie.douban.com/top250?start={}" + str(i * 25)
r = requests.get(url, headers=headers, timeout=10)
print(str(i + 1), "頁(yè)面響應狀態(tài):", r.status_code)
# 解析網(wǎng)頁(yè)
soup = BeautifulSoup(r.text, "lxml")
div_list = soup.find_all('div', class_= 'hd')
for each in div_list:
movie = each.a.span.text.strip()
movie_list.append(movie)
return movie_list
movies = get_movies()
print(movies)

總結:本篇筆記主要學(xué)習爬取靜態(tài)網(wǎng)頁(yè)時(shí)如何發(fā)送請求,包括url參數的設置方法。最后,實(shí)現一個(gè)小案例。
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(蘇寧百萬(wàn)級商品爬取索引講解4.1代碼講解(組圖))
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 68 次瀏覽 ? 2022-03-02 06:00
阿里云>云棲社區>主題地圖>C>c爬網(wǎng)數據庫
推薦活動(dòng):
更多優(yōu)惠>
當前話(huà)題:c爬網(wǎng)數據庫添加到采集夾
相關(guān)話(huà)題:
c 爬網(wǎng)數據庫相關(guān)博客查看更多博客
云數據庫產(chǎn)品概述
作者:阿里云官網(wǎng)
ApsaraDB是穩定、可靠、可彈性擴展的在線(xiàn)數據庫服務(wù)產(chǎn)品的總稱(chēng)??梢暂p松運維全球90%以上的主流開(kāi)源和商業(yè)數據庫(MySQL、SQL Server、Redis等),同時(shí)為POLARDB提供6倍以上開(kāi)源數據庫的性能和開(kāi)源的價(jià)格源數據庫和自研的具有數百TB數據實(shí)時(shí)計算能力的HybridDB數據庫等,并擁有容災、備份、恢復、監控、遷移等一整套解決方案。
現在查看
圖數據庫綜述及Nebula在圖數據庫設計中的實(shí)踐
作者:NebulaGraph2433 瀏覽評論:02年前
Nebula Graph:一個(gè)開(kāi)源的分布式圖數據庫。Nebula Graph 作為唯一可以存儲萬(wàn)億級節點(diǎn)和帶屬性邊的在線(xiàn)圖數據庫,不僅可以滿(mǎn)足高并發(fā)場(chǎng)景下毫秒級的低延遲查詢(xún)需求,還可以實(shí)現高服務(wù)可用性和數據安全性。第三屆nMeetup(nMeet
閱讀全文
Python爬蟲(chóng)入門(mén)教程3-100 數據爬取
作者:夢(mèng)橡皮擦 1100人評論:02年前
1.湄公河網(wǎng)絡(luò )資料-介紹從今天開(kāi)始,我們嘗試使用2篇博客的內容,得到一個(gè)名為“湄公河網(wǎng)絡(luò )”的網(wǎng)站網(wǎng)址:這個(gè)網(wǎng)站我分析了一下,圖片我們想抓取的是在以下網(wǎng)址
閱讀全文
蘇寧百萬(wàn)級商品爬取簡(jiǎn)述
作者:HappyFox1045 人瀏覽評論:03年前
代碼下載鏈接 蘇寧萬(wàn)級商品爬蟲(chóng)目錄思路講解分類(lèi)爬取思路講解分類(lèi)頁(yè)面爬取商品爬取3.1思路講解商品爬取13.2思路講解商品爬取23.3 代碼解釋產(chǎn)品爬取索引解釋4.1 代碼解釋索引建立4.2 代碼解釋索引查詢(xún)語(yǔ)句本部門(mén)
閱讀全文
一個(gè)存儲大量爬蟲(chóng)數據的數據庫,懂嗎?
作者:fesoncn3336 瀏覽人數:03年前
“當然,不是所有的數據都適合” 在學(xué)習爬蟲(chóng)的過(guò)程中,遇到了很多坑。你今天可能會(huì )遇到這個(gè)坑,隨著(zhù)爬取數據量的增加,以及爬取的網(wǎng)站數據字段的變化,以往爬蟲(chóng)上手的方法的局限性可能會(huì )突然增加。什么是突增法?介紹示例當開(kāi)始使用爬蟲(chóng)時(shí),
閱讀全文
Python3中如何解決亂碼爬取網(wǎng)頁(yè)信息?(更新:已解決)
作者:大連瓦工2696 瀏覽評論:04年前
更新:亂碼問(wèn)題已解決。把下面代碼中的紅色部分改成下面這樣,這樣就不會(huì )有個(gè)別職位信息出現亂碼了。soup2 = BeautifulSoup(wbdata2, 'html.parser',from_encoding="GBK") 還有:創(chuàng )建微信公眾號
閱讀全文
Python爬蟲(chóng):用BeautifulSoup爬取NBA數據
作者:夜李2725查看評論:04年前
爬蟲(chóng)的主要目的是過(guò)濾掉網(wǎng)頁(yè)中的無(wú)用信息,抓取網(wǎng)頁(yè)中的有用信息。一般的爬蟲(chóng)架構是:在使用python爬蟲(chóng)之前,必須對網(wǎng)頁(yè)的結構知識有一定的了解,比如網(wǎng)頁(yè)的標簽、網(wǎng)頁(yè)的語(yǔ)言等知識,推薦爬之前去W3School:W3school鏈接了解一些工具:1
閱讀全文
【Python爬蟲(chóng)2】網(wǎng)頁(yè)數據提取
作者:wu_being1266 瀏覽評論:05年前
提取數據方法 1 正則表達式 2 流行BeautifulSoup 模塊 3 強大的Lxml 模塊性能對比 添加鏈接爬蟲(chóng)的爬取回調 1 回調函數1 2 回調函數2 3 復用上一章的鏈接爬蟲(chóng)代碼 我們讓這個(gè)爬蟲(chóng)比較從每一個(gè)中提取一些數據網(wǎng)頁(yè),然后實(shí)現某些東西,這種做法也
閱讀全文
php爬蟲(chóng):知乎用戶(hù)數據爬取分析
作者:cuixiaozhuai2345 瀏覽評論:05年前
背景說(shuō)明:小燕使用PHP的curl寫(xiě)的爬蟲(chóng)實(shí)驗爬取知乎5w個(gè)用戶(hù)的基本信息;同時(shí)對爬取的數據進(jìn)行了簡(jiǎn)單的分析和展示。演示地址是php的蜘蛛代碼和用戶(hù)儀表盤(pán)的顯示代碼。整理好后上傳到github,在個(gè)人博客和公眾號更新代碼庫。
閱讀全文
c爬網(wǎng)數據庫相關(guān)問(wèn)答
基礎語(yǔ)言問(wèn)題-Python
作者:薯片醬 55293 瀏覽評論:494年前
#基礎語(yǔ)言100題——Python#最近軟件界有一句很流行的一句話(huà),“人生苦短,快用Python”,這句話(huà)說(shuō)明了Python的特點(diǎn),那就是快。當然,這個(gè)快并不代表 Python 跑得快,畢竟它是一種腳本語(yǔ)言,不管它有多快,而是 C 語(yǔ)言和 C++ 等底層語(yǔ)言,這里的快是指使用 Python
閱讀全文 查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(蘇寧百萬(wàn)級商品爬取索引講解4.1代碼講解(組圖))
阿里云>云棲社區>主題地圖>C>c爬網(wǎng)數據庫

推薦活動(dòng):
更多優(yōu)惠>
當前話(huà)題:c爬網(wǎng)數據庫添加到采集夾
相關(guān)話(huà)題:
c 爬網(wǎng)數據庫相關(guān)博客查看更多博客
云數據庫產(chǎn)品概述


作者:阿里云官網(wǎng)
ApsaraDB是穩定、可靠、可彈性擴展的在線(xiàn)數據庫服務(wù)產(chǎn)品的總稱(chēng)??梢暂p松運維全球90%以上的主流開(kāi)源和商業(yè)數據庫(MySQL、SQL Server、Redis等),同時(shí)為POLARDB提供6倍以上開(kāi)源數據庫的性能和開(kāi)源的價(jià)格源數據庫和自研的具有數百TB數據實(shí)時(shí)計算能力的HybridDB數據庫等,并擁有容災、備份、恢復、監控、遷移等一整套解決方案。
現在查看
圖數據庫綜述及Nebula在圖數據庫設計中的實(shí)踐

作者:NebulaGraph2433 瀏覽評論:02年前
Nebula Graph:一個(gè)開(kāi)源的分布式圖數據庫。Nebula Graph 作為唯一可以存儲萬(wàn)億級節點(diǎn)和帶屬性邊的在線(xiàn)圖數據庫,不僅可以滿(mǎn)足高并發(fā)場(chǎng)景下毫秒級的低延遲查詢(xún)需求,還可以實(shí)現高服務(wù)可用性和數據安全性。第三屆nMeetup(nMeet
閱讀全文
Python爬蟲(chóng)入門(mén)教程3-100 數據爬取

作者:夢(mèng)橡皮擦 1100人評論:02年前
1.湄公河網(wǎng)絡(luò )資料-介紹從今天開(kāi)始,我們嘗試使用2篇博客的內容,得到一個(gè)名為“湄公河網(wǎng)絡(luò )”的網(wǎng)站網(wǎng)址:這個(gè)網(wǎng)站我分析了一下,圖片我們想抓取的是在以下網(wǎng)址
閱讀全文
蘇寧百萬(wàn)級商品爬取簡(jiǎn)述

作者:HappyFox1045 人瀏覽評論:03年前
代碼下載鏈接 蘇寧萬(wàn)級商品爬蟲(chóng)目錄思路講解分類(lèi)爬取思路講解分類(lèi)頁(yè)面爬取商品爬取3.1思路講解商品爬取13.2思路講解商品爬取23.3 代碼解釋產(chǎn)品爬取索引解釋4.1 代碼解釋索引建立4.2 代碼解釋索引查詢(xún)語(yǔ)句本部門(mén)
閱讀全文
一個(gè)存儲大量爬蟲(chóng)數據的數據庫,懂嗎?

作者:fesoncn3336 瀏覽人數:03年前
“當然,不是所有的數據都適合” 在學(xué)習爬蟲(chóng)的過(guò)程中,遇到了很多坑。你今天可能會(huì )遇到這個(gè)坑,隨著(zhù)爬取數據量的增加,以及爬取的網(wǎng)站數據字段的變化,以往爬蟲(chóng)上手的方法的局限性可能會(huì )突然增加。什么是突增法?介紹示例當開(kāi)始使用爬蟲(chóng)時(shí),
閱讀全文
Python3中如何解決亂碼爬取網(wǎng)頁(yè)信息?(更新:已解決)

作者:大連瓦工2696 瀏覽評論:04年前
更新:亂碼問(wèn)題已解決。把下面代碼中的紅色部分改成下面這樣,這樣就不會(huì )有個(gè)別職位信息出現亂碼了。soup2 = BeautifulSoup(wbdata2, 'html.parser',from_encoding="GBK") 還有:創(chuàng )建微信公眾號
閱讀全文
Python爬蟲(chóng):用BeautifulSoup爬取NBA數據

作者:夜李2725查看評論:04年前
爬蟲(chóng)的主要目的是過(guò)濾掉網(wǎng)頁(yè)中的無(wú)用信息,抓取網(wǎng)頁(yè)中的有用信息。一般的爬蟲(chóng)架構是:在使用python爬蟲(chóng)之前,必須對網(wǎng)頁(yè)的結構知識有一定的了解,比如網(wǎng)頁(yè)的標簽、網(wǎng)頁(yè)的語(yǔ)言等知識,推薦爬之前去W3School:W3school鏈接了解一些工具:1
閱讀全文
【Python爬蟲(chóng)2】網(wǎng)頁(yè)數據提取

作者:wu_being1266 瀏覽評論:05年前
提取數據方法 1 正則表達式 2 流行BeautifulSoup 模塊 3 強大的Lxml 模塊性能對比 添加鏈接爬蟲(chóng)的爬取回調 1 回調函數1 2 回調函數2 3 復用上一章的鏈接爬蟲(chóng)代碼 我們讓這個(gè)爬蟲(chóng)比較從每一個(gè)中提取一些數據網(wǎng)頁(yè),然后實(shí)現某些東西,這種做法也
閱讀全文
php爬蟲(chóng):知乎用戶(hù)數據爬取分析

作者:cuixiaozhuai2345 瀏覽評論:05年前
背景說(shuō)明:小燕使用PHP的curl寫(xiě)的爬蟲(chóng)實(shí)驗爬取知乎5w個(gè)用戶(hù)的基本信息;同時(shí)對爬取的數據進(jìn)行了簡(jiǎn)單的分析和展示。演示地址是php的蜘蛛代碼和用戶(hù)儀表盤(pán)的顯示代碼。整理好后上傳到github,在個(gè)人博客和公眾號更新代碼庫。
閱讀全文
c爬網(wǎng)數據庫相關(guān)問(wèn)答
基礎語(yǔ)言問(wèn)題-Python

作者:薯片醬 55293 瀏覽評論:494年前
#基礎語(yǔ)言100題——Python#最近軟件界有一句很流行的一句話(huà),“人生苦短,快用Python”,這句話(huà)說(shuō)明了Python的特點(diǎn),那就是快。當然,這個(gè)快并不代表 Python 跑得快,畢竟它是一種腳本語(yǔ)言,不管它有多快,而是 C 語(yǔ)言和 C++ 等底層語(yǔ)言,這里的快是指使用 Python
閱讀全文
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(一下如何用Excel快速抓取網(wǎng)頁(yè)數據(圖)的技巧)
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 67 次瀏覽 ? 2022-02-28 23:02
網(wǎng)站 上的數據源是我們統計分析的重要信息來(lái)源。我們生活中經(jīng)常聽(tīng)到一個(gè)詞叫“爬蟲(chóng)”,它可以快速爬取網(wǎng)頁(yè)上的數據,這對于數據分析相關(guān)的工作來(lái)說(shuō)是極其重要的,也是必備的技能之一。但是,大多數爬蟲(chóng)都需要編程知識,普通人很難上手。今天我將向您展示如何使用 Excel 快速抓取 Web 數據。
1、首先打開(kāi)要抓取數據的網(wǎng)站,復制網(wǎng)站的地址。
2、創(chuàng )建一個(gè)新的 Excel 工作簿,然后單擊“數據”菜單 >“獲取外部數據”選項卡中的“來(lái)自 網(wǎng)站”選項。
在彈出的“New Web Query”對話(huà)框中,在地址欄中輸入要捕獲的網(wǎng)站的地址,點(diǎn)擊“Go”
點(diǎn)擊黃色導入箭頭,選擇要抓取的部分,如圖。點(diǎn)擊導入。
3、選擇存儲數據的位置(默認選中的單元格),點(diǎn)擊確定。一般建議將數據存儲在“A1”單元格中。
4、如果想讓Excel工作簿數據根據網(wǎng)站的數據實(shí)時(shí)自動(dòng)更新,那么我們需要在“屬性”中進(jìn)行設置??梢栽O置“允許后臺刷新”、“刷新頻率”、“打開(kāi)文件時(shí)刷新數據”等。
拿到數據之后,就需要對數據進(jìn)行處理,而處理數據是比較重要的一環(huán)。更多數據處理技巧,請關(guān)注我!
鄭重聲明:本文版權歸原作者所有,轉載文章僅出于傳播更多信息之目的。如果作者信息標注有誤,請盡快聯(lián)系我們修改或刪除,謝謝。 查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(一下如何用Excel快速抓取網(wǎng)頁(yè)數據(圖)的技巧)
網(wǎng)站 上的數據源是我們統計分析的重要信息來(lái)源。我們生活中經(jīng)常聽(tīng)到一個(gè)詞叫“爬蟲(chóng)”,它可以快速爬取網(wǎng)頁(yè)上的數據,這對于數據分析相關(guān)的工作來(lái)說(shuō)是極其重要的,也是必備的技能之一。但是,大多數爬蟲(chóng)都需要編程知識,普通人很難上手。今天我將向您展示如何使用 Excel 快速抓取 Web 數據。
1、首先打開(kāi)要抓取數據的網(wǎng)站,復制網(wǎng)站的地址。

2、創(chuàng )建一個(gè)新的 Excel 工作簿,然后單擊“數據”菜單 >“獲取外部數據”選項卡中的“來(lái)自 網(wǎng)站”選項。

在彈出的“New Web Query”對話(huà)框中,在地址欄中輸入要捕獲的網(wǎng)站的地址,點(diǎn)擊“Go”

點(diǎn)擊黃色導入箭頭,選擇要抓取的部分,如圖。點(diǎn)擊導入。

3、選擇存儲數據的位置(默認選中的單元格),點(diǎn)擊確定。一般建議將數據存儲在“A1”單元格中。



4、如果想讓Excel工作簿數據根據網(wǎng)站的數據實(shí)時(shí)自動(dòng)更新,那么我們需要在“屬性”中進(jìn)行設置??梢栽O置“允許后臺刷新”、“刷新頻率”、“打開(kāi)文件時(shí)刷新數據”等。

拿到數據之后,就需要對數據進(jìn)行處理,而處理數據是比較重要的一環(huán)。更多數據處理技巧,請關(guān)注我!
鄭重聲明:本文版權歸原作者所有,轉載文章僅出于傳播更多信息之目的。如果作者信息標注有誤,請盡快聯(lián)系我們修改或刪除,謝謝。
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(通用爬蟲(chóng)如何獲取一個(gè)新網(wǎng)站的工作流程及解決方法)
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 60 次瀏覽 ? 2022-02-28 22:20
萬(wàn)能爬蟲(chóng)是一個(gè)自動(dòng)提取網(wǎng)頁(yè)的程序。它從互聯(lián)網(wǎng)上為搜索引擎下載網(wǎng)頁(yè),是搜索引擎的重要組成部分。
萬(wàn)能爬蟲(chóng)從一個(gè)或多個(gè)初始網(wǎng)頁(yè)的URL開(kāi)始,獲取初始網(wǎng)頁(yè)上的URL。在爬取網(wǎng)頁(yè)的過(guò)程中,不斷地從當前頁(yè)面中提取新的 URL 并放入隊列中,直到滿(mǎn)足系統的某個(gè)停止條件。圖1展示了一般爬蟲(chóng)爬取網(wǎng)頁(yè)的過(guò)程。
通用網(wǎng)絡(luò )爬蟲(chóng)從 Internet 采集網(wǎng)頁(yè)和 采集 信息。這些網(wǎng)頁(yè)信息用于為搜索引擎的索引提供支持。它決定了整個(gè)引擎系統的內容是否豐富,信息是否及時(shí),從而決定其性能的好壞。直接影響搜索引擎的效果。
但是用于搜索引擎的通用爬蟲(chóng)的爬取行為需要遵守一定的規則,遵守一些命令或文件的內容,比如標有nofollow的鏈接,或者Robots協(xié)議(后面會(huì )有相關(guān)介紹) .
了解更多:搜索引擎工作流程
搜索引擎是通用爬蟲(chóng)最重要的應用領(lǐng)域,也是大家使用網(wǎng)絡(luò )功能時(shí)最大的助手。接下來(lái)介紹一下搜索引擎的工作流程,主要包括以下幾個(gè)步驟。
1. 爬網(wǎng)
搜索引擎使用通用爬蟲(chóng)來(lái)爬取網(wǎng)頁(yè)?;竟ぷ髁鞒膛c其他爬蟲(chóng)類(lèi)似。一般步驟如下:
(1)先選擇一部分種子URL,將這些URL放入待爬取的URL隊列中;
(2)取出要爬取的URL,解析DNS得到主機的IP,下載該URL對應的網(wǎng)頁(yè),存入下載的網(wǎng)頁(yè)庫,將這些URL放入已爬取的URL隊列中.
(3)分析已經(jīng)爬取的URL隊列中的URL,分析其中的其他URL,將這些URL放入待爬取的URL隊列中,從而進(jìn)入下一個(gè)循環(huán)。
那么搜索引擎如何獲得一個(gè)新的網(wǎng)站 URL呢?
?。?)新增網(wǎng)站主動(dòng)向搜索引擎提交網(wǎng)址:(如百度)。
?。?)在其他網(wǎng)站上設置新的網(wǎng)站外部鏈接(盡量在搜索引擎爬蟲(chóng)范圍內)。
?。?)搜索引擎與DNS解析服務(wù)商(如DNSPod等)合作,新的網(wǎng)站域名會(huì )被快速抓取。
2. 數據存儲
搜索引擎通過(guò)爬蟲(chóng)爬取網(wǎng)頁(yè)后,將數據存儲在原創(chuàng )頁(yè)面數據庫中。頁(yè)面數據與用戶(hù)瀏覽器獲取的 HTML 完全相同。
搜索引擎蜘蛛在抓取頁(yè)面時(shí)也會(huì )進(jìn)行某些重復內容檢測。一旦他們遇到大量抄襲、采集 或復制訪(fǎng)問(wèn)權重低的網(wǎng)站 上的內容,很有可能不再使用。爬行。
3. 預處理
搜索引擎將從爬蟲(chóng)中抓取回頁(yè)面并執行各種預處理步驟,包括:
· 提取文本
·中文分詞 查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(通用爬蟲(chóng)如何獲取一個(gè)新網(wǎng)站的工作流程及解決方法)
萬(wàn)能爬蟲(chóng)是一個(gè)自動(dòng)提取網(wǎng)頁(yè)的程序。它從互聯(lián)網(wǎng)上為搜索引擎下載網(wǎng)頁(yè),是搜索引擎的重要組成部分。
萬(wàn)能爬蟲(chóng)從一個(gè)或多個(gè)初始網(wǎng)頁(yè)的URL開(kāi)始,獲取初始網(wǎng)頁(yè)上的URL。在爬取網(wǎng)頁(yè)的過(guò)程中,不斷地從當前頁(yè)面中提取新的 URL 并放入隊列中,直到滿(mǎn)足系統的某個(gè)停止條件。圖1展示了一般爬蟲(chóng)爬取網(wǎng)頁(yè)的過(guò)程。

通用網(wǎng)絡(luò )爬蟲(chóng)從 Internet 采集網(wǎng)頁(yè)和 采集 信息。這些網(wǎng)頁(yè)信息用于為搜索引擎的索引提供支持。它決定了整個(gè)引擎系統的內容是否豐富,信息是否及時(shí),從而決定其性能的好壞。直接影響搜索引擎的效果。
但是用于搜索引擎的通用爬蟲(chóng)的爬取行為需要遵守一定的規則,遵守一些命令或文件的內容,比如標有nofollow的鏈接,或者Robots協(xié)議(后面會(huì )有相關(guān)介紹) .
了解更多:搜索引擎工作流程
搜索引擎是通用爬蟲(chóng)最重要的應用領(lǐng)域,也是大家使用網(wǎng)絡(luò )功能時(shí)最大的助手。接下來(lái)介紹一下搜索引擎的工作流程,主要包括以下幾個(gè)步驟。
1. 爬網(wǎng)
搜索引擎使用通用爬蟲(chóng)來(lái)爬取網(wǎng)頁(yè)?;竟ぷ髁鞒膛c其他爬蟲(chóng)類(lèi)似。一般步驟如下:
(1)先選擇一部分種子URL,將這些URL放入待爬取的URL隊列中;
(2)取出要爬取的URL,解析DNS得到主機的IP,下載該URL對應的網(wǎng)頁(yè),存入下載的網(wǎng)頁(yè)庫,將這些URL放入已爬取的URL隊列中.
(3)分析已經(jīng)爬取的URL隊列中的URL,分析其中的其他URL,將這些URL放入待爬取的URL隊列中,從而進(jìn)入下一個(gè)循環(huán)。
那么搜索引擎如何獲得一個(gè)新的網(wǎng)站 URL呢?
?。?)新增網(wǎng)站主動(dòng)向搜索引擎提交網(wǎng)址:(如百度)。
?。?)在其他網(wǎng)站上設置新的網(wǎng)站外部鏈接(盡量在搜索引擎爬蟲(chóng)范圍內)。
?。?)搜索引擎與DNS解析服務(wù)商(如DNSPod等)合作,新的網(wǎng)站域名會(huì )被快速抓取。
2. 數據存儲
搜索引擎通過(guò)爬蟲(chóng)爬取網(wǎng)頁(yè)后,將數據存儲在原創(chuàng )頁(yè)面數據庫中。頁(yè)面數據與用戶(hù)瀏覽器獲取的 HTML 完全相同。
搜索引擎蜘蛛在抓取頁(yè)面時(shí)也會(huì )進(jìn)行某些重復內容檢測。一旦他們遇到大量抄襲、采集 或復制訪(fǎng)問(wèn)權重低的網(wǎng)站 上的內容,很有可能不再使用。爬行。
3. 預處理
搜索引擎將從爬蟲(chóng)中抓取回頁(yè)面并執行各種預處理步驟,包括:
· 提取文本
·中文分詞
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(【】一個(gè)一級-spider頁(yè)面())
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 82 次瀏覽 ? 2022-02-28 22:18
前言
在研究數據之前,我零零散散地寫(xiě)了一些數據爬蟲(chóng),但我寫(xiě)的比較隨意。很多地方現在看起來(lái)不太合理。這次比較空閑,本來(lái)想重構之前的項目。
后來(lái)利用這個(gè)周末簡(jiǎn)單的重新寫(xiě)了一個(gè)項目,就是這個(gè)項目guwen-spider。目前這種爬蟲(chóng)還是比較簡(jiǎn)單的類(lèi)型,直接爬取頁(yè)面,然后從頁(yè)面中提取數據,將數據保存到數據庫中。
通過(guò)和我之前寫(xiě)的比較,我認為難點(diǎn)在于整個(gè)程序的健壯性和相應的容錯機制。其實(shí)昨天在寫(xiě)代碼的過(guò)程中就體現出來(lái)了。真正的主代碼其實(shí)寫(xiě)得很快,大部分時(shí)間都花在了
做穩定性調試,尋求更合理的方式處理數據與過(guò)程控制的關(guān)系。
背景
項目背景是抓取一級頁(yè)面,即目錄列表,點(diǎn)擊目錄進(jìn)入章節和長(cháng)度列表,點(diǎn)擊章節或長(cháng)度進(jìn)入具體內容頁(yè)面。
概述
本項目github地址:guwen-spider(PS:***臉上有彩蛋~~逃跑
項目技術(shù)細節
項目中大量使用了 ES7 的 async 函數,更直觀(guān)的反映了程序的流程。為方便起見(jiàn),在遍歷數據的過(guò)程中直接使用了眾所周知的 async 庫,所以難免會(huì )用到回調 promise。因為數據處理發(fā)生在回調函數中,難免會(huì )遇到一些數據傳輸問(wèn)題。,其實(shí)可以直接用ES7的async await寫(xiě)一個(gè)方法來(lái)實(shí)現同樣的功能。其實(shí)這里最好的部分是使用Class的靜態(tài)方法來(lái)封裝數據庫的操作。顧名思義,靜態(tài)方法就像原型一樣,不占用額外空間。
該項目主要使用
ES7 的 async await 協(xié)程做異步邏輯處理。使用 npm 的異步庫進(jìn)行循環(huán)遍歷和并發(fā)請求操作。使用log4js做日志處理,使用cheerio處理dom操作。使用 mongoose 連接 mongoDB 進(jìn)行數據存儲和操作。
目錄結構
項目實(shí)現計劃分析
條目是典型的多級爬取案例,目前只有書(shū)單、圖書(shū)條目對應的章節列表、章節鏈接對應的內容三個(gè)等級。有兩種方法可以獲取這樣的結構。一種是直接從外層抓取到內層,然后在內層抓取后執行下一個(gè)外層,另一種是先將外層保存到數據庫中。,然后根據外層爬取所有內章的鏈接,再次保存,然后從數據庫中查詢(xún)對應的鏈接單元爬取內容。這兩種方案各有優(yōu)缺點(diǎn)。其實(shí)這兩種方法我都試過(guò)了。后者有一個(gè)優(yōu)勢,因為三個(gè)層次是分開(kāi)捕獲的,以便盡可能多地保存相關(guān)章節。數據。你可以想象,如果按照正常邏輯使用前者
遍歷一級目錄抓取對應的二級章節目錄,然后遍歷章節列表抓取內容。當三級內容單元被爬取,需要保存的時(shí)候,如果需要大量的一級目錄信息,那么這些分層數據之間的數據傳輸,想想應該是比較復雜的事情。因此,單獨保存數據在一定程度上避免了不必要的復雜數據傳輸。
目前我們已經(jīng)考慮到,我們想要采集的古籍數量并不是很多,涵蓋各種經(jīng)文和歷史的古籍也只有大約180本。它和章節內容本身是一個(gè)很小的數據,即一個(gè)集合中有180條文檔記錄。這180本書(shū)的所有章節共有16000個(gè)章節,對應的需要訪(fǎng)問(wèn)16000個(gè)頁(yè)面才能爬取到相應的內容。所以選擇第二個(gè)應該是合理的。
項目實(shí)現
主流程有bookListInit、chapterListInit、contentListInit三個(gè)方法,分別是抓取圖書(shū)目錄、章節列表、圖書(shū)內容的方法,都是公開(kāi)暴露的初始化方法。通過(guò) async 可以控制這三種方法的運行過(guò)程。取書(shū)目錄后,將數據存入數據庫,然后將執行結果返回給主程序。如果操作成功,主程序會(huì )根據書(shū)單執行章節列表的獲取。,以同樣的方式爬取書(shū)籍的內容。
項目主入口
/**??*?爬蟲(chóng)抓取主入口??*/?const?start?=?async()?=>?{?????let?booklistRes?=?await?bookListInit();?????if?(!booklistRes)?{?????????logger.warn('書(shū)籍列表抓取出錯,程序終止...');?????????return;?????}?????logger.info('書(shū)籍列表抓取成功,現在進(jìn)行書(shū)籍章節抓取...');??????let?chapterlistRes?=?await?chapterListInit();?????if?(!chapterlistRes)?{?????????logger.warn('書(shū)籍章節列表抓取出錯,程序終止...');?????????return;?????}?????logger.info('書(shū)籍章節列表抓取成功,現在進(jìn)行書(shū)籍內容抓取...');??????let?contentListRes?=?await?contentListInit();?????if?(!contentListRes)?{?????????logger.warn('書(shū)籍章節內容抓取出錯,程序終止...');?????????return;?????}?????logger.info('書(shū)籍內容抓取成功');?}?//?開(kāi)始入口?if?(typeof?bookListInit?===?'function'?&&?typeof?chapterListInit?===?'function')?{?????//?開(kāi)始抓取?????start();?}?
介紹了 bookListInit、chapterListInit、contentListInit 三個(gè)方法
書(shū)單.js
/**??*?初始化入口??*/?const?chapterListInit?=?async()?=>?{?????const?list?=?await?bookHelper.getBookList(bookListModel);?????if?(!list)?{?????????logger.error('初始化查詢(xún)書(shū)籍目錄失敗');?????}?????logger.info('開(kāi)始抓取書(shū)籍章節列表,書(shū)籍目錄共:'?+?list.length?+?'條');?????let?res?=?await?asyncGetChapter(list);?????return?res;?};?
章節列表.js
/**??*?初始化入口??*/?const?contentListInit?=?async()?=>?{?????//獲取書(shū)籍列表?????const?list?=?await?bookHelper.getBookLi(bookListModel);?????if?(!list)?{?????????logger.error('初始化查詢(xún)書(shū)籍目錄失敗');?????????return;?????}?????const?res?=?await?mapBookList(list);?????if?(!res)?{?????????logger.error('抓取章節信息,調用?getCurBookSectionList()?進(jìn)行串行遍歷操作,執行完成回調出錯,錯誤信息已打印,請查看日志!');?????????return;?????}?????return?res;?}?
關(guān)于內容抓取的思考
圖書(shū)目錄抓取的邏輯其實(shí)很簡(jiǎn)單。只需要使用 async.mapLimit 做一次遍歷就可以保存數據,但是我們保存內容的簡(jiǎn)化邏輯其實(shí)就是遍歷章節列表,抓取鏈接中的內容。但實(shí)際情況是,鏈接數多達數萬(wàn)。從內存使用的角度來(lái)看,我們不能將它們全部保存到一個(gè)數組中然后遍歷它,所以我們需要將內容捕獲統一起來(lái)。
常見(jiàn)的遍歷方式是每次查詢(xún)一定數量進(jìn)行爬取。缺點(diǎn)是分類(lèi)只用了一定的量,數據之間沒(méi)有關(guān)聯(lián),分批插入。如果有錯誤,在容錯方面會(huì )出現一些小問(wèn)題,我們認為單獨保存一本書(shū)作為集合會(huì )有問(wèn)題。因此,我們采用第二種方法來(lái)捕獲和保存圖書(shū)單元中的內容。
這里使用了方法async.mapLimit(list, 1, (series, callback) => {}) 進(jìn)行遍歷,不可避免地用到了回調,感覺(jué)很惡心。async.mapLimit() 的第二個(gè)參數可以設置同時(shí)請求的數量。
提取后如何保存數據是個(gè)問(wèn)題
這里我們通過(guò)key對數據進(jìn)行分類(lèi),每次根據key獲取鏈接,并進(jìn)行遍歷。這樣做的好處是保存的數據是一個(gè)整體?,F在我們考慮數據保存的問(wèn)題。
1、可以整體插入
優(yōu)點(diǎn):快速的數據庫操作不浪費時(shí)間。
缺點(diǎn):有的書(shū)可能有幾百章,也就是說(shuō)插入前必須保存幾百頁(yè)的內容,這樣也很消耗內存,可能會(huì )導致程序運行不穩定。
2、可以作為每篇文章插入數據庫文章。
優(yōu)點(diǎn):頁(yè)面爬取保存的方式,可以及時(shí)保存數據。即使出現后續錯誤,也無(wú)需重新保存之前的章節。
缺點(diǎn):也明顯慢。想爬幾萬(wàn)個(gè)頁(yè)面,做幾萬(wàn)個(gè)*N的數據庫操作,仔細想想。您還可以制作緩存以一次保存一定數量的記錄。不錯的選擇。
/**??*?遍歷單條書(shū)籍下所有章節?調用內容抓取方法??*?@param?{*}?list???*/?const?mapSectionList?=?(list)?=>?{?????return?new?Promise((resolve,?reject)?=>?{?????????async.mapLimit(list,?1,?(series,?callback)?=>?{?????????????let?doc?=?series._doc;?????????????getContent(doc,?callback)?????????},?(err,?result)?=>?{?????????????if?(err)?{?????????????????logger.error('書(shū)籍目錄抓取異步執行出錯!');?????????????????logger.error(err);?????????????????reject(false);?????????????????return;?????????????}?????????????const?bookName?=?list[0].bookName;?????????????const?key?=?list[0].key;??????????????//?以整體為單元進(jìn)行保存?????????????saveAllContentToDB(result,?bookName,?key,?resolve);??????????????//以每篇文章作為單元進(jìn)行保存?????????????//?logger.info(bookName?+?'數據抓取完成,進(jìn)入下一部書(shū)籍抓取函數...');?????????????//?resolve(true);??????????})?????})?}?
兩者各有利弊,這里我們都嘗試過(guò)。準備了兩個(gè)錯誤保存集合,errContentModel 和 error采集Model。插入錯誤時(shí),將信息分別保存到相應的集合中。您可以選擇兩者之一。之所以添加集合保存數據,是為了方便一次性查看和后續操作,無(wú)需查看日志。
?。≒S,其實(shí)error采集Model集合可以完全使用,errContentModel集合可以完整保存章節信息)
//保存出錯的數據名稱(chēng)?const?errorSpider?=?mongoose.Schema({?????chapter:?String,?????section:?String,?????url:?String,?????key:?String,?????bookName:?String,?????author:?String,?})?//?保存出錯的數據名稱(chēng)?只保留key?和?bookName信息?const?errorCollection?=?mongoose.Schema({?????key:?String,?????bookName:?String,?})?
我們將每本書(shū)信息的內容放入一個(gè)新的集合中,集合以key命名。
總結
其實(shí)這個(gè)項目寫(xiě)的主要難點(diǎn)在于程序穩定性的控制,容錯機制的設置,以及錯誤的記錄。目前這個(gè)項目基本上可以一次性直接運行整個(gè)流程。但是,程序設計上肯定還存在很多問(wèn)題。歡迎指正和交流。
復活節彩蛋
寫(xiě)完這個(gè)項目,我做了一個(gè)基于React網(wǎng)站的頁(yè)面瀏覽前端和一個(gè)基于koa2.x開(kāi)發(fā)的服務(wù)器。整體技術(shù)棧相當于 React + Redux + Koa2,前后端服務(wù)分別部署,各自能夠更好的去除前后端服務(wù)的耦合。例如,同一組服務(wù)器端代碼不僅可以為 Web 提供支持,還可以為移動(dòng)和應用程序提供支持。目前整套還是很簡(jiǎn)單的,但是可以滿(mǎn)足基本的查詢(xún)和瀏覽功能。希望以后有時(shí)間讓項目更加豐富。
該項目非常簡(jiǎn)單,但有一個(gè)額外的環(huán)境用于學(xué)習和研究從前端到服務(wù)器端的開(kāi)發(fā)。 查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(【】一個(gè)一級-spider頁(yè)面())
前言
在研究數據之前,我零零散散地寫(xiě)了一些數據爬蟲(chóng),但我寫(xiě)的比較隨意。很多地方現在看起來(lái)不太合理。這次比較空閑,本來(lái)想重構之前的項目。
后來(lái)利用這個(gè)周末簡(jiǎn)單的重新寫(xiě)了一個(gè)項目,就是這個(gè)項目guwen-spider。目前這種爬蟲(chóng)還是比較簡(jiǎn)單的類(lèi)型,直接爬取頁(yè)面,然后從頁(yè)面中提取數據,將數據保存到數據庫中。
通過(guò)和我之前寫(xiě)的比較,我認為難點(diǎn)在于整個(gè)程序的健壯性和相應的容錯機制。其實(shí)昨天在寫(xiě)代碼的過(guò)程中就體現出來(lái)了。真正的主代碼其實(shí)寫(xiě)得很快,大部分時(shí)間都花在了
做穩定性調試,尋求更合理的方式處理數據與過(guò)程控制的關(guān)系。

背景
項目背景是抓取一級頁(yè)面,即目錄列表,點(diǎn)擊目錄進(jìn)入章節和長(cháng)度列表,點(diǎn)擊章節或長(cháng)度進(jìn)入具體內容頁(yè)面。
概述
本項目github地址:guwen-spider(PS:***臉上有彩蛋~~逃跑
項目技術(shù)細節
項目中大量使用了 ES7 的 async 函數,更直觀(guān)的反映了程序的流程。為方便起見(jiàn),在遍歷數據的過(guò)程中直接使用了眾所周知的 async 庫,所以難免會(huì )用到回調 promise。因為數據處理發(fā)生在回調函數中,難免會(huì )遇到一些數據傳輸問(wèn)題。,其實(shí)可以直接用ES7的async await寫(xiě)一個(gè)方法來(lái)實(shí)現同樣的功能。其實(shí)這里最好的部分是使用Class的靜態(tài)方法來(lái)封裝數據庫的操作。顧名思義,靜態(tài)方法就像原型一樣,不占用額外空間。
該項目主要使用
ES7 的 async await 協(xié)程做異步邏輯處理。使用 npm 的異步庫進(jìn)行循環(huán)遍歷和并發(fā)請求操作。使用log4js做日志處理,使用cheerio處理dom操作。使用 mongoose 連接 mongoDB 進(jìn)行數據存儲和操作。
目錄結構
項目實(shí)現計劃分析
條目是典型的多級爬取案例,目前只有書(shū)單、圖書(shū)條目對應的章節列表、章節鏈接對應的內容三個(gè)等級。有兩種方法可以獲取這樣的結構。一種是直接從外層抓取到內層,然后在內層抓取后執行下一個(gè)外層,另一種是先將外層保存到數據庫中。,然后根據外層爬取所有內章的鏈接,再次保存,然后從數據庫中查詢(xún)對應的鏈接單元爬取內容。這兩種方案各有優(yōu)缺點(diǎn)。其實(shí)這兩種方法我都試過(guò)了。后者有一個(gè)優(yōu)勢,因為三個(gè)層次是分開(kāi)捕獲的,以便盡可能多地保存相關(guān)章節。數據。你可以想象,如果按照正常邏輯使用前者
遍歷一級目錄抓取對應的二級章節目錄,然后遍歷章節列表抓取內容。當三級內容單元被爬取,需要保存的時(shí)候,如果需要大量的一級目錄信息,那么這些分層數據之間的數據傳輸,想想應該是比較復雜的事情。因此,單獨保存數據在一定程度上避免了不必要的復雜數據傳輸。
目前我們已經(jīng)考慮到,我們想要采集的古籍數量并不是很多,涵蓋各種經(jīng)文和歷史的古籍也只有大約180本。它和章節內容本身是一個(gè)很小的數據,即一個(gè)集合中有180條文檔記錄。這180本書(shū)的所有章節共有16000個(gè)章節,對應的需要訪(fǎng)問(wèn)16000個(gè)頁(yè)面才能爬取到相應的內容。所以選擇第二個(gè)應該是合理的。
項目實(shí)現
主流程有bookListInit、chapterListInit、contentListInit三個(gè)方法,分別是抓取圖書(shū)目錄、章節列表、圖書(shū)內容的方法,都是公開(kāi)暴露的初始化方法。通過(guò) async 可以控制這三種方法的運行過(guò)程。取書(shū)目錄后,將數據存入數據庫,然后將執行結果返回給主程序。如果操作成功,主程序會(huì )根據書(shū)單執行章節列表的獲取。,以同樣的方式爬取書(shū)籍的內容。
項目主入口
/**??*?爬蟲(chóng)抓取主入口??*/?const?start?=?async()?=>?{?????let?booklistRes?=?await?bookListInit();?????if?(!booklistRes)?{?????????logger.warn('書(shū)籍列表抓取出錯,程序終止...');?????????return;?????}?????logger.info('書(shū)籍列表抓取成功,現在進(jìn)行書(shū)籍章節抓取...');??????let?chapterlistRes?=?await?chapterListInit();?????if?(!chapterlistRes)?{?????????logger.warn('書(shū)籍章節列表抓取出錯,程序終止...');?????????return;?????}?????logger.info('書(shū)籍章節列表抓取成功,現在進(jìn)行書(shū)籍內容抓取...');??????let?contentListRes?=?await?contentListInit();?????if?(!contentListRes)?{?????????logger.warn('書(shū)籍章節內容抓取出錯,程序終止...');?????????return;?????}?????logger.info('書(shū)籍內容抓取成功');?}?//?開(kāi)始入口?if?(typeof?bookListInit?===?'function'?&&?typeof?chapterListInit?===?'function')?{?????//?開(kāi)始抓取?????start();?}?
介紹了 bookListInit、chapterListInit、contentListInit 三個(gè)方法
書(shū)單.js
/**??*?初始化入口??*/?const?chapterListInit?=?async()?=>?{?????const?list?=?await?bookHelper.getBookList(bookListModel);?????if?(!list)?{?????????logger.error('初始化查詢(xún)書(shū)籍目錄失敗');?????}?????logger.info('開(kāi)始抓取書(shū)籍章節列表,書(shū)籍目錄共:'?+?list.length?+?'條');?????let?res?=?await?asyncGetChapter(list);?????return?res;?};?
章節列表.js
/**??*?初始化入口??*/?const?contentListInit?=?async()?=>?{?????//獲取書(shū)籍列表?????const?list?=?await?bookHelper.getBookLi(bookListModel);?????if?(!list)?{?????????logger.error('初始化查詢(xún)書(shū)籍目錄失敗');?????????return;?????}?????const?res?=?await?mapBookList(list);?????if?(!res)?{?????????logger.error('抓取章節信息,調用?getCurBookSectionList()?進(jìn)行串行遍歷操作,執行完成回調出錯,錯誤信息已打印,請查看日志!');?????????return;?????}?????return?res;?}?
關(guān)于內容抓取的思考
圖書(shū)目錄抓取的邏輯其實(shí)很簡(jiǎn)單。只需要使用 async.mapLimit 做一次遍歷就可以保存數據,但是我們保存內容的簡(jiǎn)化邏輯其實(shí)就是遍歷章節列表,抓取鏈接中的內容。但實(shí)際情況是,鏈接數多達數萬(wàn)。從內存使用的角度來(lái)看,我們不能將它們全部保存到一個(gè)數組中然后遍歷它,所以我們需要將內容捕獲統一起來(lái)。
常見(jiàn)的遍歷方式是每次查詢(xún)一定數量進(jìn)行爬取。缺點(diǎn)是分類(lèi)只用了一定的量,數據之間沒(méi)有關(guān)聯(lián),分批插入。如果有錯誤,在容錯方面會(huì )出現一些小問(wèn)題,我們認為單獨保存一本書(shū)作為集合會(huì )有問(wèn)題。因此,我們采用第二種方法來(lái)捕獲和保存圖書(shū)單元中的內容。
這里使用了方法async.mapLimit(list, 1, (series, callback) => {}) 進(jìn)行遍歷,不可避免地用到了回調,感覺(jué)很惡心。async.mapLimit() 的第二個(gè)參數可以設置同時(shí)請求的數量。
提取后如何保存數據是個(gè)問(wèn)題
這里我們通過(guò)key對數據進(jìn)行分類(lèi),每次根據key獲取鏈接,并進(jìn)行遍歷。這樣做的好處是保存的數據是一個(gè)整體?,F在我們考慮數據保存的問(wèn)題。
1、可以整體插入
優(yōu)點(diǎn):快速的數據庫操作不浪費時(shí)間。
缺點(diǎn):有的書(shū)可能有幾百章,也就是說(shuō)插入前必須保存幾百頁(yè)的內容,這樣也很消耗內存,可能會(huì )導致程序運行不穩定。
2、可以作為每篇文章插入數據庫文章。
優(yōu)點(diǎn):頁(yè)面爬取保存的方式,可以及時(shí)保存數據。即使出現后續錯誤,也無(wú)需重新保存之前的章節。
缺點(diǎn):也明顯慢。想爬幾萬(wàn)個(gè)頁(yè)面,做幾萬(wàn)個(gè)*N的數據庫操作,仔細想想。您還可以制作緩存以一次保存一定數量的記錄。不錯的選擇。
/**??*?遍歷單條書(shū)籍下所有章節?調用內容抓取方法??*?@param?{*}?list???*/?const?mapSectionList?=?(list)?=>?{?????return?new?Promise((resolve,?reject)?=>?{?????????async.mapLimit(list,?1,?(series,?callback)?=>?{?????????????let?doc?=?series._doc;?????????????getContent(doc,?callback)?????????},?(err,?result)?=>?{?????????????if?(err)?{?????????????????logger.error('書(shū)籍目錄抓取異步執行出錯!');?????????????????logger.error(err);?????????????????reject(false);?????????????????return;?????????????}?????????????const?bookName?=?list[0].bookName;?????????????const?key?=?list[0].key;??????????????//?以整體為單元進(jìn)行保存?????????????saveAllContentToDB(result,?bookName,?key,?resolve);??????????????//以每篇文章作為單元進(jìn)行保存?????????????//?logger.info(bookName?+?'數據抓取完成,進(jìn)入下一部書(shū)籍抓取函數...');?????????????//?resolve(true);??????????})?????})?}?
兩者各有利弊,這里我們都嘗試過(guò)。準備了兩個(gè)錯誤保存集合,errContentModel 和 error采集Model。插入錯誤時(shí),將信息分別保存到相應的集合中。您可以選擇兩者之一。之所以添加集合保存數據,是為了方便一次性查看和后續操作,無(wú)需查看日志。
?。≒S,其實(shí)error采集Model集合可以完全使用,errContentModel集合可以完整保存章節信息)
//保存出錯的數據名稱(chēng)?const?errorSpider?=?mongoose.Schema({?????chapter:?String,?????section:?String,?????url:?String,?????key:?String,?????bookName:?String,?????author:?String,?})?//?保存出錯的數據名稱(chēng)?只保留key?和?bookName信息?const?errorCollection?=?mongoose.Schema({?????key:?String,?????bookName:?String,?})?
我們將每本書(shū)信息的內容放入一個(gè)新的集合中,集合以key命名。
總結
其實(shí)這個(gè)項目寫(xiě)的主要難點(diǎn)在于程序穩定性的控制,容錯機制的設置,以及錯誤的記錄。目前這個(gè)項目基本上可以一次性直接運行整個(gè)流程。但是,程序設計上肯定還存在很多問(wèn)題。歡迎指正和交流。
復活節彩蛋
寫(xiě)完這個(gè)項目,我做了一個(gè)基于React網(wǎng)站的頁(yè)面瀏覽前端和一個(gè)基于koa2.x開(kāi)發(fā)的服務(wù)器。整體技術(shù)棧相當于 React + Redux + Koa2,前后端服務(wù)分別部署,各自能夠更好的去除前后端服務(wù)的耦合。例如,同一組服務(wù)器端代碼不僅可以為 Web 提供支持,還可以為移動(dòng)和應用程序提供支持。目前整套還是很簡(jiǎn)單的,但是可以滿(mǎn)足基本的查詢(xún)和瀏覽功能。希望以后有時(shí)間讓項目更加豐富。
該項目非常簡(jiǎn)單,但有一個(gè)額外的環(huán)境用于學(xué)習和研究從前端到服務(wù)器端的開(kāi)發(fā)。
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(無(wú)需你讓我學(xué)Gooseeker我就只學(xué)它吧?|?無(wú)需)
網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 354 次瀏覽 ? 2022-02-26 21:19
當您剛開(kāi)始使用數據可視化時(shí),主要關(guān)注點(diǎn)之一通常是學(xué)習制作各種圖表類(lèi)型。
但是用那些原創(chuàng )數據練習了半天,心里會(huì )有些不安和松懈。畢竟沒(méi)有真正投入實(shí)戰的練習都是假的,各種基礎數據都是我用來(lái)數據可視化的。菜,不不不!
通常,我也會(huì )去互聯(lián)網(wǎng)查找一些現有的數據,但它并不總是適合我的胃口。我無(wú)法完全自由地找到我想要的數據,并做我感興趣的可視化分析。所以,這是理所當然的,我迫不及待地想了解爬行動(dòng)物。
我不知道如何編程。如果想在短時(shí)間內快速掌握爬蟲(chóng)技巧,只能使用網(wǎng)頁(yè)信息抓取軟件,所以@squirrel給我推薦了他的課程《無(wú)需編程即可輕松獲取網(wǎng)絡(luò )數據》,學(xué)習Jisouke Gooseeker Web Crawler。
因為他的課程非常簡(jiǎn)潔易懂,而且Gooseeker的操作真的很簡(jiǎn)單,所以可以很快上手,一個(gè)晚上就爬一個(gè)簡(jiǎn)單的網(wǎng)站。
以前覺(jué)得爬網(wǎng)數據很難,現在可以這么輕松地爬取信息,真的很興奮!
所以,如果你和我一樣,沒(méi)有編程基礎,又想根據自己的意愿獲取更多的數據信息,可以嘗試學(xué)習 Gooseeker 網(wǎng)絡(luò )爬蟲(chóng)。
Gooseeker的好處主要有:
Gooseeker擁有獨立的網(wǎng)絡(luò )爬蟲(chóng)瀏覽器,也可以依賴(lài)火狐瀏覽器一起打包下載。
我選擇的軟件版本是火狐版本。安裝完成后會(huì )在火狐瀏覽器的工具欄上生成一個(gè)插件。單擊“工具”以查看“MS 計算機”和“DS 計算機”。提取工作將在兩個(gè)平臺上執行。
當然,我們還需要注冊一個(gè)賬號,方便使用它來(lái)管理爬蟲(chóng)規則,在社區互動(dòng),下載資源等。
在我學(xué)習期間,有一位老司機(@squirrel)帶我去飛行。確實(shí)讓我少走了很多彎路,大大提高了我的學(xué)習效率,但是作為一個(gè)好學(xué)的學(xué)生……學(xué)姐,你不能讓我學(xué)Gooseeeker,我就只學(xué)吧?肯定還有很多其他類(lèi)似的工具,我需要更多地了解它們!
于是偷偷了解了其他網(wǎng)絡(luò )數據采集器的優(yōu)劣,對比對比,發(fā)現差距確實(shí)不大。黑貓和白貓,能抓到老鼠的貓就是好貓。對于學(xué)習來(lái)說(shuō),真的沒(méi)必要執著(zhù)于工具。
我用Gooseeker前后免費爬取了幾十條網(wǎng)站數據,基本上所有網(wǎng)站信息都可以通過(guò)它輕松獲取,還有一小部分網(wǎng)站需要走彎路。
它可以實(shí)現的爬蟲(chóng)任務(wù)包括:分層爬取、翻頁(yè)、動(dòng)態(tài)網(wǎng)頁(yè)爬取等基本爬取方式,還支持爬蟲(chóng)組(不是很好用)等等。
我先學(xué)了Squirrel的課程,學(xué)會(huì )了用它爬取數據后,就去官網(wǎng)了解了更多細節。Gooseeker的官網(wǎng)社區比較齊全。上面有很多文檔/視頻教程,還有別人制定的免費/付費規則。您也可以在線(xiàn)進(jìn)行數據DIY。
其產(chǎn)品天數軟件中的APP資源也非常豐富,可以高效獲取電商、微博數據和做數據挖掘、SaaS模型軟件。
其中,文本分割和標注工具——天語(yǔ)影音對我特別有吸引力。它可以輕松完成文本的分詞和可視化分析。有機會(huì )一定要試試(寫(xiě)論文)。
但是我個(gè)人覺(jué)得上面的視頻教程都不好。很多人都說(shuō)Gooseeeker前期很難上手。我認為這與他們在上面獲得的教程資源的質(zhì)量有限無(wú)關(guān)。
總的來(lái)說(shuō),這是一款免費好用的爬蟲(chóng)神器!Wall Crack推薦小伙伴們去其官網(wǎng)下載軟件學(xué)習,可以輕松搞定一個(gè)看似遙不可及,實(shí)則又傻又甜的技能。
在接下來(lái)的幾篇文章中,我會(huì )為大家介紹幾個(gè)實(shí)際案例。如有任何問(wèn)題,歡迎交流討論。
資源: 查看全部
c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(無(wú)需你讓我學(xué)Gooseeker我就只學(xué)它吧?|?無(wú)需)
當您剛開(kāi)始使用數據可視化時(shí),主要關(guān)注點(diǎn)之一通常是學(xué)習制作各種圖表類(lèi)型。
但是用那些原創(chuàng )數據練習了半天,心里會(huì )有些不安和松懈。畢竟沒(méi)有真正投入實(shí)戰的練習都是假的,各種基礎數據都是我用來(lái)數據可視化的。菜,不不不!
通常,我也會(huì )去互聯(lián)網(wǎng)查找一些現有的數據,但它并不總是適合我的胃口。我無(wú)法完全自由地找到我想要的數據,并做我感興趣的可視化分析。所以,這是理所當然的,我迫不及待地想了解爬行動(dòng)物。
我不知道如何編程。如果想在短時(shí)間內快速掌握爬蟲(chóng)技巧,只能使用網(wǎng)頁(yè)信息抓取軟件,所以@squirrel給我推薦了他的課程《無(wú)需編程即可輕松獲取網(wǎng)絡(luò )數據》,學(xué)習Jisouke Gooseeker Web Crawler。
因為他的課程非常簡(jiǎn)潔易懂,而且Gooseeker的操作真的很簡(jiǎn)單,所以可以很快上手,一個(gè)晚上就爬一個(gè)簡(jiǎn)單的網(wǎng)站。
以前覺(jué)得爬網(wǎng)數據很難,現在可以這么輕松地爬取信息,真的很興奮!
所以,如果你和我一樣,沒(méi)有編程基礎,又想根據自己的意愿獲取更多的數據信息,可以嘗試學(xué)習 Gooseeker 網(wǎng)絡(luò )爬蟲(chóng)。

Gooseeker的好處主要有:

Gooseeker擁有獨立的網(wǎng)絡(luò )爬蟲(chóng)瀏覽器,也可以依賴(lài)火狐瀏覽器一起打包下載。
我選擇的軟件版本是火狐版本。安裝完成后會(huì )在火狐瀏覽器的工具欄上生成一個(gè)插件。單擊“工具”以查看“MS 計算機”和“DS 計算機”。提取工作將在兩個(gè)平臺上執行。
當然,我們還需要注冊一個(gè)賬號,方便使用它來(lái)管理爬蟲(chóng)規則,在社區互動(dòng),下載資源等。

在我學(xué)習期間,有一位老司機(@squirrel)帶我去飛行。確實(shí)讓我少走了很多彎路,大大提高了我的學(xué)習效率,但是作為一個(gè)好學(xué)的學(xué)生……學(xué)姐,你不能讓我學(xué)Gooseeeker,我就只學(xué)吧?肯定還有很多其他類(lèi)似的工具,我需要更多地了解它們!
于是偷偷了解了其他網(wǎng)絡(luò )數據采集器的優(yōu)劣,對比對比,發(fā)現差距確實(shí)不大。黑貓和白貓,能抓到老鼠的貓就是好貓。對于學(xué)習來(lái)說(shuō),真的沒(méi)必要執著(zhù)于工具。
我用Gooseeker前后免費爬取了幾十條網(wǎng)站數據,基本上所有網(wǎng)站信息都可以通過(guò)它輕松獲取,還有一小部分網(wǎng)站需要走彎路。
它可以實(shí)現的爬蟲(chóng)任務(wù)包括:分層爬取、翻頁(yè)、動(dòng)態(tài)網(wǎng)頁(yè)爬取等基本爬取方式,還支持爬蟲(chóng)組(不是很好用)等等。
我先學(xué)了Squirrel的課程,學(xué)會(huì )了用它爬取數據后,就去官網(wǎng)了解了更多細節。Gooseeker的官網(wǎng)社區比較齊全。上面有很多文檔/視頻教程,還有別人制定的免費/付費規則。您也可以在線(xiàn)進(jìn)行數據DIY。
其產(chǎn)品天數軟件中的APP資源也非常豐富,可以高效獲取電商、微博數據和做數據挖掘、SaaS模型軟件。

其中,文本分割和標注工具——天語(yǔ)影音對我特別有吸引力。它可以輕松完成文本的分詞和可視化分析。有機會(huì )一定要試試(寫(xiě)論文)。
但是我個(gè)人覺(jué)得上面的視頻教程都不好。很多人都說(shuō)Gooseeeker前期很難上手。我認為這與他們在上面獲得的教程資源的質(zhì)量有限無(wú)關(guān)。
總的來(lái)說(shuō),這是一款免費好用的爬蟲(chóng)神器!Wall Crack推薦小伙伴們去其官網(wǎng)下載軟件學(xué)習,可以輕松搞定一個(gè)看似遙不可及,實(shí)則又傻又甜的技能。
在接下來(lái)的幾篇文章中,我會(huì )為大家介紹幾個(gè)實(shí)際案例。如有任何問(wèn)題,歡迎交流討論。
資源:


