爬蟲框架srcapy入門

目錄

  1. 參考
  2. 概述
  3. 安裝
  4. 編寫scrapy程序
  5. 問題總結(jié)

1. 參考

2. 概述

Scrapy 是用 Python 實現(xiàn)的一個為了爬取網(wǎng)站數(shù)據(jù)夯尽、提取結(jié)構(gòu)性數(shù)據(jù)而編寫的應(yīng)用框架。

Scrapy架構(gòu)圖(綠線是數(shù)據(jù)流向)

image
  • Scrapy Engine(引擎): 負(fù)責(zé)Spider登馒、ItemPipeline匙握、Downloader、Scheduler中間的通訊陈轿,信號圈纺、數(shù)據(jù)傳遞等。
  • Scheduler(調(diào)度器): 負(fù)責(zé)接受引擎發(fā)送過來的Request請求麦射,并按照一定的方式進行整理排列蛾娶,入隊,當(dāng)引擎需要時潜秋,交還給引擎蛔琅。
  • Downloader(下載器):負(fù)責(zé)下載Scrapy Engine(引擎)發(fā)送的所有Requests請求,并將其獲取到的Responses交還給Scrapy Engine(引擎)峻呛,由引擎交給Spider來處理罗售,
  • Spider(爬蟲):負(fù)責(zé)處理所有Responses,從中分析提取數(shù)據(jù)钩述,獲取Item字段需要的數(shù)據(jù)寨躁,并將需要跟進的URL提交給引擎,再次進入Scheduler(調(diào)度器)牙勘。
  • Item Pipeline(管道):負(fù)責(zé)處理Spider中獲取到的Item职恳,并進行進行后期處理(詳細(xì)分析、過濾方面、存儲等)的地方话肖。
  • Downloader Middlewares(下載中間件):可以當(dāng)作是一個可以自定義擴展下載功能的組件。
  • Spider Middlewares(Spider中間件):可以理解為是一個可以自定擴展和操作引擎和Spider中間通信的功能組件(比如進入Spider的Responses;和從Spider出去的Requests)

3. 安裝

安裝依賴

apt-get install python-dev python-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev

安裝scrapy

pip3 install Scrapy

4. 編寫scrapy程序

創(chuàng)建scrapy工程

scrapy startproject project_name
project_name/
    scrapy.cfg            # deploy configuration file
    tutorial/             # project's Python module, you'll import your code from here
        __init__.py
        items.py          # project items definition file
        middlewares.py    # project middlewares file
        pipelines.py      # project pipelines file
        settings.py       # project settings file
        spiders/          # a directory where you'll later put your spiders
            __init__.py

文件說明:

  • scrapy.cfg:項目的配置信息葡幸,主要為Scrapy命令行工具提供一個基礎(chǔ)的配置信息最筒。(真正爬蟲相關(guān)的配置信息在settings.py文件中)
  • items.py:設(shè)置數(shù)據(jù)存儲模板,用于結(jié)構(gòu)化數(shù)據(jù)蔚叨,如:Django的Model
  • pipelines:數(shù)據(jù)處理行為床蜘,如:一般結(jié)構(gòu)化的數(shù)據(jù)持久化
  • settings.py:配置文件,如:遞歸的層數(shù)蔑水、并發(fā)數(shù)邢锯,延遲下載等
  • spiders:爬蟲目錄,如:創(chuàng)建文件搀别,編寫爬蟲規(guī)則

示例程序丹擎,放在spiders目錄

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)

QuotesSpider繼承于scrapy.Spider,并定義了一些屬性和方法:

  • name: 標(biāo)識這個Spider。它在項目中必須是唯一的蒂培,也就是說再愈,不能為不同的Spiders設(shè)置相同的名稱。
  • start_requests():必須返回一個可迭代的請求(可以返回一個請求列表或編寫一個生成器函數(shù))护戳,Spiders將開始從中爬行翎冲。后續(xù)請求將從這些初始請求中依次生成。
  • parse():它將被調(diào)用來處理為每個請求下載的響應(yīng)媳荒。response參數(shù)是TextResponse的一個實例抗悍,它包含頁面內(nèi)容,并且有進一步有用的方法來處理它钳枕。parse()方法通常解析響應(yīng)缴渊,將抓取的數(shù)據(jù)提取為dict,并找到要跟蹤的新url鱼炒,并從中創(chuàng)建新的請求(請求)衔沼。

運行scrapy

scrapy crawl quotes
  • 這個命令使用剛剛添加的名稱為quotes的運行Spider,它將發(fā)送對quotes.toscrape.com域名的一些請求田柔。會得到一個類似的輸出:
