大師兄的Python學(xué)習(xí)筆記(二十九): 爬蟲(十)

大師兄的Python學(xué)習(xí)筆記(二十八): 爬蟲(九)
大師兄的Python學(xué)習(xí)筆記(三十): 爬蟲(十一)

十一师枣、Scrapy框架

  • 基于Twisted的異步處理框架血巍,是純Python實現(xiàn)的爬蟲框架。
  • 功能強大端逼、爬取效率高朗兵,是目前使用最廣泛的爬蟲框架。
  • 模塊間的耦合度低顶滩,擴展能力強余掖,擴展組件多,幾乎可以應(yīng)對所有的反爬網(wǎng)站礁鲁。
1. Scrapy的安裝
  • Scrapy庫依賴Twisted 14.0盐欺、lxml 3.4赁豆、pyOpenSSL 0.14等庫,在安裝Scrapy之前冗美,需要先安裝依賴庫魔种,之后再安裝Scrapypip install scrapy
  • 如果你安裝了Anaconda,可以跳過依賴庫安裝粉洼,直接使用conda install scrapy节预。
2. Scrapy的架構(gòu)
組件 功能
Scrapy Engine
引擎
處理整個系統(tǒng)的數(shù)據(jù)流、觸發(fā)事務(wù)属韧,是整個框架的核心安拟。
Items
項目
定義爬取結(jié)果的數(shù)據(jù)結(jié)構(gòu),爬取的數(shù)據(jù)會被賦值成該Item對象宵喂。
Scheduler
調(diào)度器
接收引擎發(fā)過來的請求并將其加入其隊列中去扣,在引擎再次請求時將請求提供給引擎。
Downloader
下載器
下載網(wǎng)頁內(nèi)容樊破,并將網(wǎng)頁內(nèi)容返回給爬蟲愉棱。
Spiders
爬蟲
定義了爬取的邏輯和網(wǎng)頁的解析規(guī)則,主要負責解析響應(yīng)并生成提取結(jié)果和新的請求哲戚。
Item Pipeline
項目管道
負責處理由爬蟲從網(wǎng)頁抽取的項目奔滑,主要任務(wù)是清洗、驗證和存儲數(shù)據(jù)顺少。
Downloader Middlewares
下載器中間件
位于引擎和下載器之間的Hook框架朋其,主要處理引擎和下載器之間的請求及響應(yīng)。
Spider Middlewares
爬蟲中間件
位于引擎和爬蟲間的Hook框架脆炎,主要處理向爬蟲輸入的響應(yīng)和輸出的結(jié)果及新的請求梅猿。
3. Scrapy的數(shù)據(jù)流
  • Scrapy的數(shù)據(jù)流由引擎控制,流程如下:

(1) 引擎打開網(wǎng)站秒裕,找到該網(wǎng)站的爬蟲袱蚓,并向該爬蟲請求第一個要爬取的URL。
(2) 引擎爬蟲中獲取到第一個要爬取的URL几蜻,并通過調(diào)度器以Request的形式調(diào)度喇潘。
(3) 引擎調(diào)度器請求下一個要爬取的URL。
(4) 調(diào)度器返回下一個要爬取的URL給引擎,引擎將URL通過下載器中間件轉(zhuǎn)發(fā)給下載器下載梭稚。
(5) 頁面下載完畢颖低,下載器生成頁面的Response,并通過下載器中間件發(fā)送給引擎
(6) 引擎從下載器中接收到Response弧烤,并將其通過爬蟲中間件發(fā)送給爬蟲處理忱屑。
(7) 爬蟲處理Response,并返回提取到的項目及新的Request給引擎
(8) 引擎將爬蟲返回的項目項目管道,并將新的Request調(diào)度器
不斷重復(fù)(2)至(8)莺戒,直到調(diào)度器中沒有更多的Request粱栖,引擎關(guān)閉網(wǎng)站,爬取結(jié)束脏毯。

4. Scrapy的項目結(jié)構(gòu)
  • 項目創(chuàng)建后闹究,文件夾結(jié)構(gòu)如下:

scrapy.cfg
project/
?__init__.py
?items.py
?pipelines.py
?settings.py
?middlewares.py
?spiders/
??__init__.py
??spider1.py
??spider2.py
??... ...

文件 功能
scrapy.cfg 項目配置文件,定義了項目的配置文件路徑、部署相關(guān)信息等內(nèi)容食店。
items.py 定義項目的數(shù)據(jù)結(jié)構(gòu)渣淤,所有項目的定義都可以放在這里。
pipelines.py 定義項目管道的實現(xiàn)吉嫩,所有的項目管道都可以放在這里价认。
settings.py 定義項目的全局配置。
middlewares.py 定義爬蟲中間件和下載器中間件的實現(xiàn)自娩。
spiders 所有爬蟲的實現(xiàn)用踩,每個爬蟲是一個文件。
5. 運行Scrapy
5.1 創(chuàng)建項目
  • Scrapy項目需要再命令行使用scrapy命令生成忙迁。
  • 使用scrapy startproject <projectname>創(chuàng)建脐彩。
5.2 創(chuàng)建爬蟲
  • 爬蟲必須繼承scrapy.Spider
  • 可以在項目文件夾中使用scrapy genspider <spider_name> <domain>生成爬蟲姊扔。
# -*- coding: utf-8 -*-
>>>import scrapy

