文:鄭元春
人生苦短,我用Python
由于最近需要做些大數(shù)據(jù)分析的工作,所以就學(xué)習了寫下爬蟲了,畢竟數(shù)據(jù)才是分析的基礎(chǔ)靶端。如果能夠得到了數(shù)據(jù),那么你的數(shù)據(jù)挖掘或者是數(shù)據(jù)分析工作就已經(jīng)成功了一半凛膏。
什么是Scrapy杨名?
Scrapy is a fast high-level web crawling and web scraping framework, used to crawl websites and extract structured data from their pages. It can be used for a wide range of purposes, from data mining to monitoring and automated testing.
項目文檔:Scrapy文檔
項目Git:源碼
首先,先放上Scrapy的原理圖:
![scrapy各組件示意](http://doc.scrapy.org/en/latest/_images/scrapy_architecture.png)
綠色的箭頭表示的是數(shù)據(jù)的流動方向猖毫。
通過看上面的示意圖台谍,我們可以看出最主要的核心部件是Scrapy Engine
,;另外還有Scheduler
+ Downlodaer
+ Spiders
+ Item Pipeline
四個功能部件吁断,除此之外還有自己配置的 Downloader Middleware
+Spider Middleware
兩個可自由配置的拓展中間件趁蕊。
1.Scrapy Engine
這是Scrapy的爬蟲核心坞生,主要負責控制系統(tǒng)各個部件之間的data flow,以及當特定事件發(fā)生的時候觸發(fā)event掷伙。
2.Scheduler
接受engine發(fā)來的requests放入隊列中是己,當engine要求的時候再提供給engine。
3.Downloader
負責拉取下載page并返給engine任柜,engine之后再傳遞給Spiders
4.Spider
用戶自行編寫的代碼類卒废,這部分的用戶代碼主要完成解析response并提取item,或者是
跟進頁面中獲取的額外的link url宙地。
Scrapy 命令
提供了兩種命令方式摔认,一種是全局的命令,不依托Scrapy項目的設(shè)置绸栅。另一種是項目命令级野,必須在項目的路徑中執(zhí)行页屠,兩者的區(qū)別就是是否需要load項目的設(shè)置(這個跟Django的命令行有點相似粹胯,實際上Scrapy的開發(fā)過程受到了Django的影響)
全局命令
startproject
settings
runspider
shell
fetch
view
version
項目命令
crawl
check
list
edit
parse
genspider
deploy
bench
創(chuàng)建項目
scrapy startproject tutorial(你的項目名稱)
可以看出這和Django的命令一樣
tutorial/
scrapy.cfg
tutorial/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
...
下面是項目的目錄初始化結(jié)構(gòu),和Django的目錄結(jié)構(gòu)也一樣辰企。
-
scrapy.cfg
是整個項目的設(shè)置文件风纠,用的是ini
的設(shè)置方式。 -
tutorial
是和項目一樣的子目錄牢贸,里面的文件就是整個項目的python源碼竹观。 -
spiders
目錄是自行編碼的爬蟲軟件,大部分的邏輯和對頁面的分析都在這里面了潜索。
一般是你startproject之后臭增,你還要使用genspider
命令生成一個爬蟲程序。
比如使用下面的命令生成一個spider程序:
scrapy genspider dmoz
這是給某個網(wǎng)站進行爬蟲編寫的邏輯代碼竹习。源碼如下:
import scrapy
class DmozSpider(scrapy.Spider):
name="domz"
allowed_domains=['demo.org']
start_urls=[
"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
]
def parse(self,response):
print response.url
這就是一個最簡單的爬蟲程序誊抛。這里的class繼承了scrapy的Spider類。必須要定義的變量是name
+allowed_domains
整陌,name是標志了這個爬蟲的名稱拗窃,后面如果要運行爬蟲程序的話需要使用這個name的值進行啟動,另外一個allowed_domains則是定義了你爬取的域名泌辫,如果是爬蟲在構(gòu)造Request的時候那么需要檢查URL是否在這個域名下随夸,如果是不在這個域名中的URL就不會爬取。
至于start_urls
則是指定你的爬蟲需要從哪里開始爬取震放,相當于初始的入口宾毒。
還有一個parse函數(shù),這個是默認的callback函數(shù)殿遂,也就是爬蟲抓取了start_urls里面的網(wǎng)頁之后诈铛,然后download完成之后需要通過這個默認的函數(shù)進行頁面的解析(爬取你敢興趣的數(shù)據(jù))
這里除了name和allowed_domains是不能更改的邪锌,其他的都可以通過其他的方式進行改寫(定制)
下面是基類Spider的源碼,看下就知道你的爬蟲代碼為什么這么寫了癌瘾,當然這只是最簡單的爬蟲觅丰,就爬取了兩個頁面,然后只對爬取的頁面輸出頁面url
有的教程上面寫的是繼承自BaseSpider
妨退,新版中已經(jīng)改成了Spider類妇萄,并且在源碼中聲明了已經(jīng)丟棄了BaseSpider的用法,將BaseSpider指到了Spider類上咬荷。
主要看的是name和start_urls的使用和生成上冠句。還有parse需要在你的類中實現(xiàn)。
上面只是最簡單的爬蟲程序幸乒,還沒涉及到item和pipeline的使用懦底,在命令行中運行下面的指令,就可以啟動爬蟲程序并開始執(zhí)行了罕扎。
scrapy crawl domz
這里crawl后面的參數(shù)就是你在你的子類中寫的name的值聚唐。