摘要:通用網(wǎng)絡(luò)爬蟲通用網(wǎng)絡(luò)爬蟲又稱全網(wǎng)爬蟲,爬取對象從一些種子擴(kuò)充到整個。為提高工作效率,通用網(wǎng)絡(luò)爬蟲會采取一定的爬取策略。介紹是一個國人編寫的強(qiáng)大的網(wǎng)絡(luò)爬蟲系統(tǒng)并帶有強(qiáng)大的。
爬蟲
簡單的說網(wǎng)絡(luò)爬蟲(Web crawler)也叫做網(wǎng)絡(luò)鏟(Web scraper)、網(wǎng)絡(luò)蜘蛛(Web spider),其行為一般是先“爬”到對應(yīng)的網(wǎng)頁上,再把需要的信息“鏟”下來。分類
網(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),爬取對象從一些種子 URL 擴(kuò)充到整個 Web。主要為門戶站點(diǎn)搜索引擎和大型 Web 服務(wù)提供商采集數(shù)據(jù)。
通用網(wǎng)絡(luò)爬蟲的結(jié)構(gòu)大致可以分為頁面爬取模塊 、頁面分析模塊、鏈接過濾模塊、頁面存儲模塊、URL 隊(duì)列、初始 URL 集合幾個部分。為提高工作效率,通用網(wǎng)絡(luò)爬蟲會采取一定的爬取策略。 常用的爬取策略有:深度優(yōu)先策略、廣度優(yōu)先策略。
1) 深度優(yōu)先策略(DFS):其基本方法是按照深度由低到高的順序,依次訪問下一級網(wǎng)頁鏈接,直到不能再深入為止。
2) 廣度優(yōu)先策略(BFS):此策略按照網(wǎng)頁內(nèi)容目錄層次深淺來爬取頁面,處于較淺目錄層次的頁面首先被爬取。 當(dāng)同一層次中的頁面爬取完畢后,爬蟲再深入下一層繼續(xù)爬取。
聚焦網(wǎng)絡(luò)爬蟲聚焦網(wǎng)絡(luò)爬蟲(Focused Crawler),又稱主題網(wǎng)絡(luò)爬蟲(Topical Crawler),是指選擇性地爬取那些與預(yù)先定義好的主題相關(guān)頁面的網(wǎng)絡(luò)爬蟲。 和通用網(wǎng)絡(luò)爬蟲相比,聚焦爬蟲只需要爬取與主題相關(guān)的頁面,極大地節(jié)省了硬件和網(wǎng)絡(luò)資源,保存的頁面也由于數(shù)量少而更新快,還可以很好地滿足一些特定人群對特定領(lǐng)域信息的需求。我們之前爬的歌單就屬于這一種。
增量式網(wǎng)絡(luò)爬蟲增量式網(wǎng)絡(luò)爬蟲(Incremental Web Crawler)是指對已下載網(wǎng)頁采取增 量式更新和只爬取新產(chǎn)生的或者已經(jīng)發(fā)生變化網(wǎng)頁的爬蟲,它能夠在一定程度上保證所爬取的頁面是盡可能新的頁面。 和周期性爬取和刷新頁面的網(wǎng)絡(luò)爬蟲相比,增量式爬蟲只會在需要的時候爬取新產(chǎn)生或發(fā)生更新的頁面 ,并不重新下載沒有發(fā)生變化的頁面,可有效減少數(shù)據(jù)下載量,及時更新已爬取的網(wǎng)頁,減小時間和空間上的耗費(fèi),但是增加了爬取算法的復(fù)雜度和實(shí)現(xiàn)難度。現(xiàn)在比較火的輿情爬蟲一般都是增量式網(wǎng)絡(luò)爬蟲。
深網(wǎng)爬蟲Web 頁面按存在方式可以分為表層網(wǎng)頁(Surface Web)和深層網(wǎng)頁(Deep Web,也稱 Invisible Web Pages 或 Hidden Web)。 表層網(wǎng)頁是指傳統(tǒng)搜索引擎可以索引的頁面,以超鏈接可以到達(dá)的靜態(tài)網(wǎng)頁為主構(gòu)成的 Web 頁面。Deep Web 是那些大部分內(nèi)容不能通過靜態(tài)鏈接獲取的、隱藏在搜索表單后的,只有用戶提交一些關(guān)鍵詞才能獲得的 Web 頁面。例如那些用戶注冊后內(nèi)容才可見的網(wǎng)頁就屬于 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是一個開源的Java實(shí)現(xiàn)的搜索引擎。它提供了我們運(yùn)行自己的搜索引擎所需的全部工具,包括全文搜索和網(wǎng)絡(luò)爬蟲。
盡管搜索是上網(wǎng)的基本要求,但是現(xiàn)有的搜索引擎的數(shù)目卻在下降。并且這很有可能進(jìn)一步演變成為一個公司壟斷了幾乎所有的網(wǎng)頁搜索為其謀取商業(yè)利益。這顯然不利于廣大Internet用戶。
Nutch為我們提供了這樣一個不同的選擇。相對于那些商用的搜索引擎,Nutch作為開放源代碼的搜索引擎將會更加透明,從而更值得大家信賴。現(xiàn)在所有主要的搜索引擎都采用私有的排序算法, 而不會解釋為什么一個網(wǎng)頁會排在一個特定的位置。除此之外, 有的搜索引擎依照網(wǎng)站所付的費(fèi)用, 而不是根據(jù)它們本身的價值進(jìn)行排序。與它們不同,Nutch沒有什么需要隱瞞,也沒有動機(jī)去扭曲搜索的結(jié)果。Nutch將盡自己最大的努力為用戶提供最好的搜索結(jié)果。
優(yōu)點(diǎn):
Nutch支持分布式抓取,并有Hadoop支持,可以進(jìn)行多機(jī)分布抓取,存儲和索引。另外很吸引人的一點(diǎn)在于,它提供了一種插件框架,使得其對各種網(wǎng)頁內(nèi)容的解析、各種數(shù)據(jù)的采集、查詢、集群、過濾等功能能夠方便的進(jìn)行擴(kuò)展。正是由于有此框架,使得 Nutch 的插件開發(fā)非常容易,第三方的插件也層出不窮,極大的增強(qiáng)了 Nutch 的功能和聲譽(yù)。
缺點(diǎn):
對于大多數(shù)用戶來說,一般是想做一個精確數(shù)據(jù)爬取的爬蟲,就像第一篇里爬歌單那個“主題爬蟲”。而第二篇介紹的“通用爬蟲”適合做搜索引擎,這種需求就比較少。如果以此為標(biāo)準(zhǔn),那么為搜索引擎而生的Nutch就有著天生缺點(diǎn)。Nutch的架構(gòu)里大部分為搜索引擎而設(shè)計的,對精確爬取沒有特別的考慮。也就是說,用Nutch做主題爬蟲,會浪費(fèi)很多的時間在不必要的計算上。而且如果你試圖通過對Nutch進(jìn)行二次開發(fā)來擴(kuò)展其定制能力,基本上就要破壞Nutch的框架,反而不如自己寫了。
Pyspider介紹:
Pyspider是一個國人編寫的強(qiáng)大的網(wǎng)絡(luò)爬蟲系統(tǒng)并帶有強(qiáng)大的WebUI。采用Python語言編寫,分布式架構(gòu),支持多種數(shù)據(jù)庫后端,強(qiáng)大的WebUI支持腳本編輯器,任務(wù)監(jiān)視器,項(xiàng)目管理器以及結(jié)果查看器。
Pyspider的主要功能包括,抓取、更新調(diào)度多站點(diǎn)的特定的頁面;需要對頁面進(jìn)行結(jié)構(gòu)化信息提取;靈活可擴(kuò)展,穩(wěn)定可監(jiān)控。滿足了絕大多數(shù)Python爬蟲的需求 —— 定向抓取,結(jié)構(gòu)化化解析。但是面對結(jié)構(gòu)迥異的各種網(wǎng)站,單一的抓取模式并不一定能滿足,靈活的抓取控制是必須的。為了達(dá)到這個目的,單純的配置文件往往不夠靈活,于是,通過腳本去控制抓取成為了最后的選擇。而去重調(diào)度,隊(duì)列,抓取,異常處理,監(jiān)控等功能作為框架,提供給抓取腳本,并保證靈活性。最后加上web的編輯調(diào)試環(huán)境,以及web任務(wù)監(jiān)控,即成為了最終的框架。
優(yōu)點(diǎn):
支持分布式部署。
完全可視化,對用戶非常友好:WEB 界面編寫調(diào)試腳本,起停腳本,監(jiān)控執(zhí)行狀態(tài),查看活動歷史,獲取結(jié)果產(chǎn)出。
簡單,五分鐘就能上手。腳本規(guī)則簡單,開發(fā)效率高。
支持抓取JavaScript的頁面。
總之,Pyspider非常強(qiáng)大,強(qiáng)大到更像一個產(chǎn)品而不是一個框架。
缺點(diǎn):
URL去重使用數(shù)據(jù)庫而不是布隆過濾器,億級存儲的db io將導(dǎo)致效率急劇降低。
使用上的人性化犧牲了靈活度,定制化能力降低。
Scrapy介紹:
Scrapy是一個為了爬取網(wǎng)站數(shù)據(jù),提取結(jié)構(gòu)性數(shù)據(jù)而編寫的應(yīng)用框架。 可以應(yīng)用在包括數(shù)據(jù)挖掘,信息處理或存儲歷史數(shù)據(jù)等一系列的程序中。Scrapy 使用 Twisted這個異步網(wǎng)絡(luò)庫來處理網(wǎng)絡(luò)通訊,架構(gòu)清晰,并且包含了各種中間件接口,可以靈活的完成各種需求。Scratch,是抓取的意思,這個Python的爬蟲框架叫Scrapy,大概也是這個意思吧。
優(yōu)點(diǎn):
極其靈活的定制化爬取。
社區(qū)人數(shù)多、文檔完善。
URL去重采用布隆過濾器方案。
可以處理不完整的HTML,Scrapy已經(jīng)提供了selectors(一個在lxml的基礎(chǔ)上提供了更高級的接口),可以高效地處理不完整的HTML代碼。
缺點(diǎn):
不支持分布式部署。
原生不支持抓取JavaScript的頁面。
全命令行操作,對用戶不友好,需要一定學(xué)習(xí)周期。
Scrapy入門 架構(gòu)簡介組件
Engine: 引擎負(fù)責(zé)控制數(shù)據(jù)流在系統(tǒng)中所有組件中流動,并在相應(yīng)動作發(fā)生時觸發(fā)事件。
Scheduler: 調(diào)度器從引擎接受Request并將他們?nèi)腙?duì),以便之后引擎請求他們時提供給引擎。
Downloader: 下載器負(fù)責(zé)獲取頁面數(shù)據(jù)并提供給引擎,而后提供給Spider。
Spiders: Spider是Scrapy用戶編寫的用于分析Response并提取Item或提取更多需要下載的URL的類。 每個Spider負(fù)責(zé)處理特定網(wǎng)站。
Item Pipeline: 負(fù)責(zé)處理被Spider提取出來的Item。典型的功能有清洗、 驗(yàn)證及持久化操作。
Downloader middlewares: 下載器中間件是在Engine及Downloader之間的特定鉤子(specific hooks),處理Downloader傳遞給Engine的Response。 其提供了一個簡便的機(jī)制,通過插入自定義代碼來擴(kuò)展Scrapy功能。
Spider middlewares: 是在Engine及Spider之間的特定鉤子(specific hook),處理Spider的輸入(Response)和輸出(Items及Requests)。 其提供了一個簡便的機(jī)制,通過插入自定義代碼來擴(kuò)展Scrapy功能。
數(shù)據(jù)流
Scrapy中的數(shù)據(jù)流由執(zhí)行引擎控制,其過程如下:
Engine從Spider獲取第一個需要爬取URL(s)。
Engine用Scheduler調(diào)度Requests,并向Scheduler請求下一個要爬取的URL。
Scheduler返回下一個要爬取的URL給Engine。
Engine將URL通過Downloader middlewares轉(zhuǎn)發(fā)給Downloader。
一旦頁面下載完畢,下載器生成一個該頁面的Response,并將其通過Downloader middlewares發(fā)送給Engine。
引擎從Downloader中接收到Response并通過Spider middlewares發(fā)送給Spider處理。
Spider處理Response并返回爬取到的Item及新的Request給Engine。
Engine將爬取到的Item給Item Pipeline,然后將Request給Scheduler。
從第一步開始重復(fù)這個流程,直到Scheduler中沒有更多的URLs。
架構(gòu)就是這樣,流程和我第二篇里介紹的迷你架構(gòu)差不多,但擴(kuò)展性非常強(qiáng)大。
入門 安裝scrapypip install scrapy創(chuàng)建項(xiàng)目
在開始爬取之前,您必須創(chuàng)建一個新的Scrapy項(xiàng)目。 進(jìn)入您打算存儲代碼的目錄中,運(yùn)行下列命令:
scrapy startproject tutorial
該命令將會創(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編寫第一個爬蟲
Spider是用戶編寫用于從單個網(wǎng)站(或者一些網(wǎng)站)爬取數(shù)據(jù)的類。其包含了一個用于下載的初始URL,以及如何跟進(jìn)網(wǎng)頁中的鏈接以及如何分析頁面中的內(nèi)容的方法。
以下為我們的第一個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)建一個Spider,你必須繼承 scrapy.Spider 類, 且定義以下三個屬性:
name: 用于區(qū)別Spider。 該名字必須是唯一的,您不可以為不同的Spider設(shè)定相同的名字。
start_urls: 包含了Spider在啟動時進(jìn)行爬取的url列表。 因此,第一個被獲取到的頁面將是其中之一。 后續(xù)的URL則從初始的URL獲取到的數(shù)據(jù)中提取。
parse() 是spider的一個方法。 被調(diào)用時,每個初始URL完成下載后生成的Response 對象將會作為唯一的參數(shù)傳遞給該函數(shù)。 該方法負(fù)責(zé)解析返回的數(shù)據(jù)(response data),提取數(shù)據(jù)以及生成需要進(jìn)一步處理的URL的 Request 對象。
進(jìn)入項(xiàng)目的根目錄,執(zhí)行下列命令啟動spider:
scrapy s crawl quotes
這個命令啟動用于爬取 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頁面,并沒有提取數(shù)據(jù)。現(xiàn)在升級一下代碼,把提取功能加進(jìn)去。至于如何使用瀏覽器的開發(fā)者模式分析網(wǎng)頁,之前已經(jīng)介紹過了。
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)行這個爬蟲,你將在日志里看到被提取出的數(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ù)
最簡單存儲爬取的數(shù)據(jù)的方式是使用 Feed exports:
scrapy crawl quotes -o quotes.json
該命令將采用 JSON 格式對爬取的數(shù)據(jù)進(jìn)行序列化,生成quotes.json文件。
Pyspider 架構(gòu)簡介pyspider的架構(gòu)主要分為 scheduler(調(diào)度器), fetcher(抓取器), processor(腳本執(zhí)行):
各個組件間使用消息隊(duì)列連接,除了scheduler是單點(diǎn)的,fetcher 和 processor 都是可以多實(shí)例分布式部署的。 scheduler 負(fù)責(zé)整體的調(diào)度控制
任務(wù)由 scheduler 發(fā)起調(diào)度,fetcher 抓取網(wǎng)頁內(nèi)容, processor 執(zhí)行預(yù)先編寫的python腳本,輸出結(jié)果或產(chǎn)生新的提鏈任務(wù)(發(fā)往 scheduler),形成閉環(huán)。
每個腳本可以靈活使用各種python庫對頁面進(jìn)行解析,使用框架API控制下一步抓取動作,通過設(shè)置回調(diào)控制解析動作。
入門抓取電影的相關(guān)信息
安裝pip install pyspider啟動
pyspider
運(yùn)行成功后用瀏覽器打開http://localhost:5000/訪問控制臺
選取url既然我們要爬所有的電影,首先我們需要抓一個電影列表,一個好的列表應(yīng)該:
包含足夠多的電影的 URL
通過翻頁,可以遍歷到所有的電影
一個按照更新時間排序的列表,可以更快抓到最新更新的電影
我們在 http://movie.douban.com/ 掃了一遍,發(fā)現(xiàn)并沒有一個列表能包含所有電影,只能退而求其次,通過抓取分類下的所有的標(biāo)簽列表頁,來遍歷所有的電影: 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 抓取指定頁面,然后使用 callback 函數(shù)對結(jié)果進(jìn)行解析。
@every 修飾器,表示 on_start 每天會執(zhí)行一次,這樣就能抓到最新的電影了。
點(diǎn)擊綠色的 run 執(zhí)行,你會看到 follows 上面有一個紅色的 1,切換到 follows 面板,點(diǎn)擊綠色的播放按鈕:
Tag 列表頁在 tag 列表頁 中,我們需要提取出所有的 電影列表頁 的 URL。你可能已經(jīng)發(fā)現(xiàn)了,sample handler 已經(jīng)提取了非常多大的 URL,所有,一種可行的提取列表頁 URL 的方法就是用正則從中過濾出來:
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)
由于 電影列表頁和 tag列表頁長的并不一樣,在這里新建了一個 callback 為 self.list_page
@config(age=10 24 60 * 60) 在這表示我們認(rèn)為 10 天內(nèi)頁面有效,不會再次進(jìn)行更新抓取
由于 pyspider 是純 Python 環(huán)境,你可以使用 Python 強(qiáng)大的內(nèi)置庫,或者你熟悉的第三方庫對頁面進(jìn)行解析。不過更推薦使用 CSS選擇器
電影列表頁再次點(diǎn)擊 run 讓我們進(jìn)入一個電影列表頁(list_page)。在這個頁面中我們需要提取:
電影的鏈接,例如,http://movie.douban.com/subje...
下一頁的鏈接,用來翻頁
CSS Selector Helper在 pyspider 中,還內(nèi)置了一個 CSS Selector Helper,當(dāng)你點(diǎn)擊頁面上的元素的時候,可以幫你生成它的 CSS選擇器 表達(dá)式。你可以點(diǎn)擊 Enable CSS selector helper 按鈕,然后切換到 web 頁面:
開啟后,鼠標(biāo)放在元素上,會被黃色高亮,點(diǎn)擊后,所有擁有相同 CSS選擇器 表達(dá)式的元素會被高亮。表達(dá)式會被插入到 python 代碼當(dāng)前光標(biāo)位置。創(chuàng)建下面的代碼,將光標(biāo)停留在單引號中間:
def list_page(self, response): for each in response.doc("").items():
點(diǎn)擊一個電影的鏈接,CSS選擇器 表達(dá)式將會插入到你的代碼中,如此重復(fù),插入翻頁的鏈接:
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) # 翻頁 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)
翻頁是一個到自己的 callback 回調(diào)電影詳情頁
再次點(diǎn)擊 run,follow 到詳情頁。使用 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)試你的代碼,對于用一個 callback 最好使用多個頁面類型進(jìn)行測試。然后保存。
回到 Dashboard,找到你的項(xiàng)目
將 status 修改為 DEBUG 或 RUNNING
按 run 按鈕
反反爬蟲技術(shù)越來越多的網(wǎng)站具有反爬蟲特性,有的用圖片隱藏關(guān)鍵數(shù)據(jù),有的使用反人類的驗(yàn)證碼等
爬蟲:
爬蟲的根本就是得到一個網(wǎng)頁的源代碼數(shù)據(jù)。更深入一些,就會出現(xiàn)和網(wǎng)頁進(jìn)行POST交互從而獲取服務(wù)器接收POST請求后返回的數(shù)據(jù)!總結(jié):爬蟲就是由計算機(jī)自動與服務(wù)器交互獲取數(shù)據(jù)的工具。(爬蟲請注意網(wǎng)站的Robot.txt文件!不要讓爬蟲違法!也不要讓爬蟲對網(wǎng)站造成傷害!)
反爬及反反爬概念:
基于服務(wù)器資源,保護(hù)數(shù)據(jù)等,很多網(wǎng)站是限制了爬蟲效果。那么由人來充當(dāng)爬蟲的角色時,我們怎么獲取網(wǎng)頁源代碼?大部分都是右鍵源文件。那么有些網(wǎng)站屏蔽了右鍵,又該怎么辦?基本常識,當(dāng)然是按我們的F12了
在把人當(dāng)作爬蟲時,網(wǎng)頁屏蔽右鍵就是反爬取措施,F(xiàn)12就是我們反反爬取的方式!
網(wǎng)站: https://github.com/luyishisi/...
例子例子在
https://pan.baidu.com/disk/ho...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/116902.html
摘要:楚江數(shù)據(jù)是專業(yè)的互聯(lián)網(wǎng)數(shù)據(jù)技術(shù)服務(wù),現(xiàn)整理出零基礎(chǔ)如何學(xué)爬蟲技術(shù)以供學(xué)習(xí),。本文來源知乎作者路人甲鏈接楚江數(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í)系列教程(來源于某博主:htt...
摘要:一入門爬蟲的干貨爬蟲的基本思路通過或者文件獲取網(wǎng)頁,分析要爬取的目標(biāo)內(nèi)容所在的位置用元素選擇器快速提取目標(biāo)內(nèi)容處理提取出來的目標(biāo)內(nèi)容通常整理合成一個存儲處理好的目標(biāo)內(nèi)容比如放到之類的數(shù)據(jù)庫,或者寫進(jìn)文件里。 如果學(xué)會了python的基本語法,我認(rèn)為入門爬蟲是很容易的。 我寫的第一個爬蟲大概只需要10分鐘,自學(xué)的 scrapyd , 看官方文檔花了20分鐘,因?yàn)槲矣⑽牟皇呛芎茫芏鄦卧~需...
摘要:以下這些項(xiàng)目,你拿來學(xué)習(xí)學(xué)習(xí)練練手。當(dāng)你每個步驟都能做到很優(yōu)秀的時候,你應(yīng)該考慮如何組合這四個步驟,使你的爬蟲達(dá)到效率最高,也就是所謂的爬蟲策略問題,爬蟲策略學(xué)習(xí)不是一朝一夕的事情,建議多看看一些比較優(yōu)秀的爬蟲的設(shè)計方案,比如說。 (一)如何學(xué)習(xí)Python 學(xué)習(xí)Python大致可以分為以下幾個階段: 1.剛上手的時候肯定是先過一遍Python最基本的知識,比如說:變量、數(shù)據(jù)結(jié)構(gòu)、語法...
摘要:開始爬蟲之旅本文章屬于爬蟲入門到精通系統(tǒng)教程第一講引言我經(jīng)常會看到有人在知乎上提問如何入門爬蟲爬蟲進(jìn)階利用爬蟲技術(shù)能做到哪些很酷很有趣很有用的事情等這一些問題,我寫這一系列的文章的目的就是把我的經(jīng)驗(yàn)告訴大家。 開始爬蟲之旅 本文章屬于爬蟲入門到精通系統(tǒng)教程第一講 引言 我經(jīng)常會看到有人在知乎上提問如何入門 Python 爬蟲?、Python 爬蟲進(jìn)階?、利用爬蟲技術(shù)能做到哪些很酷很有趣...
摘要:想辦法區(qū)分爬蟲程序和正常的用戶。爬蟲是工具性程序,對速度和效率要求較高。生態(tài)圈完善,是最大對手。最要命的是爬蟲需要經(jīng)常修改部分代碼。爬蟲分類通用爬蟲也就是百度搜狐等搜索引擎。原本是為測試來測試網(wǎng)站的,后來成了爬蟲工程師最喜愛的工具。 一、爬蟲的基本知識: 1. 什么是爬蟲 爬蟲的英文翻譯為spider或者crawder,意為蜘蛛或者爬行者,從字面意思我們可以體會到:爬蟲就是把自己當(dāng)做蜘...
摘要:目錄基于的爬蟲入門環(huán)境搭建基于的爬蟲入門頁面提取基于的爬蟲入門圖片處理下面創(chuàng)建一個爬蟲項(xiàng)目,以圖蟲網(wǎng)為例抓取圖片。 目錄 基于 Python 的 Scrapy 爬蟲入門:環(huán)境搭建 基于 Python 的 Scrapy 爬蟲入門:頁面提取 基于 Python 的 Scrapy 爬蟲入門:圖片處理 下面創(chuàng)建一個爬蟲項(xiàng)目,以圖蟲網(wǎng)為例抓取圖片。 一、內(nèi)容分析 打開 圖蟲網(wǎng),頂部菜單發(fā)現(xiàn)...
閱讀 1756·2023-04-25 16:28
閱讀 691·2021-11-23 09:51
閱讀 1475·2019-08-30 15:54
閱讀 1158·2019-08-30 15:53
閱讀 2827·2019-08-30 15:53
閱讀 3422·2019-08-30 15:43
閱讀 3263·2019-08-30 11:18
閱讀 3280·2019-08-26 10:25