>>>class DoubanSpider(scrapy.Spider):
>>>    name = 'douban'
>>>    allowed_domains = ['movie.douban.com']
>>>    start_urls = ['https://movie.douban.com/chart']

>>>    def parse(self, response):
>>>        pass
  • 生成的類包含了三個屬性:name惠奸、allowed_domainsstart_urls
  • 生了一個方法:parse()恰梢。
屬性和方法 功能
name 爬蟲名
allowed_domains 允許爬取的域名佛南。
start_urls 爬蟲啟動時爬取的url列表,定義初始請求嵌言。
parse() 負責解析返回的響應(yīng)嗅回,提取數(shù)據(jù)或進一步生成要處理的請求。
5.3 創(chuàng)建Item
  • Item是保存爬取數(shù)據(jù)的容器,使用方法類似字典摧茴。
  • 創(chuàng)建Item需要繼承scrapy.Item類绵载。
  • 需要定義類型為scrapy.Field的字段。
  • 編輯items.py:
>>># -*- coding: utf-8 -*-

>>># Define here the models for your scraped items
>>>#
>>># See documentation in:
>>># https://doc.scrapy.org/en/latest/topics/items.html

>>>import scrapy

>>>class ProjectSampleItem(scrapy.Item):
>>>    # define the fields for your item here like:
>>>    url = scrapy.Field()
>>>    title = scrapy.Field()
>>>    actors = scrapy.Field()
>>>    rating = scrapy.Field()
5.4 解析Response并復(fù)制Item
  • 可以使用爬蟲的parse(response)解析response蓬蝶,并將解析結(jié)果賦值給Item尘分。
  • 可以使用CSS或Xpath選擇器。
  • 修改爬蟲的·parse()·函數(shù):
  • 此外丸氛,還需要修改爬蟲的request header。
# -*- coding: utf-8 -*-
>>>import scrapy

>>>class DoubanSpider(scrapy.Spider):
>>>    name = 'douban'
>>>    allowed_domains = ['https://movie.douban.com/']
>>>    start_urls = ['https://movie.douban.com/chart//']

