前言
爬蟲就是請求網站并提取數據的自動化程序,其中請求,提取,自動化是爬蟲的關鍵。Python作為一款出色的膠水語言自然成為了很多爬蟲愛好者的首選,而使用Python開發的爬蟲框架Scrapy當屬目前最熱門的解決方案之一。本文記錄了目前網絡上比較經典的Scrapy爬取豆瓣電影Top250榜單實踐過程,作為Python爬蟲框架Scrapy的入門案例。
Python爬蟲框架Scrapy入門與實踐之爬取豆瓣電影Top250榜單
更新歷史
2019年03月02日 - 初稿
閱讀原文 - https://wsgzao.github.io/post/scrapy/
擴展閱讀
Scrapy - https://scrapy.org/
什么是爬蟲?
網絡爬蟲(又被稱為網頁蜘蛛,網絡機器人,在 FOAF 社區中間,更經常的稱為網頁追逐者),是一種按照一定的規則,自動地抓取萬維網信息的程序或者腳本。另外一些不常使用的名字還有螞蟻、自動索引、模擬程序或者蠕蟲。
其實通俗的講就是通過程序去獲取 web 頁面上自己想要的數據,也就是自動抓取數據
爬蟲可以做什么?
你可以爬去妹子的圖片,爬取自己想看看的視頻。。等等你想要爬取的數據,只要你能通過瀏覽器訪問的數據都可以通過爬蟲獲取
爬蟲的本質是什么?
模擬瀏覽器打開網頁,獲取網頁中我們想要的那部分數據
瀏覽器打開網頁的過程:
當你在瀏覽器中輸入地址后,經過 DNS 服務器找到服務器主機,向服務器發送一個請求,服務器經過解析后發送給用戶瀏覽器結果,包括 html,js,css 等文件內容,瀏覽器解析出來最后呈現給用戶在瀏覽器上看到的結果
所以用戶看到的瀏覽器的結果就是由 HTML 代碼構成的,我們爬蟲就是為了獲取這些內容,通過分析和過濾 html 代碼,從中獲取我們想要資源(文本,圖片,視頻.....)
Python爬蟲的原理
爬蟲的基本流程
發起請求
通過 HTTP 庫向目標站點發起請求,也就是發送一個 Request,請求可以包含額外的 header 等信息,等待服務器響應
獲取響應內容
如果服務器能正常響應,會得到一個 Response,Response 的內容便是所要獲取的頁面內容,類型可能是 HTML,Json 字符串,二進制數據(圖片或者視頻)等類型
解析內容
得到的內容可能是 HTML, 可以用正則表達式,頁面解析庫進行解析,可能是 Json, 可以直接轉換為 Json 對象解析,可能是二進制數據,可以做保存或者進一步的處理
保存數據
保存形式多樣,可以存為文本,也可以保存到數據庫,或者保存特定格式的文件
什么是 Request,Response
瀏覽器發送消息給網址所在的服務器,這個過程就叫做 HTPP Request
服務器收到瀏覽器發送的消息后,能夠根據瀏覽器發送消息的內容,做相應的處理,然后把消息回傳給瀏覽器,這個過程就是 HTTP Response
瀏覽器收到服務器的 Response 信息后,會對信息進行相應的處理,然后展示
Request 中包含什么?
請求方式
主要有:GET/POST 兩種類型常用,另外還有 HEAD/PUT/DELETE/OPTIONS
GET 和 POST 的區別就是:請求的數據 GET 是在 url 中,POST 則是存放在頭部
GET: 向指定的資源發出 “顯示” 請求。使用 GET 方法應該只用在讀取數據,而不應當被用于產生 “副作用” 的操作中,例如在 Web Application 中。其中一個原因是 GET 可能會被網絡蜘蛛等隨意訪問
POST: 向指定資源提交數據,請求服務器進行處理(例如提交表單或者上傳文件)。數據被包含在請求本文中。這個請求可能會創建新的資源或修改現有資源,或二者皆有。
HEAD:與 GET 方法一樣,都是向服務器發出指定資源的請求。只不過服務器將不傳回資源的本文部分。它的好處在于,使用這個方法可以在不必傳輸全部內容的情況下,就可以獲取其中 “關于該資源的信息”(元信息或稱元數據)。
PUT:向指定資源位置上傳其最新內容。
OPTIONS:這個方法可使服務器傳回該資源所支持的所有 HTTP 請求方法。用 '*' 來代替資源名稱,向 Web 服務器發送 OPTIONS 請求,可以測試服務器功能是否正常運作。
DELETE:請求服務器刪除 Request-URI 所標識的資源。
請求 URL
URL,即統一資源定位符,也就是我們說的網址,統一資源定位符是對可以從互聯網上得到的資源的位置和訪問方法的一種簡潔的表示,是互聯網上標準資源的地址。互聯網上的每個文件都有一個唯一的 URL,它包含的信息指出文件的位置以及瀏覽器應該怎么處理它。
URL 的格式由三個部分組成:
第一部分是協議 (或稱為服務方式)。
第二部分是存有該資源的主機 IP 地址 (有時也包括端口號)。
第三部分是主機資源的具體地址,如目錄和文件名等。
爬蟲爬取數據時必須要有一個目標的 URL 才可以獲取數據,因此,它是爬蟲獲取數據的基本依據。
請求頭
包含請求時的頭部信息,如 User-Agent,Host,Cookies 等信息
請求體
請求是攜帶的數據,如提交表單數據時候的表單數據(POST)
Response 中包含了什么
所有 HTTP 響應的第一行都是狀態行,依次是當前 HTTP 版本號,3 位數字組成的狀態代碼,以及描述狀態的短語,彼此由空格分隔。
響應狀態
有多種響應狀態,如:200 代表成功,301 跳轉,404 找不到頁面,502 服務器錯誤
1xx 消息 —— 請求已被服務器接收,繼續處理
2xx 成功 —— 請求已成功被服務器接收、理解、并接受
3xx 重定向 —— 需要后續操作才能完成這一請求
4xx 請求錯誤 —— 請求含有詞法錯誤或者無法被執行
5xx 服務器錯誤 —— 服務器在處理某個正確請求時發生錯誤
常見代碼:
200 OK 請求成功
301 目標永久性轉移
302 目標暫時性轉移
400 Bad Request 客戶端請求有語法錯誤,不能被服務器所理解
401 Unauthorized 請求未經授權,這個狀態代碼必須和 WWW-Authenticate 報頭域一起使用
403 Forbidden 服務器收到請求,但是拒絕提供服務
404 Not Found 請求資源不存在,eg:輸入了錯誤的 URL
500 Internal Server Error 服務器發生不可預期的錯誤
503 Server Unavailable 服務器當前不能處理客戶端的請求,一段時間后可能恢復正常
響應頭
如內容類型,類型的長度,服務器信息,設置 Cookie
響應體
最主要的部分,包含請求資源的內容,如網頁 HTMl, 圖片,二進制數據等
能爬取什么樣的數據
網頁文本:如 HTML 文檔,Json 格式化文本等
圖片:獲取到的是二進制文件,保存為圖片格式
視頻:同樣是二進制文件
其他:只要請求到的,都可以獲取
如何解析數據
直接處理
Json 解析
正則表達式處理
BeautifulSoup 解析處理
PyQuery 解析處理
XPath 解析處理
關于抓取的頁面數據和瀏覽器里看到的不一樣的問題
出現這種情況是因為,很多網站中的數據都是通過 js,ajax 動態加載的,所以直接通過 get 請求獲取的頁面和瀏覽器顯示的不同。
如何解決 js 渲染的問題?
分析 ajax
Selenium/webdriver
Splash
PyV8,Ghost.py
怎樣保存數據
文本:純文本,Json,Xml 等
關系型數據庫:如 mysql,oracle,sql server 等結構化數據庫
非關系型數據庫:MongoDB,Redis 等 key-value 形式存儲
Scrapy簡介
Scrapy is an application framework for crawling web sites and extracting structured data which can be used for a wide range of useful applications, like data mining, information processing or historical archival.
Scrapy 是一個為了爬取網站數據,提取結構性數據而編寫的應用框架。 可以應用在包括數據挖掘,信息處理或存儲歷史數據等一系列的程序中。
Scrapy Tutorial
https://docs.scrapy.org/en/latest/intro/overview.html
Scrapy架構
Scrapy Engine
引擎負責控制數據流在系統中所有組件中流動,并在相應動作發生時觸發事件。 詳細內容查看下面的數據流 (Data Flow) 部分。
此組件相當于爬蟲的 “大腦”,是整個爬蟲的調度中心。
調度器 (Scheduler)
調度器從引擎接受 request 并將他們入隊,以便之后引擎請求他們時提供給引擎。
初始的爬取 URL 和后續在頁面中獲取的待爬取的 URL 將放入調度器中,等待爬取。同時調度器會自動去除重復的 URL(如果特定的 URL 不需要去重也可以通過設置實現,如 post 請求的 URL)
下載器 (Downloader)
下載器負責獲取頁面數據并提供給引擎,而后提供給 spider。
Spiders
Spider 是 Scrapy 用戶編寫用于分析 response 并提取 item (即獲取到的 item) 或額外跟進的 URL 的類。 每個 spider 負責處理一個特定 (或一些) 網站。
Item Pipeline
Item Pipeline 負責處理被 spider 提取出來的 item。典型的處理有清理、 驗證及持久化 (例如存取到數據庫中)。
當頁面被爬蟲解析所需的數據存入 Item 后,將被發送到項目管道 (Pipeline),并經過幾個特定的次序處理數據,最后存入本地文件或存入數據庫。
下載器中間件 (Downloader middlewares)
下載器中間件是在引擎及下載器之間的特定鉤子 (specific hook),處理 Downloader 傳遞給引擎的 response。 其提供了一個簡便的機制,通過插入自定義代碼來擴展 Scrapy 功能。
通過設置下載器中間件可以實現爬蟲自動更換 user-agent、IP 等功能。
Spider 中間件 (Spider middlewares)
Spider 中間件是在引擎及 Spider 之間的特定鉤子 (specific hook),處理 spider 的輸入 (response) 和輸出 (items 及 requests)。 其提供了一個簡便的機制,通過插入自定義代碼來擴展 Scrapy 功能。
數據流 (Data flow)
- 引擎打開一個網站 (open a domain),找到處理該網站的 Spider 并向該 spider 請求第一個要爬取的 URL (s)。
- 引擎從 Spider 中獲取到第一個要爬取的 URL 并在調度器 (Scheduler) 以 Request 調度。
- 引擎向調度器請求下一個要爬取的 URL。
- 調度器返回下一個要爬取的 URL 給引擎,引擎將 URL 通過下載中間件 (請求 (request) 方向) 轉發給下載器 (Downloader)。
- 一旦頁面下載完畢,下載器生成一個該頁面的 Response,并將其通過下載中間件 (返回 (response) 方向) 發送給引擎。
- 引擎從下載器中接收到 Response 并通過 Spider 中間件 (輸入方向) 發送給 Spider 處理。
- Spider 處理 Response 并返回爬取到的 Item 及 (跟進的) 新的 Request 給引擎。
- 引擎將 (Spider 返回的) 爬取到的 Item 給 Item Pipeline,將 (Spider 返回的) Request 給調度器。
- (從第二步) 重復直到調度器中沒有更多地 request,引擎關閉該網站。
Scrapy 爬取豆瓣電影 Top250 榜單
https://docs.scrapy.org/en/latest/intro/tutorial.html
工具和環境
- 語言: Python 3.7
- IDE: Pycharm
- 爬蟲框架:Scrapy
- 瀏覽器: Google Chrome
- 瀏覽器插件: XPath Helper
創建項目
在開始爬取之前,首先要創建一個新的 Scrapy 項目。這里以爬取豆瓣電影 Top250 為例,進入你打算存儲代碼的目錄中,運行下列命令:
scrapy startproject douban
該命令將會創建包含下列內容的 douban 目錄:
douban
|-- __init__.py
|-- __pycache__
| |-- __init__.cpython-37.pyc
| |-- items.cpython-37.pyc
| |-- pipelines.cpython-37.pyc
| `-- settings.cpython-37.pyc
|-- items.py
|-- middlewares.py
|-- pipelines.py
|-- settings.py
`-- spiders
|-- __init__.py
|-- __pycache__
| |-- __init__.cpython-37.pyc
| `-- douban_spider.cpython-37.pyc
`-- douban_spider.py
3 directories, 13 files
這些文件分別是:
- scrapy.cfg: 項目的配置文件。
- douban/: 該項目的 python 模塊。之后您將在此加入代碼。
- douban/items.py: 項目中的 item 文件。定義我們所要爬取的信息的相關屬性。
- douban/pipelines.py: 項目中的 pipelines 文件。當數據被爬蟲爬取下來后,它會被發送到 item pipelines 中,每個 item pipelines 組件(有時稱為 “項目管道”)是一個實現簡單方法的 Python 類。他們收到一個項目并對其執行操作,還決定該項目是否應該繼續通過管道或被丟棄并且不再被處理。
- douban/settings.py: 項目的設置文件。
- douban/spiders/: 放置 spider 代碼的目錄。
觀察頁面結構
首先我們打開豆瓣電影 TOP250 的頁面,通過觀察頁面決定讓我們的爬蟲獲取每一部電影的排名、電影名稱、評分和評分的人數。
https://movie.douban.com/top250
運行Chrome F12開發者工具,使用選取工具選取整個電影的信息,可以發現,所有的信息都是放在單獨的一個 li 標簽中的,而且在 li 下還有一個 class 為 item 的 div 包裹著所有的信息。
<li>
<div class="item">
<div class="pic">
<em class="">1</em>
<a >
<img width="100" alt="肖申克的救贖" src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.webp" class="">
</a>
</div>
<div class="info">
<div class="hd">
<a class="">
<span class="title"> 肖申克的救贖</span>
<span class="title"> / The Shawshank Redemption</span>
<span class="other"> / 月黑高飛 (港) / 刺激 1995 (臺)</span>
</a>
<span class="playable">[可播放]</span>
</div>
<div class="bd">
<p class="">
導演:弗蘭克?德拉邦特 Frank Darabont 主演:蒂姆?羅賓斯 Tim Robbins /...<br>
1994 / 美國 / 犯罪 劇情
</p>
<div class="star">
<span class="rating5-t"></span>
<span class="rating_num" property="v:average">9.6</span>
<span property="v:best" content="10.0"></span>
<span>1338863 人評價</span>
</div>
<p class="quote">
<span class="inq">希望讓人自由。</span>
</p>
</div>
</div>
</div>
</li>
聲明Item
什么是 Items 呢?官方文檔 Items 定義如下:
爬取的主要目標就是從非結構性的數據源提取結構性數據,例如網頁。 Scrapy spider 可以以 python 的 dict 來返回提取的數據。雖然 dict 很方便,并且用起來也熟悉,但是其缺少結構性,容易打錯字段的名字或者返回不一致的數據,尤其在具有多個 spider 的大項目中。
為了定義常用的輸出數據,Scrapy 提供了 Item 類。 Item 對象是種簡單的容器,保存了爬取到得數據。 其提供了 類似于詞典 (dictionary-like) 的 API 以及用于聲明可用字段的簡單語法。
許多 Scrapy 組件使用了 Item 提供的額外信息: exporter 根據 Item 聲明的字段來導出數據、 序列化可以通過 Item 字段的元數據 (metadata) 來定義、 trackref 追蹤 Item 實例來幫助尋找內存泄露 (see 使用 trackref 調試內存泄露) 等等。
Item 使用簡單的 class 定義語法以及 Field 對象來聲明。我們打開 spider 目錄下的 items.py 文件寫入下列代碼聲明 Item:
# -*- 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 DoubanItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
serial_number = scrapy.Field()
movie_name = scrapy.Field()
introduce = scrapy.Field()
star = scrapy.Field()
evaluate = scrapy.Field()
describe = scrapy.Field()
編寫爬蟲程序
在編寫代碼前我們可以通過修改settings.py文件調整user-agent和其它參數
# -*- coding: utf-8 -*-
# Scrapy settings for douban project
#
# For simplicity, this file contains only settings considered important or
# commonly used. You can find more settings consulting the documentation:
#
# https://doc.scrapy.org/en/latest/topics/settings.html
# https://doc.scrapy.org/en/latest/topics/downloader-middleware.html
# https://doc.scrapy.org/en/latest/topics/spider-middleware.html
BOT_NAME = 'douban'
SPIDER_MODULES = ['douban.spiders']
NEWSPIDER_MODULE = 'douban.spiders'
# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
# Configure a delay for requests for the same website (default: 0)
# See https://doc.scrapy.org/en/latest/topics/settings.html#download-delay
# See also autothrottle settings and docs
DOWNLOAD_DELAY = 0.5
# Configure item pipelines
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
'douban.pipelines.DoubanPipeline': 300,
}
mongo_host = '127.0.0.1'
mongo_port = 27017
mongo_db_name = 'douban'
mongo_db_collection = 'douban_movie'
在 spiders 文件夾下創建 douban_spider.py 文件
在我們編寫爬蟲之前,先了解一下 scrapy 的爬取機制,scrapy 提取數據有自己的一套機制。它們被稱作選擇器 (seletors),因為他們通過特定的 XPath 或者 CSS 表達式來 “選擇” HTML 文件中的某個部分。
Xpath 學習教程
http://www.w3school.com.cn/xpath/index.asp
XPath Helper
https://chrome.google.com/webstore/detail/xpath-helper/hgimnogjllphhhkhlmebbmlgjoejdpjl
Scrapy xpath-tutorial
https://doc.scrapy.org/en/xpath-tutorial/topics/xpath-tutorial.html
# -*- coding: utf-8 -*-
import scrapy
from douban.items import DoubanItem
class DoubanSpiderSpider(scrapy.Spider):
name = 'douban_spider'
allowed_domains = ['movie.douban.com']
start_urls = ['https://movie.douban.com/top250']
def parse(self, response):
movie_list = response.xpath("http://div[@class='article']//ol[@class='grid_view']/li")
for i_item in movie_list:
douban_item = DoubanItem()
douban_item['serial_number'] = i_item.xpath(".//div[@class='item']//em/text()").extract_first()
douban_item['movie_name'] = i_item.xpath(".//div[@class='info']/div[@class='hd']/a/span[1]/text()").extract_first()
content = i_item.xpath(".//div[@class='info']//div[@class='bd']/p[1]/text()").extract()
for i_content in content:
content_s = "".join(i_content.split())
douban_item['introduce'] = content_s
douban_item['star'] = i_item.xpath(".//span[@class='rating_num']/text()").extract_first()
douban_item['evaluate'] = i_item.xpath(".//div[@class='star']//span[4]/text()").extract_first()
douban_item['describe'] = i_item.xpath(".//p[@class='quote']//span/text()").extract_first()
yield douban_item
next_link = response.xpath("http://span[@class='next']/link/@href").extract()
if next_link:
next_link = next_link[0]
yield scrapy.Request("https://movie.douban.com/top250"+next_link,callback=self.parse)
自動翻頁
先別急著高興,你難道沒有發現一個問題嗎?這樣的話我們還是只能爬到當前頁的 25 個電影的內容。怎么樣才能把剩下的也一起爬下來呢?
實現自動翻頁一般有兩種方法:
- 在頁面中找到下一頁的地址;
- 自己根據 URL 的變化規律構造所有頁面地址。
一般情況下我們使用第一種方法,第二種方法適用于頁面的下一頁地址為 JS 加載的情況。這次我們只說第一種方法。
首先利用 Chrome 瀏覽器的開發者工具找到下一頁的地址,然后在解析該頁面時獲取下一頁的地址并將地址交給調度器 (Scheduler)
運行爬蟲
scrapy crawl douban_spider
scrapy crawl douban_spider -o douban.csv
(venv) wangao@wangao-MAC ~/Documents/git/wangao/python3/scrapy/douban python -V
Python 3.7.1
(venv) wangao@wangao-MAC ~/Documents/git/wangao/python3/scrapy/douban scrapy crawl douban_spider -o douban.csv
2019-03-02 15:37:56 [scrapy.utils.log] INFO: Scrapy 1.5.1 started (bot: douban)
2019-03-02 15:37:56 [scrapy.utils.log] INFO: Versions: lxml 4.2.5.0, libxml2 2.9.8, cssselect 1.0.3, parsel 1.5.1, w3lib 1.19.0, Twisted 18.9.0, Python 3.7.1 (default, Nov 6 2018, 18:46:03) - [Clang 10.0.0 (clang-1000.11.45.5)], pyOpenSSL 18.0.0 (OpenSSL 1.1.0j 20 Nov 2018), cryptography 2.4.2, Platform Darwin-18.2.0-x86_64-i386-64bit
2019-03-02 15:37:56 [scrapy.crawler] INFO: Overridden settings: {'BOT_NAME': 'douban', 'DOWNLOAD_DELAY': 0.5, 'FEED_FORMAT': 'csv', 'FEED_URI': 'douban.csv', 'NEWSPIDER_MODULE': 'douban.spiders', 'SPIDER_MODULES': ['douban.spiders'], 'USER_AGENT': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'}
2019-03-02 15:37:56 [scrapy.middleware] INFO: Enabled extensions:
['scrapy.extensions.corestats.CoreStats',
'scrapy.extensions.telnet.TelnetConsole',
'scrapy.extensions.memusage.MemoryUsage',
'scrapy.extensions.feedexport.FeedExporter',
'scrapy.extensions.logstats.LogStats']
2019-03-02 15:37:56 [scrapy.middleware] INFO: Enabled downloader middlewares:
['scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware',
'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware',
'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware',
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware',
'scrapy.downloadermiddlewares.retry.RetryMiddleware',
'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware',
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware',
'scrapy.downloadermiddlewares.redirect.RedirectMiddleware',
'scrapy.downloadermiddlewares.cookies.CookiesMiddleware',
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware',
'scrapy.downloadermiddlewares.stats.DownloaderStats']
2019-03-02 15:37:56 [scrapy.middleware] INFO: Enabled spider middlewares:
['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware',
'scrapy.spidermiddlewares.offsite.OffsiteMiddleware',
'scrapy.spidermiddlewares.referer.RefererMiddleware',
'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware',
'scrapy.spidermiddlewares.depth.DepthMiddleware']
2019-03-02 15:37:56 [scrapy.middleware] INFO: Enabled item pipelines:
['douban.pipelines.DoubanPipeline']
2019-03-02 15:37:56 [scrapy.core.engine] INFO: Spider opened
2019-03-02 15:37:56 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2019-03-02 15:37:56 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
^C2019-03-02 15:37:56 [scrapy.crawler] INFO: Received SIGINT, shutting down gracefully. Send again to force
2019-03-02 15:37:56 [scrapy.core.engine] INFO: Closing spider (shutdown)
2019-03-02 15:37:58 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://movie.douban.com/top250> (referer: None)
2019-03-02 15:37:58 [scrapy.core.scraper] DEBUG: Scraped from <200 https://movie.douban.com/top250>
{'describe': '希望讓人自由。',
'evaluate': '1338863人評價',
'introduce': '1994/美國/犯罪劇情',
'movie_name': '肖申克的救贖',
'serial_number': '1',
'star': '9.6'}
2019-03-02 15:37:58 [scrapy.core.scraper] DEBUG: Scraped from <200 https://movie.douban.com/top250>
{'describe': '風華絕代。',
'evaluate': '989216人評價',
'introduce': '1993/中國大陸香港/劇情愛情同性',
'movie_name': '霸王別姬',
'serial_number': '2',
'star': '9.6'}
2019-03-02 15:37:58 [scrapy.core.scraper] DEBUG: Scraped from <200 https://movie.douban.com/top250>
{'describe': '怪蜀黍和小蘿莉不得不說的故事。',
'evaluate': '1225142人評價',
'introduce': '1994/法國/劇情動作犯罪',
'movie_name': '這個殺手不太冷',
'serial_number': '3',
'star': '9.4'}
2019-03-02 15:37:58 [scrapy.core.scraper] DEBUG: Scraped from <200 https://movie.douban.com/top250>
{'describe': '一部美國近現代史。',
'evaluate': '1054616人評價',
'introduce': '1994/美國/劇情愛情',
'movie_name': '阿甘正傳',
'serial_number': '4',
'star': '9.4'}
describe,evaluate,introduce,movie_name,serial_number,star
希望讓人自由。,1338863人評價,1994/美國/犯罪劇情,肖申克的救贖,1,9.6
風華絕代。,989216人評價,1993/中國大陸香港/劇情愛情同性,霸王別姬,2,9.6
怪蜀黍和小蘿莉不得不說的故事。,1224747人評價,1994/法國/劇情動作犯罪,這個殺手不太冷,3,9.4
一部美國近現代史。,1054616人評價,1994/美國/劇情愛情,阿甘正傳,4,9.4
最美的謊言。,617064人評價,1997/意大利/劇情喜劇愛情戰爭,美麗人生,5,9.5
失去的才是永恒的。 ,993900人評價,1997/美國/劇情愛情災難,泰坦尼克號,6,9.3
最好的宮崎駿,最好的久石讓。 ,981959人評價,2001/日本/劇情動畫奇幻,千與千尋,7,9.3
拯救一個人,就是拯救整個世界。,550815人評價,1993/美國/劇情歷史戰爭,辛德勒的名單,8,9.5
諾蘭給了我們一場無法盜取的夢。,1067442人評價,2010/美國英國/劇情科幻懸疑冒險,盜夢空間,9,9.3
結尾
Scrapy 爬蟲框架掌握好可以事半功倍,但是遇到簡單的需求未必需要使用框架去解決。關于IP代理中間件,寫入數據庫,Web前臺展示等需求都是非常值得延伸的內容,希望大家通過爬蟲豆瓣電影Top250這個入門項目開個學習的好頭。