Python版本管理:pyenv和pyenv-virtualenv
Scrapy爬蟲入門教程一 安裝和基本使用
Scrapy爬蟲入門教程二 官方提供Demo
Scrapy爬蟲入門教程三 命令行工具介紹和示例
Scrapy爬蟲入門教程四 Spider(爬蟲)
Scrapy爬蟲入門教程五 Selectors(選擇器)
Scrapy爬蟲入門教程六 Items(項(xiàng)目)
Scrapy爬蟲入門教程七 Item Loaders(項(xiàng)目加載器)
Scrapy爬蟲入門教程八 交互式 shell 方便調(diào)試
Scrapy爬蟲入門教程九 Item Pipeline(項(xiàng)目管道)
Scrapy爬蟲入門教程十 Feed exports(導(dǎo)出文件)
Scrapy爬蟲入門教程十一 Request和Response(請(qǐng)求和響應(yīng))
Scrapy爬蟲入門教程十二 Link Extractors(鏈接提取器)
開發(fā)環(huán)境:
Python 3.6.0 版本
(當(dāng)前最新)
Scrapy 1.3.2 版本
(當(dāng)前最新)
[toc]
命令行工具
Scrapy是通過scrapy命令行工具來控制的,當(dāng)前最新版本0.10
配置設(shè)置
Scrapy將scrapy.cfg在標(biāo)準(zhǔn)位置的ini樣式文件中查找配置參數(shù):
系統(tǒng)默認(rèn)配置:
/etc/scrapy.cfg
或c:\scrapy\scrapy.cfg
全局配置文件:
~/.config/scrapy.cfg
($XDG_CONFIG_HOME
)和~/.scrapy.cfg
($HOME
)用于項(xiàng)目配置文件:
scrapy.cfg
在scrapy項(xiàng)目的根目錄中。
來自這些文件的設(shè)置將按照所列的優(yōu)先順序進(jìn)行合并:用戶定義的值比系統(tǒng)級(jí)默認(rèn)值具有更高的優(yōu)先級(jí),項(xiàng)目范圍的設(shè)置將在定義時(shí)覆蓋所有其他設(shè)置。
Scrapy也理解,并且可以通過配置一些環(huán)境變量。目前這些是:
SCRAPY_SETTINGS_MODULE(請(qǐng)參閱指定設(shè)置)
SCRAPY_PROJECT
SCRAPY_PYTHON_SHELL(見Scrapy shell)
Scrapy項(xiàng)目的默認(rèn)結(jié)構(gòu)
在深入了解命令行工具及其子命令之前,讓我們先了解Scrapy項(xiàng)目的目錄結(jié)構(gòu)。
雖然可以修改,但所有Scrapy項(xiàng)目默認(rèn)情況下具有相同的文件結(jié)構(gòu),類似于:
scrapy.cfg
myproject/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
spider1.py
spider2.py
...
其中,目錄scrapy.cfg文件位于項(xiàng)目的根目錄。該文件包含定義項(xiàng)目設(shè)置的python模塊的名稱。這里是一個(gè)例子:
[settings]
default = myproject.settings
使用scrapy工具
您可以從運(yùn)行沒有參數(shù)的Scrapy工具開始,它將打印一些使用幫助和可用的命令:
直接在項(xiàng)目根目錄的命令行輸入: scrapy
會(huì)得到如下提示:
Scrapy 1.3.2 - no active project
Usage:
scrapy <command> [options] [args]
Available commands:
bench Run quick benchmark test
commands
fetch Fetch a URL using the Scrapy downloader
genspider Generate new spider using pre-defined templates
runspider Run a self-contained spider (without creating a project)
settings Get settings values
shell Interactive scraping console
startproject Create new project
version Print Scrapy version
view Open URL in browser, as seen by Scrapy
[ more ] More commands available when run from project directory
Use "scrapy <command> -h" to see more info about a command
創(chuàng)建項(xiàng)目
你通常用這個(gè)scrapy工具做的第一件事是創(chuàng)建你的Scrapy項(xiàng)目:
scrapy startproject myproject [ project_dir ]
這將在該project_dir目錄下創(chuàng)建一個(gè)Scrapy項(xiàng)目。如果project_dir沒有指定,project_dir將會(huì)和myproject名稱一樣。
接下來,進(jìn)入新的項(xiàng)目目錄:
cd project_dir
您可以使用scrapy命令從那里管理和控制您的項(xiàng)目。
控制項(xiàng)目
您可以使用scrapy項(xiàng)目?jī)?nèi)部的工具來控制和管理它們。
大家不要著急一下子把所以東西都介紹到,具體細(xì)節(jié)后面都會(huì)寫到。
例如,要?jiǎng)?chuàng)建一個(gè)新的爬蟲:
scrapy genspider mydomain mydomain.com
通過上述命令創(chuàng)建了一個(gè)spider name為mydomain的爬蟲,start_urls為http://www.cnblogs.com/的爬蟲。
一些Scrapy命令(如crawl)必須從Scrapy項(xiàng)目?jī)?nèi)部運(yùn)行。請(qǐng)參閱命令參考下文中的哪些命令必須從內(nèi)部項(xiàng)目運(yùn)行的詳細(xì)信息。
還要記住,一些命令在從項(xiàng)目中運(yùn)行時(shí)可能有稍微不同的行為。例如,user_agent如果正在獲取的URL與某個(gè)特定的爬蟲相關(guān)聯(lián),fetch命令將使用爬蟲覆蓋的行為(例如屬性覆蓋用戶代理)。這是有意的,因?yàn)樵揻etch命令用于檢查爬蟲程序如何下載頁(yè)面。
常用的工具命令
此部分包含可用內(nèi)置命令的列表,其中包含描述和一些用法示例。記住,您可以隨時(shí)通過運(yùn)行以下命令獲得有關(guān)每個(gè)命令的更多信息:
scrapy <command> -h
你可以看到所有可用的命令:
scrapy -h
上面兩種命令,它們只能在Scrapy項(xiàng)目?jī)?nèi)部工作,也可以全局命令的情況下工作(但它們可能會(huì)被項(xiàng)目?jī)?nèi)的配置覆蓋)。
全局命令:
[startproject]
[genspider]
[settings]
[runspider]
[shell]
[fetch]
[view]
[version]
僅項(xiàng)目命令:
[crawl]
[check]
[list]
[edit]
[parse]
[bench]
startproject
語(yǔ)法:
scrapy startproject <project_name> [project_dir]
在目錄project_name下創(chuàng)建一個(gè)名為的Scrapy項(xiàng)目project_dir 。如果project_dir沒有指定,project_dir將會(huì)和myproject名稱一樣。
用法示例:
$ scrapy startproject myproject
genspider
語(yǔ)法:
scrapy genspider [-t template] <name> <domain>
在當(dāng)前文件夾或當(dāng)前項(xiàng)目的spiders文件夾中創(chuàng)建一個(gè)新的爬蟲,如果從項(xiàng)目中調(diào)用。該<name>參數(shù)設(shè)置為爬蟲的name,而<domain>用于生成allowed_domains和start_urls爬蟲的屬性。
用法示例:
$ scrapy genspider -l
Available templates:
basic
crawl
csvfeed
xmlfeed
$ scrapy genspider example example.com
Created spider 'example' using template 'basic'
$ scrapy genspider -t crawl scrapyorg scrapy.org
Created spider 'scrapyorg' using template 'crawl'
這只是一個(gè)方便的快捷命令,用于創(chuàng)建基于預(yù)定義模板的爬蟲,但當(dāng)然不是唯一的方式來創(chuàng)建爬蟲。您可以自己創(chuàng)建爬蟲源代碼文件,而不是使用此命令。
crawl
語(yǔ)法:
scrapy crawl <spider>
使用爬蟲開始爬行。
用法示例:
$ scrapy crawl myspider
[ ... myspider starts crawling ... ]
check
語(yǔ)法:
scrapy check [-l] <spider>
用法示例:
$ scrapy check -l
first_spider
* parse
* parse_item
second_spider
* parse
* parse_item
$ scrapy check
[FAILED] first_spider:parse_item
>>> 'RetailPricex' field is missing
[FAILED] first_spider:parse
>>> Returned 92 requests, expected 0..4
list
語(yǔ)法:
scrapy list
列出當(dāng)前項(xiàng)目中的所有可用爬蟲。每行輸出一個(gè)爬蟲。
用法示例:
$ scrapy列表
spider1
spider2
edit
語(yǔ)法:
scrapy edit <spider>
此命令僅作為最常見情況的方便快捷方式提供,開發(fā)人員當(dāng)然可以選擇任何工具或IDE來編寫和調(diào)試他的爬蟲。
用法示例:
$ scrapy edit spider1
fetch
語(yǔ)法:
scrapy fetch <url>
使用Scrapy下載器下載給定的URL,并將內(nèi)容寫入標(biāo)準(zhǔn)輸出。
這個(gè)命令的有趣的事情是它獲取爬蟲下載它的頁(yè)面。例如,如果爬蟲有一個(gè)USER_AGENT 屬性覆蓋用戶代理,它將使用那個(gè)。
所以這個(gè)命令可以用來“看”你的爬蟲如何獲取一個(gè)頁(yè)面。
如果在項(xiàng)目外部使用,將不應(yīng)用特定的每個(gè)爬蟲行為,它將只使用默認(rèn)的Scrapy下載器設(shè)置。
支持的選項(xiàng):
--spider=SPIDER:繞過爬蟲自動(dòng)檢測(cè)和強(qiáng)制使用特定的爬蟲
--headers:打印響應(yīng)的HTTP頭,而不是響應(yīng)的正文
--no-redirect:不遵循HTTP 3xx重定向(默認(rèn)是遵循它們)
用法示例:
$ scrapy fetch --nolog http://www.example.com/some/page.html
[ ... html content here ... ]
$ scrapy fetch --nolog --headers http://www.example.com/
{'Accept-Ranges': ['bytes'],
'Age': ['1263 '],
'Connection': ['close '],
'Content-Length': ['596'],
'Content-Type': ['text/html; charset=UTF-8'],
'Date': ['Wed, 18 Aug 2010 23:59:46 GMT'],
'Etag': ['"573c1-254-48c9c87349680"'],
'Last-Modified': ['Fri, 30 Jul 2010 15:30:18 GMT'],
'Server': ['Apache/2.2.3 (CentOS)']}
view
語(yǔ)法:
scrapy view <url>
在瀏覽器中打開給定的URL,因?yàn)槟腟crapy爬蟲會(huì)“看到”它。有時(shí),爬蟲會(huì)看到與普通用戶不同的網(wǎng)頁(yè),因此可以用來檢查爬蟲“看到了什么”并確認(rèn)它是您期望的。
支持的選項(xiàng):
--spider=SPIDER:繞過爬蟲自動(dòng)檢測(cè)和強(qiáng)制使用特定的爬蟲
--no-redirect:不遵循HTTP 3xx重定向(默認(rèn)是遵循它們)
用法示例:
$ scrapy view http://www.example.com/some/page.html
[ ... browser starts ... ]
shell
語(yǔ)法:
scrapy shell [url]
啟動(dòng)給定URL(如果給定)的Scrapy shell,如果沒有給出URL,則為空。還支持UNIX樣式的本地文件路徑,相對(duì)于 ./或../前綴或絕對(duì)文件路徑。有關(guān)詳細(xì)信息,請(qǐng)參閱Scrapy shell。
支持的選項(xiàng):
--spider=SPIDER:繞過爬蟲自動(dòng)檢測(cè)和強(qiáng)制使用特定的爬蟲
-c code:評(píng)估shell中的代碼,打印結(jié)果并退出
--no-redirect:不遵循HTTP 3xx重定向(默認(rèn)是遵循它們); 這只影響你可以在命令行上作為參數(shù)傳遞的URL; 一旦你在shell中,fetch(url)默認(rèn)情況下仍然會(huì)遵循HTTP重定向。
用法示例:
$ scrapy shell http://www.example.com/some/page.html
[ ... scrapy shell starts ... ]
$ scrapy shell --nolog http://www.example.com/ -c '(response.status, response.url)'
(200, 'http://www.example.com/')
# shell follows HTTP redirects by default
$ scrapy shell --nolog http://httpbin.org/redirect-to?url=http%3A%2F%2Fexample.com%2F -c '(response.status, response.url)'
(200, 'http://example.com/')
# you can disable this with --no-redirect
# (only for the URL passed as command line argument)
$ scrapy shell --no-redirect --nolog http://httpbin.org/redirect-to?url=http%3A%2F%2Fexample.com%2F -c '(response.status, response.url)'
(302, 'http://httpbin.org/redirect-to?url=http%3A%2F%2Fexample.com%2F')
parse
語(yǔ)法:
scrapy parse <url> [options]
獲取給定的URL并使用處理它的爬蟲解析它,使用通過--callback選項(xiàng)傳遞的方法,或者parse如果沒有給出。
支持的選項(xiàng):
--spider=SPIDER:繞過爬蟲自動(dòng)檢測(cè)和強(qiáng)制使用特定的爬蟲
--a NAME=VALUE:set spider argument(可以重復(fù))
--callback或者-c:spider方法用作回調(diào)來解析響應(yīng)
--pipelines:通過管道處理項(xiàng)目
--rules或者-r:使用CrawlSpider 規(guī)則來發(fā)現(xiàn)用于解析響應(yīng)的回調(diào)(即,spider方法)
--noitems:不顯示已抓取的項(xiàng)目
--nolinks:不顯示提取的鏈接
--nocolour:避免使用pygments來著色輸出
--depth或-d:請(qǐng)求應(yīng)遞歸跟蹤的深度級(jí)別(默認(rèn)值:1)
--verbose或-v:顯示每個(gè)深度級(jí)別的信息
用法示例:
$ scrapy parse http://www.example.com/ -c parse_item
[ ... scrapy log lines crawling example.com spider ... ]
>>> STATUS DEPTH LEVEL 1 <<<
# Scraped Items ------------------------------------------------------------
[{'name': u'Example item',
'category': u'Furniture',
'length': u'12 cm'}]
# Requests -----------------------------------------------------------------
[]
settings
語(yǔ)法:
scrapy settings [options]
獲取Scrapy設(shè)置的值。
如果在項(xiàng)目中使用,它將顯示項(xiàng)目設(shè)置值,否則將顯示該設(shè)置的默認(rèn)Scrapy值。
用法示例:
$ scrapy settings --get BOT_NAME
scrapybot
$ scrapy settings --get DOWNLOAD_DELAY
0
runspider
語(yǔ)法:
scrapy runspider <spider_file.py>
運(yùn)行一個(gè)自包含在Python文件中的爬蟲,而不必創(chuàng)建一個(gè)項(xiàng)目。
用法示例:
$ scrapy runspider myspider.py
[...爬蟲開始爬行...]
version
語(yǔ)法:
scrapy version [-v]
打印Scrapy版本。如果使用-v它也打印Python,Twisted和平臺(tái)信息,這是有用的錯(cuò)誤報(bào)告。
bench
新版本0.17。
語(yǔ)法:
scrapy bench
運(yùn)行快速基準(zhǔn)測(cè)試。基準(zhǔn)
自定義項(xiàng)目命令
您還可以使用COMMANDS_MODULE設(shè)置添加自定義項(xiàng)目命令 。有關(guān)如何實(shí)現(xiàn)命令的示例,請(qǐng)參閱scrapy/commands中的Scrapy命令。