>>>    def start_requests(self):
>>>        yield scrapy.Request("https://movie.douban.com/chart",
>>>                      headers={
>>>                          'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"})

>>>    def parse(self, response):
>>>        films = response.css('.article .item')

>>>        for film in films:
>>>            item = ProjectSampleItem()
>>>            item['url'] = film.css('a::attr(href)').extract_first()
>>>            item['title'] = (film.css('a::text').extract())[2].strip('\n /')
>>>            item['actors'] = film.css('.pl::text').extract_first()
>>>            item['rating'] = film.css('.rating_nums::text').extract_first()
>>>            yield item
5.5 運行爬蟲
  • 在項目目錄使用scrapy crawl <spider>運行爬蟲著摔。
  • 如果一切順利缓窜,運行爬蟲后再控制臺會顯示爬取結(jié)果:
D:\project_sample>scrapy crawl douban
... ...
2020-09-09 10:30:32 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://movie.douban.com/chart> (referer: None)
2020-09-09 10:30:32 [scrapy.core.scraper] DEBUG: Scraped from <200 https://movie.douban.com/chart>
{'actors': '2020-09-04(美國網(wǎng)絡(luò)) / 2020-09-11(中國大陸) / 劉亦菲 / 甄子丹 / 鞏俐 / 李連杰 / 李截 / '
           '安柚鑫 / 馬泰 / 趙家玲 / 鄭佩佩 / 溫明娜 / 曾曉童 / 袁文忠 / 唐辰瀛 / 道阿·茂阿 / 黃谷悅 / 尼爾森·李 '
           '/ 李勛 / 饒雪晶 / 袁之正 / 仁成外橋 / 加里·揚...',
 'rating': '4.7',
 'title': '花木蘭',
 'url': 'https://movie.douban.com/subject/26357307/'}
2020-09-09 10:30:32 [scrapy.core.scraper] DEBUG: Scraped from <200 https://movie.douban.com/chart>
{'actors': '2020-07-15(韓國) / 姜棟元 / 李貞賢 / 權(quán)海驍 / 李來 / 金敏載 / 具教煥 / 金度允 / 李藝媛 / '
           '文宇振 / 韓國 / 延尚昊 / 115分鐘 / 釜山行2:半島 / 動作 / 驚悚 / 延尚昊 Sang-ho Yeon / 韓語 '
           '/ 英語 / 粵語',
 'rating': '5.1',
 'title': '釜山行2:半島',
 'url': 'https://movie.douban.com/subject/30299515/'}
2020-09-09 10:30:32 [scrapy.core.scraper] DEBUG: Scraped from <200 https://movie.douban.com/chart>
{'actors': '2020-08-28(美國點映) / 2020-09-04(美國) / 杰西·普萊蒙 / 杰西·巴克利 / 托妮·科萊特 / '
           '大衛(wèi)·休里斯 / 蓋伊·博伊德 / 哈德莉·羅賓遜 / 格斯·伯尼 / 艾比·奎因 / 蔻碧·米納菲 / 安東尼·格拉索 / '
           '泰迪·庫盧卡 / 杰森·拉爾夫 / 奧利弗·普萊特...',
 'rating': '7.3',
 'title': '我想結(jié)束這一切',
 'url': 'https://movie.douban.com/subject/30129061/'}
2020-09-09 10:30:32 [scrapy.core.scraper] DEBUG: Scraped from <200 https://movie.douban.com/chart>
{'actors': '2020-09-03(中國大陸網(wǎng)絡(luò)) / 許君聰 / 劉奔 / 龔小鈞 / 楊蕊嘉 / 田璐 / 程漢 / 楊迪 / 鄧宛千 / '
           '張鈞涵 / 陳錚 / 中國大陸 / 周潤澤 / 84分鐘 / 劇情 / 喜劇 / 動作 / 朱子奇 Ziqi Zhu / 周潤澤 '
           'Runze Zhou / 漢語普通話',
 'rating': '6.0',
 'title': '東北往事:我叫劉海柱',
 'url': 'https://movie.douban.com/subject/35141706/'}
2020-09-09 10:30:32 [scrapy.core.scraper] DEBUG: Scraped from <200 https://movie.douban.com/chart>
{'actors': '2020-07-29(韓國) / 鄭雨盛 / 郭度沅 / 柳演錫 / 安古斯·麥克菲登 / 徐東甲 / 李南希 / 金重熙 / '
           '柳秀榮 / 李泰亨 / 申正根 / 廉晶雅 / 金容琳 / 金明坤 / 張光 / 李在勇 / 安內(nèi)相 / 孫鐘學(xué) / 白龍 / '
           '寇比·法蘭奇 / 斯科特·洛威爾 / 克里斯汀·達爾頓...',
 'rating': '5.8',
 'title': '鐵雨2:首腦峰會',
 'url': 'https://movie.douban.com/subject/30479644/'}
2020-09-09 10:30:32 [scrapy.core.scraper] DEBUG: Scraped from <200 https://movie.douban.com/chart>
{'actors': '2020-07-02(匈牙利) / 2020-08-25(加拿大網(wǎng)絡(luò)) / 2020-09-25(美國) / 杰西卡·查斯坦 / '
           '科林·法瑞爾 / 約翰·馬爾科維奇 / 吉娜·戴維斯 / 陳沖 / 戴安娜·西爾弗斯 / 科曼 / 艾恩·格拉法德 / '
           '杰絲·威克斯勒 / 埃夫卡·科瓦拉西尤斯 / 安妮·比薩比亞...',
 'rating': '4.9',
 'title': '艾娃',
 'url': 'https://movie.douban.com/subject/30289869/'}
2020-09-09 10:30:32 [scrapy.core.scraper] DEBUG: Scraped from <200 https://movie.douban.com/chart>
{'actors': '2020-06-24(韓國) / 劉亞仁 / 樸信惠 / 全裴修 / 李鉉旭 / 蘇熙靜 / 韓國 / 趙一亨 / 98分鐘 / '
           '#活著 / 動作 / 驚悚 / 災(zāi)難 / 趙一亨 Il Cho / 馬特·奈勒 Matt Naylor / 韓語',
 'rating': '5.6',
 'title': '#活著',
 'url': 'https://movie.douban.com/subject/34462775/'}
2020-09-09 10:30:32 [scrapy.core.scraper] DEBUG: Scraped from <200 https://movie.douban.com/chart>
{'actors': '2019-12-04(海南電影節(jié)) / 2020-07-27(上海電影節(jié)) / 2020-08-27(中國大陸網(wǎng)絡(luò)) / '
           '2021-03-25(中國大陸) / 張曉晨 / 隋詠良 / 上白 / 劉泳希 / 蕭子墨 / 趙健 / 中國大陸 / 李云波 / '
           '92分鐘 / 動作 / 懸疑 / 武俠 / 李云波 Yunbo Li / 漢語普通話',
 'rating': '5.1',
 'title': '無名狂',
 'url': 'https://movie.douban.com/subject/27131969/'}
2020-09-09 10:30:32 [scrapy.core.scraper] DEBUG: Scraped from <200 https://movie.douban.com/chart>
{'actors': '2020-08-14(美國) / 杰米·福克斯 / 約瑟夫·高登-萊維特 / 多米尼克·菲什巴克 / 羅德里戈·桑托羅 / '
           '考特尼·萬斯 / 艾米·蘭德克 / 機關(guān)槍凱利 / 泰特·弗萊徹 / 阿倫·馬爾多納多 / 安德烈·沃德·哈蒙德 / '
           '可亞娜·西蒙妮·辛普森 / C.J.勒布朗...',
 'rating': '5.6',
 'title': '超能計劃',
 'url': 'https://movie.douban.com/subject/30330875/'}
2020-09-09 10:30:32 [scrapy.core.scraper] DEBUG: Scraped from <200 https://movie.douban.com/chart>
{'actors': '2020-08-28(美國) / 麥茜·威廉姆斯 / 安雅·泰勒-喬伊 / 艾莉絲·布拉加 / 安東尼奧·班德拉斯 / 查理·希頓 '
           '/ 海皮·安德森 / 亨利·扎格 / 布魯·亨特 / 莎拉·貝納尼 / 美國 / 約什·布恩 / 98分鐘 / 新變種人 / 動作 '
           '/ 科幻 / 恐怖 / 約什·布恩...',
 'rating': None,
 'title': '新變種人',
 'url': 'https://movie.douban.com/subject/26389321/'}
2020-09-09 10:30:32 [scrapy.core.engine] INFO: Closing spider (finished)
2020-09-09 10:30:32 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 525,
 'downloader/request_count': 2,
 'downloader/request_method_count/GET': 2,
 'downloader/response_bytes': 10137,
 'downloader/response_count': 2,
 'downloader/response_status_count/200': 1,
 'downloader/response_status_count/403': 1,
 'finish_reason': 'finished',
 'finish_time': datetime.datetime(2020, 9, 9, 2, 30, 32, 810781),
 'item_scraped_count': 10,
 'log_count/DEBUG': 12,
 'log_count/INFO': 9,
 'response_received_count': 2,
 'robotstxt/request_count': 1,
 'robotstxt/response_count': 1,
 'robotstxt/response_status_count/403': 1,
 'scheduler/dequeued': 1,
 'scheduler/dequeued/memory': 1,
 'scheduler/enqueued': 1,
 'scheduler/enqueued/memory': 1,
 'start_time': datetime.datetime(2020, 9, 9, 2, 30, 32, 379758)}
2020-09-09 10:30:32 [scrapy.core.engine] INFO: Spider closed (finished)
5.6 爬取子頁面
  • 需要在爬蟲中使用scrapy.Request(url,callback)函數(shù)。
  • url可以傳遞子頁面的請求URL禾锤。
  • callback是用于解析的回調(diào)函數(shù)私股。
  • 首先在settings.py中加入request header:
USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
  • 修改items.py
>>>import scrapy

>>>class ProjectSampleItem(scrapy.Item):
>>>    # define the fields for your item here like:
>>>    url = scrapy.Field()
>>>    title = scrapy.Field()
>>>    director = scrapy.Field()
>>>    actors = scrapy.Field()
  • 修改爬蟲
>>># -*- coding: utf-8 -*-
>>>import scrapy
>>>from project_sample.items import ProjectSampleItem

>>>class DoubanSpider(scrapy.Spider):
>>>    name = 'douban'
>>>    allowed_domains = ['movie.douban.com']
>>>    start_urls = ['https://movie.douban.com/chart']

>>>    def parse(self, response):
>>>        # 爬取排行頁并跳轉(zhuǎn)爬取子頁面
>>>        films = response.css('.article .item')

>>>        for film in films:
>>>            next = film.css('a::attr(href)').extract_first()
>>>            url = response.urljoin(next)
>>>            yield scrapy.Request(url=url,callback=self.parse_sub)

>>>    def parse_sub(self,response):
>>>        # 爬取子頁面
>>>        item = ProjectSampleItem()
>>>        item['url'] = response.url
>>>        item['title'] = response.css('#content span::text').extract_first()
>>>        item['actors'] = response.css('.actor .attrs a::text').extract()
>>>        item['director'] = response.css('#info span .attrs a::text').extract_first()
>>>        yield item
  • 運行后成功爬取
D:\project_sample>scrapy crawl douban
... ...
2020-09-09 11:18:48 [scrapy.core.scraper] DEBUG: Scraped from <200 https://movie.douban.com/subject/34462775/>
{'actors': ['劉亞仁', '樸信惠'],
 'director': '趙一亨',
 'title': '#活著 #????',
 'url': 'https://movie.douban.com/subject/34462775/'}
2020-09-09 11:18:48 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://movie.douban.com/subject/27131969/> (referer: https://movie.douban.com/chart)
2020-09-09 11:18:48 [scrapy.core.scraper] DEBUG: Scraped from <200 https://movie.douban.com/subject/35141706/>
{'actors': ['許君聰', '劉奔', '龔小鈞', '楊蕊嘉', '田璐', '程漢', '楊迪', '鄧宛千', '張鈞涵', '陳錚'],
 'director': '周潤澤',
 'title': '東北往事:我叫劉海柱',
 'url': 'https://movie.douban.com/subject/35141706/'}
2020-09-09 11:18:48 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://movie.douban.com/subject/30129061/> (referer: https://movie.douban.com/chart)
2020-09-09 11:18:48 [scrapy.core.scraper] DEBUG: Scraped from <200 https://movie.douban.com/subject/30479644/>
{'actors': ['鄭雨盛',
            '郭度沅',
            '柳演錫',
            '安古斯·麥克菲登',
            '徐東甲',
            '李南希',
            '金重熙',
            '柳秀榮',
            '李泰亨',
            '申正根',
            '廉晶雅',
            '金容琳',
            '金明坤',
            '張光',
            '李在勇',
            '安內(nèi)相',
            '孫鐘學(xué)',
            '白龍',
            '寇比·法蘭奇',
            '斯科特·洛威爾',
            '克里斯汀·達爾頓',
            '金勝泰',
            '鄭鎮(zhèn)玨',
            '俞成柱',
            '金重基',
            '申秀妍',
            '沈熙燮'],
 'director': '楊宇碩',
 'title': '鐵雨2:首腦峰會 ???2: ????',
 'url': 'https://movie.douban.com/subject/30479644/'}
2020-09-09 11:18:48 [scrapy.core.scraper] DEBUG: Scraped from <200 https://movie.douban.com/subject/26389321/>
{'actors': ['麥茜·威廉姆斯',
            '安雅·泰勒-喬伊',
            '艾莉絲·布拉加',
            '安東尼奧·班德拉斯',
            '查理·希頓',
            '海皮·安德森',
            '亨利·扎格',
            '布魯·亨特',
            '莎拉·貝納尼',
            'Colbi Gannett',
            'Tony Saquett',
            'Thomas Kee',
            'Mickey Gilmore',
            'Jeffrey Corazzini'],
 'director': '約什·布恩',
 'title': '新變種人 The New Mutants',
 'url': 'https://movie.douban.com/subject/26389321/'}
2020-09-09 11:18:48 [scrapy.core.scraper] DEBUG: Scraped from <200 https://movie.douban.com/subject/30330875/>
{'actors': ['杰米·福克斯',
            '約瑟夫·高登-萊維特',
            '多米尼克·菲什巴克',
            '羅德里戈·桑托羅',
            '考特尼·萬斯',
            '艾米·蘭德克',
            '機關(guān)槍凱利',
            '泰特·弗萊徹',
            '阿倫·馬爾多納多',
            '安德烈·沃德·哈蒙德',
            '可亞娜·西蒙妮·辛普森',
            'C.J.勒布朗',
            'CG劉易斯',
            '約瑟夫·波利昆',
            'Jazzy De Lisser',
            '凱西·奈斯泰德',
            '珍妮特·羅斯·阮',
            '吉姆·克洛克',
            '喬恩·阿茲',
            '戴恩·羅茲',
            '懷爾德·韋恩',
            '賈斯汀·賈木什',
            '戈登·德克海默',
            '盧克·霍克斯',
            '彼得·詹梅斯',
            '托尼·查普曼·斯蒂爾',
            '約書亞·薩達索'],
 'director': '亨利·朱斯特',
 'title': '超能計劃 Project Power',
 'url': 'https://movie.douban.com/subject/30330875/'}
2020-09-09 11:18:48 [scrapy.core.scraper] DEBUG: Scraped from <200 https://movie.douban.com/subject/30289869/>
{'actors': ['杰西卡·查斯坦',
            '科林·法瑞爾',
            '約翰·馬爾科維奇',
            '吉娜·戴維斯',
            '陳沖',
            '戴安娜·西爾弗斯',
            '科曼',
            '艾恩·格拉法德',
            '杰絲·威克斯勒',
            '埃夫卡·科瓦拉西尤斯',
            '安妮·比薩比亞',
            '克里斯托弗·J·多米格',
            'Janelle Feigley',
            'Rob Lévesque',
            'Omar Khan',
            'Matt Lindquist',
            'Nadezhda Russo',
            'Lin Hultgren'],
 'director': '泰特·泰勒',
 'title': '艾娃 Ava',
 'url': 'https://movie.douban.com/subject/30289869/'}
2020-09-09 11:18:48 [scrapy.core.scraper] DEBUG: Scraped from <200 https://movie.douban.com/subject/27131969/>
{'actors': ['張曉晨', '隋詠良', '上白', '劉泳希', '蕭子墨', '趙健'],
 'director': '李云波',
 'title': '無名狂',
 'url': 'https://movie.douban.com/subject/27131969/'}
2020-09-09 11:18:48 [scrapy.core.scraper] DEBUG: Scraped from <200 https://movie.douban.com/subject/30129061/>
{'actors': ['杰西·普萊蒙',
            '杰西·巴克利',
            '托妮·科萊特',
            '大衛(wèi)·休里斯',
            '蓋伊·博伊德',
            '哈德莉·羅賓遜',
            '格斯·伯尼',
            '艾比·奎因',
            '蔻碧·米納菲',
            '安東尼·格拉索',
            '泰迪·庫盧卡',
            '杰森·拉爾夫',
            '奧利弗·普萊特',
            '弗雷德里克·沃丁',
            '瑞恩·斯蒂爾'],
 'director': '查理·考夫曼',
 'title': "我想結(jié)束這一切 I'm Thinking of Ending Things",
 'url': 'https://movie.douban.com/subject/30129061/'}
2020-09-09 11:18:48 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://movie.douban.com/subject/30299515/> (referer: https://movie.douban.com/chart)
2020-09-09 11:18:48 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://movie.douban.com/subject/26357307/> (referer: https://movie.douban.com/chart)
2020-09-09 11:18:48 [scrapy.core.scraper] DEBUG: Scraped from <200 https://movie.douban.com/subject/30299515/>
{'actors': ['姜棟元', '李貞賢', '權(quán)海驍', '李來', '金敏載', '具教煥', '金度允', '李藝媛'],
 'director': '延尚昊',
 'title': '釜山行2:半島 ???2-??',
 'url': 'https://movie.douban.com/subject/30299515/'}
2020-09-09 11:18:48 [scrapy.core.scraper] DEBUG: Scraped from <200 https://movie.douban.com/subject/26357307/>
{'actors': ['劉亦菲',
            '甄子丹',
            '鞏俐',
            '李連杰',
            '李截',
            '安柚鑫',
            '馬泰',
            '趙家玲',
            '鄭佩佩',
            '溫明娜',
            '曾曉童',
            '袁文忠',
            '唐辰瀛',
            '道阿·茂阿',
            '黃谷悅',
            '尼爾森·李',
            '李勛',
            '饒雪晶',
            '袁之正',
            '仁成外橋',
            '加里·揚',
            '歐文·鄺',
            '烏特卡什·安邦德卡爾',
            '錢姆·艾希勒珀拉',
            '大衛(wèi)·T·林',
            '詹森·鄭',
            'Jun Yu'],
 'director': '妮琪·卡羅',
 'title': '花木蘭 Mulan',
 'url': 'https://movie.douban.com/subject/26357307/'}
2020-09-09 11:18:48 [scrapy.core.engine] INFO: Closing spider (finished)
2020-09-09 11:18:48 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 4349,
 'downloader/request_count': 12,
 'downloader/request_method_count/GET': 12,
 'downloader/response_bytes': 244117,
 'downloader/response_count': 12,
 'downloader/response_status_count/200': 12,
 'finish_reason': 'finished',
 'finish_time': datetime.datetime(2020, 9, 9, 3, 18, 48, 623165),
 'item_scraped_count': 10,
 'log_count/DEBUG': 22,
 'log_count/INFO': 9,
 'request_depth_max': 1,
 'response_received_count': 12,
 'robotstxt/request_count': 1,
 'robotstxt/response_count': 1,
 'robotstxt/response_status_count/200': 1,
 'scheduler/dequeued': 11,
 'scheduler/dequeued/memory': 11,
 'scheduler/enqueued': 11,
 'scheduler/enqueued/memory': 11,
 'start_time': datetime.datetime(2020, 9, 9, 3, 18, 47, 281069)}