(omitted for brevity)
2016-12-16 21:24:05 [scrapy.core.engine] INFO: Spider opened
2016-12-16 21:24:05 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2016-12-16 21:24:05 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
2016-12-16 21:24:05 [scrapy.core.engine] DEBUG: Crawled (404) <GET http://quotes.toscrape.com/robots.txt> (referer: None)
2016-12-16 21:24:05 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://quotes.toscrape.com/page/1/> (referer: None)
2016-12-16 21:24:05 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://quotes.toscrape.com/page/2/> (referer: None)
2016-12-16 21:24:05 [quotes] DEBUG: Saved file quotes-1.html
2016-12-16 21:24:05 [quotes] DEBUG: Saved file quotes-2.html
2016-12-16 21:24:05 [scrapy.core.engine] INFO: Closing spider (finished)`

檢查當(dāng)前目錄中的文件俐巴。應(yīng)該已經(jīng)創(chuàng)建了兩個新文件:quotes-1.html和quotes-2.html骨望,以及對應(yīng)url的內(nèi)容硬爆,正如我們的解析方法所指示的那樣。

可以使用Feed導(dǎo)出結(jié)果擎鸠,使用以下命令輸出為json格式數(shù)據(jù):

scrapy crawl quotes -o quotes.json

5. 問題總結(jié)

5.1 HTTP 403

解決方法:
在Settings.py中增加UA的設(shè)置缀磕,偽裝為瀏覽器的訪問

USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36'

5.2 class名稱中有空格

參考[5],空格用“.”替代空格

5.3 怎么解析本地文件

url使用file的地址符劣光,如下所示:

file:///path_of_directory/example.html
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末袜蚕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子绢涡,更是在濱河造成了極大的恐慌牲剃,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雄可,死亡現(xiàn)場離奇詭異凿傅,居然都是意外死亡,警方通過查閱死者的電腦和手機数苫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門聪舒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人虐急,你說我怎么就攤上這事箱残。” “怎么了止吁?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵被辑,是天一觀的道長燎悍。 經(jīng)常有香客問我,道長敷待,這世上最難降的妖魔是什么间涵? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮榜揖,結(jié)果婚禮上勾哩,老公的妹妹穿的比我還像新娘。我一直安慰自己举哟,他們只是感情好思劳,可當(dāng)我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著妨猩,像睡著了一般潜叛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上壶硅,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天威兜,我揣著相機與錄音,去河邊找鬼庐椒。 笑死椒舵,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的约谈。 我是一名探鬼主播笔宿,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼棱诱!你這毒婦竟也來了泼橘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤迈勋,失蹤者是張志新(化名)和其女友劉穎炬灭,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體靡菇,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡重归,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了镰官。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片提前。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖泳唠,靈堂內(nèi)的尸體忽然破棺而出狈网,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布拓哺,位于F島的核電站勇垛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏士鸥。R本人自食惡果不足惜闲孤,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望烤礁。 院中可真熱鬧讼积,春花似錦、人聲如沸脚仔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鲤脏。三九已至们颜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間猎醇,已是汗流浹背窥突。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留硫嘶,地道東北人阻问。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像音半,于是被迫代替她去往敵國和親则拷。 傳聞我的和親對象是個殘疾皇子贡蓖,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 本主題主要是scrapy入門曹鸠,包含內(nèi)容如下:??1. Scrapy框架環(huán)境搭建;??2. 理解scrapy框架結(jié)...
    楊強AT南京閱讀 1,337評論 0 10
  • 背景 部門(東方IC斥铺、圖蟲)業(yè)務(wù)驅(qū)動彻桃,需要搜集大量圖片資源,做數(shù)據(jù)分析晾蜘,以及正版圖片維權(quán)邻眷。前期主要用node做爬蟲...
    字節(jié)跳動技術(shù)團隊閱讀 7,665評論 1 67
  • 前言 爬蟲就是請求網(wǎng)站并提取數(shù)據(jù)的自動化程序,其中請求剔交,提取肆饶,自動化是爬蟲的關(guān)鍵。Python作為一款出色的膠水語...
    王奧OX閱讀 3,383評論 1 8
  • 摘要:從零開始寫爬蟲岖常,初學(xué)者的速成指南驯镊! 上期我們理性的分析了為什么要學(xué)習(xí)Scrapy,理由只有一個,那就是免費板惑,...
    派派森森閱讀 440評論 0 0
  • 弱者任思緒控制行為橄镜,強者讓行為控制思緒。今天冯乘,我要學(xué)會控制情緒洽胶。我從此領(lǐng)悟了人類情緒變化的奧秘。對于自己千變?nèi)f化的...
    Hey_一葉孤舟閱讀 87評論 0 1