国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

爬蟲入門

defcon / 2050人閱讀

摘要:通用網(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

介紹:

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)大。

入門 安裝scrapy
pip 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)  (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)
提取數(shù)據(jù)

我們之前只是保存了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

相關(guān)文章

  • 零基礎(chǔ)如何學(xué)爬蟲技術(shù)

    摘要:楚江數(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...

    KunMinX 評(píng)論0 收藏0
  • 入門爬蟲的干貨

    摘要:一入門爬蟲的干貨爬蟲的基本思路通過(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)槲矣⑽牟皇呛芎茫芏鄦卧~需...

    Yangder 評(píng)論0 收藏0
  • Python爬蟲學(xué)習(xí)路線

    摘要:以下這些項(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ǔ)法...

    liaoyg8023 評(píng)論0 收藏0
  • 爬蟲入門到精通-開始爬蟲之旅

    摘要:開始爬蟲之旅本文章屬于爬蟲入門到精通系統(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ù)能做到哪些很酷很有趣...

    JayChen 評(píng)論0 收藏0
  • python爬蟲入門(一)

    摘要:想辦法區(qū)分爬蟲程序和正常的用戶。爬蟲是工具性程序,對(duì)速度和效率要求較高。生態(tài)圈完善,是最大對(duì)手。最要命的是爬蟲需要經(jīng)常修改部分代碼。爬蟲分類通用爬蟲也就是百度搜狐等搜索引擎。原本是為測(cè)試來(lái)測(cè)試網(wǎng)站的,后來(lái)成了爬蟲工程師最喜愛的工具。 一、爬蟲的基本知識(shí): 1. 什么是爬蟲 爬蟲的英文翻譯為spider或者crawder,意為蜘蛛或者爬行者,從字面意思我們可以體會(huì)到:爬蟲就是把自己當(dāng)做蜘...

    lentrue 評(píng)論0 收藏0
  • 基于 Python 的 Scrapy 爬蟲入門:頁(yè)面提取

    摘要:目錄基于的爬蟲入門環(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)...

    willin 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<