2020-09-09 11:18:48 [scrapy.core.engine] INFO: Spider closed (finished)
5.7 保存結(jié)果到文件
  • 使用Scrapy的Feed Exports功能可以直接將抓取結(jié)果導(dǎo)出文件, 命令行指令是scrapy crawl <spider> -o <filename>
  • 支持csv恩掷、xml倡鲸、pickle、marshal等多種格式黄娘,還支持ftp和s3等遠程輸出峭状。
D:\project_sample>scrapy crawl douban -o douban.json
... ...
D:\project_sample>type douban.json
[
{"url": "https://movie.douban.com/subject/30289869/", "title": "\u827e\u5a03 Ava", "actors": ["\u6770\u897f\u5361\u00b7\u67e5\u65af\u5766", "\u79d1\u6797\u00b7\u6cd5\u745e\u5c14", "\u7ea6\u7ff0\u00b7\u9a6c\u5c14\u79d1\u7ef4\u5947", "\u5409\u5a1c\u00b7\u6234\u7ef4\u65af", "\u9648\u51b2", "\u6234\u5b89\u5a1c\u00b7\u897f\u5c14\u5f17\u65af", "\u79d1\u66fc", "\u827e\u6069\u00b7\u683c\u62c9\u6cd5\u5fb7", "\u6770\u4e1d\u00b7\u5a01\u514b\u65af\u52d2", "\u57c3\u592b\u5361\u00b7\u79d1\u74e6\u62c9\u897f\u5c24\u65af", "\u5b89\u59ae\u00b7\u6bd4\u8428\u6bd4\u4e9a", "\u514b\u91cc\u65af\u6258\u5f17\u00b7J\u00b7\u591a\u7c73\u683c", "Janelle Feigley", "Rob L\u00e9vesque", "Omar Khan", "Matt Lindquist", "Nadezhda Russo", "Lin Hultgren"], "director": "\u6cf0\u7279\u00b7\u6cf0\u52d2"},
{"url": "https://movie.douban.com/subject/34462775/", "title": "#\u6d3b\u7740 #\uc0b4\uc544\uc788\ub2e4", "actors": ["\u5218\u4e9a\u4ec1", "\u6734\u4fe1\u60e0"], "director": "\u8d75\u4e00\u4ea8"},
{"url": "https://movie.douban.com/subject/30330875/", "title": "\u8d85\u80fd\u8ba1\u5212 Project Power", "actors": ["\u6770\u7c73\u00b7\u798f\u514b\u65af", "\u7ea6\u745f\u592b\u00b7\u9ad8\u767b-\u83b1\u7ef4\u7279", "\u591a\u7c73\u5c3c\u514b\u00b7\u83f2\u4ec0\u5df4\u514b", "\u7f57\u5fb7\u91cc\u6208\u00b7\u6851\u6258\u7f57", "\u8003\u7279\u5c3c\u00b7\u4e07\u65af", "\u827e\u7c73\u00b7\u5170\u5fb7\u514b", "\u673a\u5173\u67aa\u51ef\u5229", "\u6cf0\u7279\u00b7\u5f17\u83b1\u5f7b", "\u963f\u4f26\u00b7\u9a6c\u5c14\u591a\u7eb3\u591a", "\u5b89\u5fb7\u70c8\u00b7\u6c83\u5fb7\u00b7\u54c8\u8499\u5fb7", "\u53ef\u4e9a\u5a1c\u00b7\u897f\u8499\u59ae\u00b7\u8f9b\u666e\u68ee", "C.J.\u52d2\u5e03\u6717", "CG\u5218\u6613\u65af", "\u7ea6\u745f\u592b\u00b7\u6ce2\u5229\u6606", "Jazzy De Lisser", "\u51ef\u897f\u00b7\u5948\u65af\u6cf0\u5fb7", "\u73cd\u59ae\u7279\u00b7\u7f57\u65af\u00b7\u962e", "\u5409\u59c6\u00b7\u514b\u6d1b\u514b", "\u4e54\u6069\u00b7\u963f\u5179", "\u6234\u6069\u00b7\u7f57\u5179", "\u6000\u5c14\u5fb7\u00b7\u97e6\u6069", "\u8d3e\u65af\u6c40\u00b7\u8d3e\u6728\u4ec0", "\u6208\u767b\u00b7\u5fb7\u514b\u6d77\u9ed8", "\u5362\u514b\u00b7\u970d\u514b\u65af", "\u5f7c\u5f97\u00b7\u8a79\u6885\u65af", "\u6258\u5c3c\u00b7\u67e5\u666e\u66fc\u00b7\u65af\u8482\u5c14", "\u7ea6\u4e66\u4e9a\u00b7\u8428\u8fbe\u7d22"], "director": "\u4ea8\u5229\u00b7\u6731\u65af\u7279"},
{"url": "https://movie.douban.com/subject/35141706/", "title": "\u4e1c\u5317\u5f80\u4e8b\uff1a\u6211\u53eb\u5218\u6d77\u67f1", "actors": ["\u8bb8\u541b\u806a", "\u5218\u5954", "\u9f9a\u5c0f\u94a7", "\u6768\u854a\u5609", "\u7530\u7490", "\u7a0b\u6c49", "\u6768\u8fea", "\u9093\u5b9b\u5343", "\u5f20\u94a7\u6db5", "\u9648\u94ee"], "director": "\u5468\u6da6\u6cfd"},
{"url": "https://movie.douban.com/subject/27131969/", "title": "\u65e0\u540d\u72c2", "actors": ["\u5f20\u6653\u6668", "\u968b\u548f\u826f", "\u4e0a\u767d", "\u5218\u6cf3\u5e0c", "\u8427\u5b50\u58a8", "\u8d75\u5065"], "director": "\u674e\u4e91\u6ce2"},
{"url": "https://movie.douban.com/subject/26389321/", "title": "\u65b0\u53d8\u79cd\u4eba The New Mutants", "actors": ["\u9ea6\u831c\u00b7\u5a01\u5ec9\u59c6\u65af", "\u5b89\u96c5\u00b7\u6cf0\u52d2-\u4e54\u4f0a", "\u827e\u8389\u4e1d\u00b7\u5e03\u62c9\u52a0", "\u5b89\u4e1c\u5c3c\u5965\u00b7\u73ed\u5fb7\u62c9\u65af", "\u67e5\u7406\u00b7\u5e0c\u987f", "\u6d77\u76ae\u00b7\u5b89\u5fb7\u68ee", "\u4ea8\u5229\u00b7\u624e\u683c", "\u5e03\u9c81\u00b7\u4ea8\u7279", "\u838e\u62c9\u00b7\u8d1d\u7eb3\u5c3c", "Colbi Gannett", "Tony Saquett", "Thomas Kee", "Mickey Gilmore", "Jeffrey Corazzini"], "director": "\u7ea6\u4ec0\u00b7\u5e03\u6069"},
{"url": "https://movie.douban.com/subject/26357307/", "title": "\u82b1\u6728\u5170 Mulan", "actors": ["\u5218\u4ea6\u83f2", "\u7504\u5b50\u4e39", "\u5de9\u4fd0", "\u674e\u8fde\u6770", "\u674e\u622a", "\u5b89\u67da\u946b", "\u9a6c\u6cf0", "\u8d75\u5bb6\u73b2", "\u90d1\u4f69\u4f69", "\u6e29\u660e\u5a1c", "\u66fe\u6653\u7ae5", "\u8881\u6587\u5fe0", "\u5510\u8fb0\u701b", "\u9053\u963f\u00b7\u8302\u963f", "\u9ec4\u8c37\u60a6", "\u5c3c\u5c14\u68ee\u00b7\u674e", "\u674e\u52cb", "\u9976\u96ea\u6676", "\u8881\u4e4b\u6b63", "\u4ec1\u6210\u5916\u6865", "\u52a0\u91cc\u00b7\u626c", "\u6b27\u6587\u00b7\u909d", "\u4e4c\u7279\u5361\u4ec0\u00b7\u5b89\u90a6\u5fb7\u5361\u5c14", "\u94b1\u59c6\u00b7\u827e\u5e0c\u52d2\u73c0\u62c9", "\u5927\u536b\u00b7T\u00b7\u6797", "\u8a79\u68ee\u00b7\u90d1", "Jun Yu"], "director": "\u59ae\u742a\u00b7\u5361\u7f57"},
{"url": "https://movie.douban.com/subject/30479644/", "title": "\u94c1\u96e82\uff1a\u9996\u8111\u5cf0\u4f1a \uac15\ucca0\ube442: \uc815\uc0c1\ud68c\ub2f4", "actors": ["\u90d1\u96e8\u76db", "\u90ed\u5ea6\u6c85", "\u67f3\u6f14\u9521", "\u5b89\u53e4\u65af\u00b7\u9ea6\u514b\u83f2\u767b", "\u5f90\u4e1c\u7532", "\u674e\u5357\u5e0c", "\u91d1\u91cd\u7199", "\u67f3\u79c0\u8363", "\u674e\u6cf0\u4ea8", "\u7533\u6b63\u6839", "\u5ec9\u6676\u96c5", "\u91d1\u5bb9\u7433", "\u91d1\u660e\u5764", "\u5f20\u5149", "\u674e\u5728\u52c7", "\u5b89\u5185\u76f8", "\u5b59\u949f\u5b66", "\u767d\u9f99", "\u5bc7\u6bd4\u00b7\u6cd5\u5170\u5947", "\u65af\u79d1\u7279\u00b7\u6d1b\u5a01\u5c14", "\u514b\u91cc\u65af\u6c40\u00b7\u8fbe\u5c14\u987f", "\u91d1\u80dc\u6cf0", "\u90d1\u9547\u73cf", "\u4fde\u6210\u67f1", "\u91d1\u91cd\u57fa", "\u7533\u79c0\u598d", "\u6c88\u7199\u71ee"], "director": "\u6768\u5b87\u7855"},
{"url": "https://movie.douban.com/subject/30299515/", "title": "\u91dc\u5c71\u884c2\uff1a\u534a\u5c9b \ubd80\uc0b0\ud5892-\ubc18\ub3c4", "actors": ["\u59dc\u680b\u5143", "\u674e\u8d1e\u8d24", "\u6743\u6d77\u9a81", "\u674e\u6765", "\u91d1\u654f\u8f7d", "\u5177\u6559\u7115", "\u91d1\u5ea6\u5141", "\u674e\u827a\u5a9b"], "director": "\u5ef6\u5c1a\u660a"},
{"url": "https://movie.douban.com/subject/30129061/", "title": "\u6211\u60f3\u7ed3\u675f\u8fd9\u4e00\u5207 I'm Thinking of Ending Things", "actors": ["\u6770\u897f\u00b7\u666e\u83b1\u8499", "\u6770\u897f\u00b7\u5df4\u514b\u5229", "\u6258\u59ae\u00b7\u79d1\u83b1\u7279", "\u5927\u536b\u00b7\u4f11\u91cc\u65af", "\u76d6\u4f0a\u00b7\u535a\u4f0a\u5fb7", "\u54c8\u5fb7\u8389\u00b7\u7f57\u5bbe\u900a", "\u683c\u65af\u00b7\u4f2f\u5c3c", "\u827e\u6bd4\u00b7\u594e\u56e0", "\u853b\u78a7\u00b7\u7c73\u7eb3\u83f2", "\u5b89\u4e1c\u5c3c\u00b7\u683c\u62c9\u7d22", "\u6cf0\u8fea\u00b7\u5e93\u5362\u5361", "\u6770\u68ee\u00b7\u62c9\u5c14\u592b", "\u5965\u5229\u5f17\u00b7\u666e\u83b1\u7279", "\u5f17\u96f7\u5fb7\u91cc\u514b\u00b7\u6c83\u4e01", "\u745e\u6069\u00b7\u65af\u8482\u5c14"], "director": "\u67e5\u7406\u00b7\u8003\u592b\u66fc"}
]
  • 也可以通過在settings.py中自定義ItemExporter實現(xiàn)其它輸出。
