摘要:通用網(wǎng)絡(luò)爬蟲通用網(wǎng)絡(luò)爬蟲又稱全網(wǎng)爬蟲,爬取對(duì)象從一些種子擴(kuò)充到整個(gè)。為提高工作效率,通用網(wǎng)絡(luò)爬蟲會(huì)采取一定的爬取策略。介紹是一個(gè)國(guó)人編寫的強(qiáng)大的網(wǎng)絡(luò)爬蟲系統(tǒng)并帶有強(qiáng)大的。
爬蟲
簡(jiǎn)單的說(shuō)網(wǎng)絡(luò)爬蟲(Web crawler)也叫做網(wǎng)絡(luò)鏟(Web scraper)、網(wǎng)絡(luò)蜘蛛(Web spider),其行為一般是先“爬”到對(duì)應(yīng)的網(wǎng)頁(yè)上,再把需要的信息“鏟”下來(lái)。分類
網(wǎng)絡(luò)爬蟲按照系統(tǒng)結(jié)構(gòu)和實(shí)現(xiàn)技術(shù),大致可以分為以下幾種類型:通用網(wǎng)絡(luò)爬蟲(General Purpose Web Crawler)、聚焦網(wǎng)絡(luò)爬蟲(Focused Web Crawler)、增量式網(wǎng)絡(luò)爬蟲(Incremental Web Crawler)、深層網(wǎng)絡(luò)爬蟲(Deep Web Crawler)。實(shí)際的網(wǎng)絡(luò)爬蟲系統(tǒng)通常是幾種爬蟲技術(shù)相結(jié)合實(shí)現(xiàn)的。
通用網(wǎng)絡(luò)爬蟲通用網(wǎng)絡(luò)爬蟲又稱全網(wǎng)爬蟲(Scalable Web Crawler),爬取對(duì)象從一些種子 URL 擴(kuò)充到整個(gè) Web。主要為門戶站點(diǎn)搜索引擎和大型 Web 服務(wù)提供商采集數(shù)據(jù)。
通用網(wǎng)絡(luò)爬蟲的結(jié)構(gòu)大致可以分為頁(yè)面爬取模塊 、頁(yè)面分析模塊、鏈接過(guò)濾模塊、頁(yè)面存儲(chǔ)模塊、URL 隊(duì)列、初始 URL 集合幾個(gè)部分。為提高工作效率,通用網(wǎng)絡(luò)爬蟲會(huì)采取一定的爬取策略。 常用的爬取策略有:深度優(yōu)先策略、廣度優(yōu)先策略。
1) 深度優(yōu)先策略(DFS):其基本方法是按照深度由低到高的順序,依次訪問(wèn)下一級(jí)網(wǎng)頁(yè)鏈接,直到不能再深入為止。
2) 廣度優(yōu)先策略(BFS):此策略按照網(wǎng)頁(yè)內(nèi)容目錄層次深淺來(lái)爬取頁(yè)面,處于較淺目錄層次的頁(yè)面首先被爬取。 當(dāng)同一層次中的頁(yè)面爬取完畢后,爬蟲再深入下一層繼續(xù)爬取。
聚焦網(wǎng)絡(luò)爬蟲聚焦網(wǎng)絡(luò)爬蟲(Focused Crawler),又稱主題網(wǎng)絡(luò)爬蟲(Topical Crawler),是指選擇性地爬取那些與預(yù)先定義好的主題相關(guān)頁(yè)面的網(wǎng)絡(luò)爬蟲。 和通用網(wǎng)絡(luò)爬蟲相比,聚焦爬蟲只需要爬取與主題相關(guān)的頁(yè)面,極大地節(jié)省了硬件和網(wǎng)絡(luò)資源,保存的頁(yè)面也由于數(shù)量少而更新快,還可以很好地滿足一些特定人群對(duì)特定領(lǐng)域信息的需求。我們之前爬的歌單就屬于這一種。
增量式網(wǎng)絡(luò)爬蟲增量式網(wǎng)絡(luò)爬蟲(Incremental Web Crawler)是指對(duì)已下載網(wǎng)頁(yè)采取增 量式更新和只爬取新產(chǎn)生的或者已經(jīng)發(fā)生變化網(wǎng)頁(yè)的爬蟲,它能夠在一定程度上保證所爬取的頁(yè)面是盡可能新的頁(yè)面。 和周期性爬取和刷新頁(yè)面的網(wǎng)絡(luò)爬蟲相比,增量式爬蟲只會(huì)在需要的時(shí)候爬取新產(chǎn)生或發(fā)生更新的頁(yè)面 ,并不重新下載沒有發(fā)生變化的頁(yè)面,可有效減少數(shù)據(jù)下載量,及時(shí)更新已爬取的網(wǎng)頁(yè),減小時(shí)間和空間上的耗費(fèi),但是增加了爬取算法的復(fù)雜度和實(shí)現(xiàn)難度?,F(xiàn)在比較火的輿情爬蟲一般都是增量式網(wǎng)絡(luò)爬蟲。
深網(wǎng)爬蟲Web 頁(yè)面按存在方式可以分為表層網(wǎng)頁(yè)(Surface Web)和深層網(wǎng)頁(yè)(Deep Web,也稱 Invisible Web Pages 或 Hidden Web)。 表層網(wǎng)頁(yè)是指?jìng)鹘y(tǒng)搜索引擎可以索引的頁(yè)面,以超鏈接可以到達(dá)的靜態(tài)網(wǎng)頁(yè)為主構(gòu)成的 Web 頁(yè)面。Deep Web 是那些大部分內(nèi)容不能通過(guò)靜態(tài)鏈接獲取的、隱藏在搜索表單后的,只有用戶提交一些關(guān)鍵詞才能獲得的 Web 頁(yè)面。例如那些用戶注冊(cè)后內(nèi)容才可見的網(wǎng)頁(yè)就屬于 Deep Web。
開源框架Project | Language | Star | Watch | Fork |
---|---|---|---|---|
Nutch | Java | 1111 | 195 | 808 |
webmagic | Java | 4216 | 618 | 2306 |
WebCollector | Java | 1222 | 255 | 958 |
heritrix3 | Java | 773 | 141 | 428 |
crawler4j | Java | 1831 | 242 | 1136 |
Pyspider | Python | 8581 | 687 | 2273 |
Scrapy | Python | 19642 | 1405 | 5261 |
介紹:
Nutch是一個(gè)開源的Java實(shí)現(xiàn)的搜索引擎。它提供了我們運(yùn)行自己的搜索引擎所需的全部工具,包括全文搜索和網(wǎng)絡(luò)爬蟲。
盡管搜索是上網(wǎng)的基本要求,但是現(xiàn)有的搜索引擎的數(shù)目卻在下降。并且這很有可能進(jìn)一步演變成為一個(gè)公司壟斷了幾乎所有的網(wǎng)頁(yè)搜索為其謀取商業(yè)利益。這顯然不利于廣大Internet用戶。
Nutch為我們提供了這樣一個(gè)不同的選擇。相對(duì)于那些商用的搜索引擎,Nutch作為開放源代碼的搜索引擎將會(huì)更加透明,從而更值得大家信賴。現(xiàn)在所有主要的搜索引擎都采用私有的排序算法, 而不會(huì)解釋為什么一個(gè)網(wǎng)頁(yè)會(huì)排在一個(gè)特定的位置。除此之外, 有的搜索引擎依照網(wǎng)站所付的費(fèi)用, 而不是根據(jù)它們本身的價(jià)值進(jìn)行排序。與它們不同,Nutch沒有什么需要隱瞞,也沒有動(dòng)機(jī)去扭曲搜索的結(jié)果。Nutch將盡自己最大的努力為用戶提供最好的搜索結(jié)果。
優(yōu)點(diǎn):
Nutch支持分布式抓取,并有Hadoop支持,可以進(jìn)行多機(jī)分布抓取,存儲(chǔ)和索引。另外很吸引人的一點(diǎn)在于,它提供了一種插件框架,使得其對(duì)各種網(wǎng)頁(yè)內(nèi)容的解析、各種數(shù)據(jù)的采集、查詢、集群、過(guò)濾等功能能夠方便的進(jìn)行擴(kuò)展。正是由于有此框架,使得 Nutch 的插件開發(fā)非常容易,第三方的插件也層出不窮,極大的增強(qiáng)了 Nutch 的功能和聲譽(yù)。
缺點(diǎn):
對(duì)于大多數(shù)用戶來(lái)說(shuō),一般是想做一個(gè)精確數(shù)據(jù)爬取的爬蟲,就像第一篇里爬歌單那個(gè)“主題爬蟲”。而第二篇介紹的“通用爬蟲”適合做搜索引擎,這種需求就比較少。如果以此為標(biāo)準(zhǔn),那么為搜索引擎而生的Nutch就有著天生缺點(diǎn)。Nutch的架構(gòu)里大部分為搜索引擎而設(shè)計(jì)的,對(duì)精確爬取沒有特別的考慮。也就是說(shuō),用Nutch做主題爬蟲,會(huì)浪費(fèi)很多的時(shí)間在不必要的計(jì)算上。而且如果你試圖通過(guò)對(duì)Nutch進(jìn)行二次開發(fā)來(lái)擴(kuò)展其定制能力,基本上就要破壞Nutch的框架,反而不如自己寫了。
Pyspider介紹:
Pyspider是一個(gè)國(guó)人編寫的強(qiáng)大的網(wǎng)絡(luò)爬蟲系統(tǒng)并帶有強(qiáng)大的WebUI。采用Python語(yǔ)言編寫,分布式架構(gòu),支持多種數(shù)據(jù)庫(kù)后端,強(qiáng)大的WebUI支持腳本編輯器,任務(wù)監(jiān)視器,項(xiàng)目管理器以及結(jié)果查看器。
Pyspider的主要功能包括,抓取、更新調(diào)度多站點(diǎn)的特定的頁(yè)面;需要對(duì)頁(yè)面進(jìn)行結(jié)構(gòu)化信息提取;靈活可擴(kuò)展,穩(wěn)定可監(jiān)控。滿足了絕大多數(shù)Python爬蟲的需求 —— 定向抓取,結(jié)構(gòu)化化解析。但是面對(duì)結(jié)構(gòu)迥異的各種網(wǎng)站,單一的抓取模式并不一定能滿足,靈活的抓取控制是必須的。為了達(dá)到這個(gè)目的,單純的配置文件往往不夠靈活,于是,通過(guò)腳本去控制抓取成為了最后的選擇。而去重調(diào)度,隊(duì)列,抓取,異常處理,監(jiān)控等功能作為框架,提供給抓取腳本,并保證靈活性。最后加上web的編輯調(diào)試環(huán)境,以及web任務(wù)監(jiān)控,即成為了最終的框架。
優(yōu)點(diǎn):
支持分布式部署。
完全可視化,對(duì)用戶非常友好:WEB 界面編寫調(diào)試腳本,起停腳本,監(jiān)控執(zhí)行狀態(tài),查看活動(dòng)歷史,獲取結(jié)果產(chǎn)出。
簡(jiǎn)單,五分鐘就能上手。腳本規(guī)則簡(jiǎn)單,開發(fā)效率高。
支持抓取JavaScript的頁(yè)面。
總之,Pyspider非常強(qiáng)大,強(qiáng)大到更像一個(gè)產(chǎn)品而不是一個(gè)框架。
缺點(diǎn):
URL去重使用數(shù)據(jù)庫(kù)而不是布隆過(guò)濾器,億級(jí)存儲(chǔ)的db io將導(dǎo)致效率急劇降低。
使用上的人性化犧牲了靈活度,定制化能力降低。
Scrapy介紹:
Scrapy是一個(gè)為了爬取網(wǎng)站數(shù)據(jù),提取結(jié)構(gòu)性數(shù)據(jù)而編寫的應(yīng)用框架。 可以應(yīng)用在包括數(shù)據(jù)挖掘,信息處理或存儲(chǔ)歷史數(shù)據(jù)等一系列的程序中。Scrapy 使用 Twisted這個(gè)異步網(wǎng)絡(luò)庫(kù)來(lái)處理網(wǎng)絡(luò)通訊,架構(gòu)清晰,并且包含了各種中間件接口,可以靈活的完成各種需求。Scratch,是抓取的意思,這個(gè)Python的爬蟲框架叫Scrapy,大概也是這個(gè)意思吧。
優(yōu)點(diǎn):
極其靈活的定制化爬取。
社區(qū)人數(shù)多、文檔完善。
URL去重采用布隆過(guò)濾器方案。
可以處理不完整的HTML,Scrapy已經(jīng)提供了selectors(一個(gè)在lxml的基礎(chǔ)上提供了更高級(jí)的接口),可以高效地處理不完整的HTML代碼。
缺點(diǎn):
不支持分布式部署。
原生不支持抓取JavaScript的頁(yè)面。
全命令行操作,對(duì)用戶不友好,需要一定學(xué)習(xí)周期。
Scrapy入門 架構(gòu)簡(jiǎn)介組件
Engine: 引擎負(fù)責(zé)控制數(shù)據(jù)流在系統(tǒng)中所有組件中流動(dòng),并在相應(yīng)動(dòng)作發(fā)生時(shí)觸發(fā)事件。
Scheduler: 調(diào)度器從引擎接受Request并將他們?nèi)腙?duì),以便之后引擎請(qǐng)求他們時(shí)提供給引擎。
Downloader: 下載器負(fù)責(zé)獲取頁(yè)面數(shù)據(jù)并提供給引擎,而后提供給Spider。
Spiders: Spider是Scrapy用戶編寫的用于分析Response并提取Item或提取更多需要下載的URL的類。 每個(gè)Spider負(fù)責(zé)處理特定網(wǎng)站。
Item Pipeline: 負(fù)責(zé)處理被Spider提取出來(lái)的Item。典型的功能有清洗、 驗(yàn)證及持久化操作。
Downloader middlewares: 下載器中間件是在Engine及Downloader之間的特定鉤子(specific hooks),處理Downloader傳遞給Engine的Response。 其提供了一個(gè)簡(jiǎn)便的機(jī)制,通過(guò)插入自定義代碼來(lái)擴(kuò)展Scrapy功能。
Spider middlewares: 是在Engine及Spider之間的特定鉤子(specific hook),處理Spider的輸入(Response)和輸出(Items及Requests)。 其提供了一個(gè)簡(jiǎn)便的機(jī)制,通過(guò)插入自定義代碼來(lái)擴(kuò)展Scrapy功能。
數(shù)據(jù)流
Scrapy中的數(shù)據(jù)流由執(zhí)行引擎控制,其過(guò)程如下:
Engine從Spider獲取第一個(gè)需要爬取URL(s)。
Engine用Scheduler調(diào)度Requests,并向Scheduler請(qǐng)求下一個(gè)要爬取的URL。
Scheduler返回下一個(gè)要爬取的URL給Engine。
Engine將URL通過(guò)Downloader middlewares轉(zhuǎn)發(fā)給Downloader。
一旦頁(yè)面下載完畢,下載器生成一個(gè)該頁(yè)面的Response,并將其通過(guò)Downloader middlewares發(fā)送給Engine。
引擎從Downloader中接收到Response并通過(guò)Spider middlewares發(fā)送給Spider處理。
Spider處理Response并返回爬取到的Item及新的Request給Engine。
Engine將爬取到的Item給Item Pipeline,然后將Request給Scheduler。
從第一步開始重復(fù)這個(gè)流程,直到Scheduler中沒有更多的URLs。
架構(gòu)就是這樣,流程和我第二篇里介紹的迷你架構(gòu)差不多,但擴(kuò)展性非常強(qiáng)大。
入門 安裝scrapypip install scrapy創(chuàng)建項(xiàng)目
在開始爬取之前,您必須創(chuàng)建一個(gè)新的Scrapy項(xiàng)目。 進(jìn)入您打算存儲(chǔ)代碼的目錄中,運(yùn)行下列命令:
scrapy startproject tutorial
該命令將會(huì)創(chuàng)建包含下列內(nèi)容的 tutorial 目錄:
tutorial/ scrapy.cfg # 項(xiàng)目的配置文件 tutorial/ # 該項(xiàng)目的python模塊。之后您將在此加入代碼 __init__.py items.py # 項(xiàng)目中的item文件 pipelines.py # 項(xiàng)目中的pipelines文件 settings.py # 項(xiàng)目的設(shè)置文件 spiders/ # 放置spider代碼的目錄 __init__.py編寫第一個(gè)爬蟲
Spider是用戶編寫用于從單個(gè)網(wǎng)站(或者一些網(wǎng)站)爬取數(shù)據(jù)的類。其包含了一個(gè)用于下載的初始URL,以及如何跟進(jìn)網(wǎng)頁(yè)中的鏈接以及如何分析頁(yè)面中的內(nèi)容的方法。
以下為我們的第一個(gè)Spider代碼,保存在 tutorial/spiders 目錄下的 quotes_spider.py文件中:
import scrapy class QuotesSpider(scrapy.Spider): name = "quotes" def start_requests(self): urls = [ "http://quotes.toscrape.com/page/1/", "http://quotes.toscrape.com/page/2/", ] for url in urls: yield scrapy.Request(url=url, callback=self.parse) def parse(self, response): page = response.url.split("/")[-2] filename = "quotes-%s.html" % page with open(filename, "wb") as f: f.write(response.body) self.log("Saved file %s" % filename)
為了創(chuàng)建一個(gè)Spider,你必須繼承 scrapy.Spider 類, 且定義以下三個(gè)屬性:
name: 用于區(qū)別Spider。 該名字必須是唯一的,您不可以為不同的Spider設(shè)定相同的名字。
start_urls: 包含了Spider在啟動(dòng)時(shí)進(jìn)行爬取的url列表。 因此,第一個(gè)被獲取到的頁(yè)面將是其中之一。 后續(xù)的URL則從初始的URL獲取到的數(shù)據(jù)中提取。
parse() 是spider的一個(gè)方法。 被調(diào)用時(shí),每個(gè)初始URL完成下載后生成的Response 對(duì)象將會(huì)作為唯一的參數(shù)傳遞給該函數(shù)。 該方法負(fù)責(zé)解析返回的數(shù)據(jù)(response data),提取數(shù)據(jù)以及生成需要進(jìn)一步處理的URL的 Request 對(duì)象。
進(jìn)入項(xiàng)目的根目錄,執(zhí)行下列命令啟動(dòng)spider:
scrapy s crawl quotes
這個(gè)命令啟動(dòng)用于爬取 quotes.toscrape.com 的spider,你將得到類似的輸出:
2017-05-10 20:36:17 [scrapy.core.engine] INFO: Spider opened 2017-05-10 20:36:17 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 2017-05-10 20:36:17 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023 2017-05-10 20:36:17 [scrapy.core.engine] DEBUG: Crawled (404)提取數(shù)據(jù)(referer: None) 2017-05-10 20:36:17 [scrapy.core.engine] DEBUG: Crawled (200) (referer: None) 2017-05-10 20:36:17 [scrapy.core.engine] DEBUG: Crawled (200) (referer: None) 2017-05-10 20:36:17 [quotes] DEBUG: Saved file quotes-1.html 2017-05-10 20:36:17 [quotes] DEBUG: Saved file quotes-2.html 2017-05-10 20:36:17 [scrapy.core.engine] INFO: Closing spider (finished)
我們之前只是保存了HTML頁(yè)面,并沒有提取數(shù)據(jù)?,F(xiàn)在升級(jí)一下代碼,把提取功能加進(jìn)去。至于如何使用瀏覽器的開發(fā)者模式分析網(wǎng)頁(yè),之前已經(jīng)介紹過(guò)了。
import scrapy class QuotesSpider(scrapy.Spider): name = "quotes" start_urls = [ "http://quotes.toscrape.com/page/1/", "http://quotes.toscrape.com/page/2/", ] def parse(self, response): for quote in response.css("div.quote"): yield { "text": quote.css("span.text::text").extract_first(), "author": quote.css("small.author::text").extract_first(), "tags": quote.css("div.tags a.tag::text").extract(), }
再次運(yùn)行這個(gè)爬蟲,你將在日志里看到被提取出的數(shù)據(jù):
2017-05-10 20:38:33 [scrapy.core.scraper] DEBUG: Scraped from <200 http://quotes.toscrape.com/page/1/> {"tags": ["life", "love"], "author": "André Gide", "text": "“It is better to be hated for what you are than to be loved for what you are not.”"} 2017-05-10 20:38:33 [scrapy.core.scraper] DEBUG: Scraped from <200 http://quotes.toscrape.com/page/1/> {"tags": ["edison", "failure", "inspirational", "paraphrased"], "author": "Thomas A. Edison", "text": "“I have not failed. I"ve just found 10,000 ways that won"t work.”"}保存爬取的數(shù)據(jù)
最簡(jiǎn)單存儲(chǔ)爬取的數(shù)據(jù)的方式是使用 Feed exports:
scrapy crawl quotes -o quotes.json
該命令將采用 JSON 格式對(duì)爬取的數(shù)據(jù)進(jìn)行序列化,生成quotes.json文件。
Pyspider 架構(gòu)簡(jiǎn)介pyspider的架構(gòu)主要分為 scheduler(調(diào)度器), fetcher(抓取器), processor(腳本執(zhí)行):
各個(gè)組件間使用消息隊(duì)列連接,除了scheduler是單點(diǎn)的,fetcher 和 processor 都是可以多實(shí)例分布式部署的。 scheduler 負(fù)責(zé)整體的調(diào)度控制
任務(wù)由 scheduler 發(fā)起調(diào)度,fetcher 抓取網(wǎng)頁(yè)內(nèi)容, processor 執(zhí)行預(yù)先編寫的python腳本,輸出結(jié)果或產(chǎn)生新的提鏈任務(wù)(發(fā)往 scheduler),形成閉環(huán)。
每個(gè)腳本可以靈活使用各種python庫(kù)對(duì)頁(yè)面進(jìn)行解析,使用框架API控制下一步抓取動(dòng)作,通過(guò)設(shè)置回調(diào)控制解析動(dòng)作。
入門抓取電影的相關(guān)信息
安裝pip install pyspider啟動(dòng)
pyspider
運(yùn)行成功后用瀏覽器打開http://localhost:5000/訪問(wèn)控制臺(tái)
選取url既然我們要爬所有的電影,首先我們需要抓一個(gè)電影列表,一個(gè)好的列表應(yīng)該:
包含足夠多的電影的 URL
通過(guò)翻頁(yè),可以遍歷到所有的電影
一個(gè)按照更新時(shí)間排序的列表,可以更快抓到最新更新的電影
我們?cè)?http://movie.douban.com/ 掃了一遍,發(fā)現(xiàn)并沒有一個(gè)列表能包含所有電影,只能退而求其次,通過(guò)抓取分類下的所有的標(biāo)簽列表頁(yè),來(lái)遍歷所有的電影: http://movie.douban.com/tag/
創(chuàng)建項(xiàng)目在 pyspider 的 dashboard 的右下角,點(diǎn)擊 “Create” 按鈕
替換 on_start 函數(shù)的 self.crawl 的 URL:
@every(minutes=24 * 60) def on_start(self): self.crawl("http://movie.douban.com/tag/", callback=self.index_page)
self.crawl 告訴 pyspider 抓取指定頁(yè)面,然后使用 callback 函數(shù)對(duì)結(jié)果進(jìn)行解析。
@every 修飾器,表示 on_start 每天會(huì)執(zhí)行一次,這樣就能抓到最新的電影了。
點(diǎn)擊綠色的 run 執(zhí)行,你會(huì)看到 follows 上面有一個(gè)紅色的 1,切換到 follows 面板,點(diǎn)擊綠色的播放按鈕:
Tag 列表頁(yè)在 tag 列表頁(yè) 中,我們需要提取出所有的 電影列表頁(yè) 的 URL。你可能已經(jīng)發(fā)現(xiàn)了,sample handler 已經(jīng)提取了非常多大的 URL,所有,一種可行的提取列表頁(yè) URL 的方法就是用正則從中過(guò)濾出來(lái):
import re ... @config(age=10 * 24 * 60 * 60) def index_page(self, response): for each in response.doc("a[href^="http"]").items(): if re.match("http://movie.douban.com/tag/w+", each.attr.href, re.U): self.crawl(each.attr.href, callback=self.list_page)
由于 電影列表頁(yè)和 tag列表頁(yè)長(zhǎng)的并不一樣,在這里新建了一個(gè) callback 為 self.list_page
@config(age=10 24 60 * 60) 在這表示我們認(rèn)為 10 天內(nèi)頁(yè)面有效,不會(huì)再次進(jìn)行更新抓取
由于 pyspider 是純 Python 環(huán)境,你可以使用 Python 強(qiáng)大的內(nèi)置庫(kù),或者你熟悉的第三方庫(kù)對(duì)頁(yè)面進(jìn)行解析。不過(guò)更推薦使用 CSS選擇器
電影列表頁(yè)再次點(diǎn)擊 run 讓我們進(jìn)入一個(gè)電影列表頁(yè)(list_page)。在這個(gè)頁(yè)面中我們需要提?。?/p>
電影的鏈接,例如,http://movie.douban.com/subje...
下一頁(yè)的鏈接,用來(lái)翻頁(yè)
CSS Selector Helper在 pyspider 中,還內(nèi)置了一個(gè) CSS Selector Helper,當(dāng)你點(diǎn)擊頁(yè)面上的元素的時(shí)候,可以幫你生成它的 CSS選擇器 表達(dá)式。你可以點(diǎn)擊 Enable CSS selector helper 按鈕,然后切換到 web 頁(yè)面:
開啟后,鼠標(biāo)放在元素上,會(huì)被黃色高亮,點(diǎn)擊后,所有擁有相同 CSS選擇器 表達(dá)式的元素會(huì)被高亮。表達(dá)式會(huì)被插入到 python 代碼當(dāng)前光標(biāo)位置。創(chuàng)建下面的代碼,將光標(biāo)停留在單引號(hào)中間:
def list_page(self, response): for each in response.doc("").items():
點(diǎn)擊一個(gè)電影的鏈接,CSS選擇器 表達(dá)式將會(huì)插入到你的代碼中,如此重復(fù),插入翻頁(yè)的鏈接:
def list_page(self, response): for each in response.doc("HTML>BODY>DIV#wrapper>DIV#content>DIV.grid-16-8.clearfix>DIV.article>DIV>TABLE TR.item>TD>DIV.pl2>A").items(): self.crawl(each.attr.href, callback=self.detail_page) # 翻頁(yè) for each in response.doc("HTML>BODY>DIV#wrapper>DIV#content>DIV.grid-16-8.clearfix>DIV.article>DIV.paginator>A").items(): self.crawl(each.attr.href, callback=self.list_page)
翻頁(yè)是一個(gè)到自己的 callback 回調(diào)電影詳情頁(yè)
再次點(diǎn)擊 run,follow 到詳情頁(yè)。使用 css selector helper 分別添加電影標(biāo)題,打分和導(dǎo)演:
def detail_page(self, response): return { "url": response.url, "title": response.doc("HTML>BODY>DIV#wrapper>DIV#content>H1>SPAN").text(), "rating": response.doc("HTML>BODY>DIV#wrapper>DIV#content>DIV.grid-16-8.clearfix>DIV.article>DIV.indent.clearfix>DIV.subjectwrap.clearfix>DIV#interest_sectl>DIV.rating_wrap.clearbox>P.rating_self.clearfix>STRONG.ll.rating_num").text(), "導(dǎo)演": [x.text() for x in response.doc("a[rel="v:directedBy"]").items()], }開始抓取
使用 run 單步調(diào)試你的代碼,對(duì)于用一個(gè) callback 最好使用多個(gè)頁(yè)面類型進(jìn)行測(cè)試。然后保存。
回到 Dashboard,找到你的項(xiàng)目
將 status 修改為 DEBUG 或 RUNNING
按 run 按鈕
反反爬蟲技術(shù)越來(lái)越多的網(wǎng)站具有反爬蟲特性,有的用圖片隱藏關(guān)鍵數(shù)據(jù),有的使用反人類的驗(yàn)證碼等
爬蟲:
爬蟲的根本就是得到一個(gè)網(wǎng)頁(yè)的源代碼數(shù)據(jù)。更深入一些,就會(huì)出現(xiàn)和網(wǎng)頁(yè)進(jìn)行POST交互從而獲取服務(wù)器接收POST請(qǐng)求后返回的數(shù)據(jù)!總結(jié):爬蟲就是由計(jì)算機(jī)自動(dòng)與服務(wù)器交互獲取數(shù)據(jù)的工具。(爬蟲請(qǐng)注意網(wǎng)站的Robot.txt文件!不要讓爬蟲違法!也不要讓爬蟲對(duì)網(wǎng)站造成傷害?。?/p>
反爬及反反爬概念:
基于服務(wù)器資源,保護(hù)數(shù)據(jù)等,很多網(wǎng)站是限制了爬蟲效果。那么由人來(lái)充當(dāng)爬蟲的角色時(shí),我們?cè)趺传@取網(wǎng)頁(yè)源代碼?大部分都是右鍵源文件。那么有些網(wǎng)站屏蔽了右鍵,又該怎么辦?基本常識(shí),當(dāng)然是按我們的F12了
在把人當(dāng)作爬蟲時(shí),網(wǎng)頁(yè)屏蔽右鍵就是反爬取措施,F(xiàn)12就是我們反反爬取的方式!
網(wǎng)站: https://github.com/luyishisi/...
例子例子在
https://pan.baidu.com/disk/ho...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/42025.html
摘要:楚江數(shù)據(jù)是專業(yè)的互聯(lián)網(wǎng)數(shù)據(jù)技術(shù)服務(wù),現(xiàn)整理出零基礎(chǔ)如何學(xué)爬蟲技術(shù)以供學(xué)習(xí),。本文來(lái)源知乎作者路人甲鏈接楚江數(shù)據(jù)提供網(wǎng)站數(shù)據(jù)采集和爬蟲軟件定制開發(fā)服務(wù),服務(wù)范圍涵蓋社交網(wǎng)絡(luò)電子商務(wù)分類信息學(xué)術(shù)研究等。 楚江數(shù)據(jù)是專業(yè)的互聯(lián)網(wǎng)數(shù)據(jù)技術(shù)服務(wù),現(xiàn)整理出零基礎(chǔ)如何學(xué)爬蟲技術(shù)以供學(xué)習(xí),http://www.chujiangdata.com。 第一:Python爬蟲學(xué)習(xí)系列教程(來(lái)源于某博主:htt...
摘要:一入門爬蟲的干貨爬蟲的基本思路通過(guò)或者文件獲取網(wǎng)頁(yè),分析要爬取的目標(biāo)內(nèi)容所在的位置用元素選擇器快速提取目標(biāo)內(nèi)容處理提取出來(lái)的目標(biāo)內(nèi)容通常整理合成一個(gè)存儲(chǔ)處理好的目標(biāo)內(nèi)容比如放到之類的數(shù)據(jù)庫(kù),或者寫進(jìn)文件里。 如果學(xué)會(huì)了python的基本語(yǔ)法,我認(rèn)為入門爬蟲是很容易的。 我寫的第一個(gè)爬蟲大概只需要10分鐘,自學(xué)的 scrapyd , 看官方文檔花了20分鐘,因?yàn)槲矣⑽牟皇呛芎茫芏鄦卧~需...
摘要:以下這些項(xiàng)目,你拿來(lái)學(xué)習(xí)學(xué)習(xí)練練手。當(dāng)你每個(gè)步驟都能做到很優(yōu)秀的時(shí)候,你應(yīng)該考慮如何組合這四個(gè)步驟,使你的爬蟲達(dá)到效率最高,也就是所謂的爬蟲策略問(wèn)題,爬蟲策略學(xué)習(xí)不是一朝一夕的事情,建議多看看一些比較優(yōu)秀的爬蟲的設(shè)計(jì)方案,比如說(shuō)。 (一)如何學(xué)習(xí)Python 學(xué)習(xí)Python大致可以分為以下幾個(gè)階段: 1.剛上手的時(shí)候肯定是先過(guò)一遍Python最基本的知識(shí),比如說(shuō):變量、數(shù)據(jù)結(jié)構(gòu)、語(yǔ)法...
摘要:開始爬蟲之旅本文章屬于爬蟲入門到精通系統(tǒng)教程第一講引言我經(jīng)常會(huì)看到有人在知乎上提問(wèn)如何入門爬蟲爬蟲進(jìn)階利用爬蟲技術(shù)能做到哪些很酷很有趣很有用的事情等這一些問(wèn)題,我寫這一系列的文章的目的就是把我的經(jīng)驗(yàn)告訴大家。 開始爬蟲之旅 本文章屬于爬蟲入門到精通系統(tǒng)教程第一講 引言 我經(jīng)常會(huì)看到有人在知乎上提問(wèn)如何入門 Python 爬蟲?、Python 爬蟲進(jìn)階?、利用爬蟲技術(shù)能做到哪些很酷很有趣...
摘要:想辦法區(qū)分爬蟲程序和正常的用戶。爬蟲是工具性程序,對(duì)速度和效率要求較高。生態(tài)圈完善,是最大對(duì)手。最要命的是爬蟲需要經(jīng)常修改部分代碼。爬蟲分類通用爬蟲也就是百度搜狐等搜索引擎。原本是為測(cè)試來(lái)測(cè)試網(wǎng)站的,后來(lái)成了爬蟲工程師最喜愛的工具。 一、爬蟲的基本知識(shí): 1. 什么是爬蟲 爬蟲的英文翻譯為spider或者crawder,意為蜘蛛或者爬行者,從字面意思我們可以體會(huì)到:爬蟲就是把自己當(dāng)做蜘...
摘要:目錄基于的爬蟲入門環(huán)境搭建基于的爬蟲入門頁(yè)面提取基于的爬蟲入門圖片處理下面創(chuàng)建一個(gè)爬蟲項(xiàng)目,以圖蟲網(wǎng)為例抓取圖片。 目錄 基于 Python 的 Scrapy 爬蟲入門:環(huán)境搭建 基于 Python 的 Scrapy 爬蟲入門:頁(yè)面提取 基于 Python 的 Scrapy 爬蟲入門:圖片處理 下面創(chuàng)建一個(gè)爬蟲項(xiàng)目,以圖蟲網(wǎng)為例抓取圖片。 一、內(nèi)容分析 打開 圖蟲網(wǎng),頂部菜單發(fā)現(xiàn)...
閱讀 1427·2021-11-19 11:38
閱讀 3570·2021-11-15 11:37
閱讀 813·2021-09-30 09:48
閱讀 959·2021-09-29 09:46
閱讀 903·2021-09-23 11:22
閱讀 1880·2019-08-30 15:44
閱讀 3397·2019-08-26 13:58
閱讀 2389·2019-08-26 13:26