大師兄的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之前冗美,需要先安裝依賴庫魔种,之后再安裝Scrapy
pip 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_domains
和start_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移层。 |
參考資料
- https://blog.csdn.net/u010138758/article/details/80152151 J-Ombudsman
- https://www.cnblogs.com/zhuluqing/p/8832205.html moisiet
- https://www.runoob.com 菜鳥教程
- http://www.tulingxueyuan.com/ 北京圖靈學(xué)院
- http://www.imooc.com/article/19184?block_id=tuijian_wz#child_5_1 兩點水
- https://blog.csdn.net/weixin_44213550/article/details/91346411 python老菜鳥
- https://realpython.com/python-string-formatting/ Dan Bader
- https://www.liaoxuefeng.com/ 廖雪峰
- https://blog.csdn.net/Gnewocean/article/details/85319590 新海說
- https://www.cnblogs.com/Nicholas0707/p/9021672.html Nicholas
- https://www.cnblogs.com/dalaoban/p/9331113.html 超天大圣
- https://blog.csdn.net/zhubao124/article/details/81662775 zhubao124
- https://blog.csdn.net/z59d8m6e40/article/details/72871485 z59d8m6e40
- http://www.reibang.com/p/2b04f5eb5785 MR_ChanHwang
- 《Python學(xué)習(xí)手冊》Mark Lutz
- 《Python編程 從入門到實踐》Eric Matthes
- 《Python3網(wǎng)絡(luò)爬蟲開發(fā)實戰(zhàn)》崔慶才
本文作者:大師兄(superkmi)