設(shè)置 默認 功能
FEED_URI None 導(dǎo)出Feed的URI逼争。
啟用Feed導(dǎo)出時需要此設(shè)置优床。
FEED_FORMAT None 要用于Feed的序列化格式。
FEED_EXPORT_ENCODING None 要用于Feed的編碼誓焦。
FEED_EXPORT_FIELDS None 要導(dǎo)出的字段的列表胆敞。
FEED_STORE_EMPTY False 是否導(dǎo)出空Feed
FEED_STORAGES_BASE 包含Scrapy支持的內(nèi)置Feed存儲后端的字典。
FEED_EXPORTERS {} 包含您的項目支持的其他導(dǎo)出器的字典杂伟。
FEED_EXPORTERS_BASE 一個包含Scrapy支持的內(nèi)置feed導(dǎo)出器的dict移层。

參考資料



本文作者:大師兄(superkmi)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市赫粥,隨后出現(xiàn)的幾起案子幽钢,更是在濱河造成了極大的恐慌,老刑警劉巖傅是,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匪燕,死亡現(xiàn)場離奇詭異,居然都是意外死亡喧笔,警方通過查閱死者的電腦和手機帽驯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來书闸,“玉大人尼变,你說我怎么就攤上這事〗ⅲ” “怎么了嫌术?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長牌借。 經(jīng)常有香客問我度气,道長,這世上最難降的妖魔是什么膨报? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任磷籍,我火速辦了婚禮适荣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘院领。我一直安慰自己弛矛,他們只是感情好,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布比然。 她就那樣靜靜地躺著丈氓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪强法。 梳的紋絲不亂的頭發(fā)上万俗,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機與錄音拟烫,去河邊找鬼该编。 笑死,一個胖子當著我的面吹牛硕淑,可吹牛的內(nèi)容都是我干的课竣。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼置媳,長吁一口氣:“原來是場噩夢啊……” “哼于樟!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拇囊,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤迂曲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后寥袭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體路捧,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年传黄,在試婚紗的時候發(fā)現(xiàn)自己被綠了杰扫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡膘掰,死狀恐怖章姓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情识埋,我是刑警寧澤凡伊,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站窒舟,受9級特大地震影響系忙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜辜纲,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一笨觅、第九天 我趴在偏房一處隱蔽的房頂上張望拦耐。 院中可真熱鬧耕腾,春花似錦见剩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至狼纬,卻和暖如春羹呵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背疗琉。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工冈欢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人盈简。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓凑耻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親柠贤。 傳聞我的和親對象是個殘疾皇子香浩,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355