Scrapy入門教程

Scrapy 入門教程###

安裝Scrapy lxml很容易出問題 心赶。

1: 創(chuàng)建一個Scrapy 項(xiàng)目
scrapy starproject tutorial ## tutorial是項(xiàng)目名稱
會自動創(chuàng)建tutorial目錄:
scrapy.cfg : 項(xiàng)目的配置文件
item.py : 項(xiàng)目中的item 文件
pipelines.py :  項(xiàng)目中的piplines 文件
settings.py : 項(xiàng)目中的設(shè)置文件
spiders : 放置spider代碼的目錄

定義 Item

em
是保存爬取到的數(shù)據(jù)的容器柬祠;其使用方法和python字典類似禁炒, 并且提供了額外保護(hù)機(jī)制來避免拼寫錯誤導(dǎo)致的未定義字段錯誤拾稳。
類似在ORM中做的一樣肪跋,您可以通過創(chuàng)建一個 scrapy.Item
類寸宏, 并且定義類型為 scrapy.Field
的類屬性來定義一個Item宁炫。 (如果不了解ORM, 不用擔(dān)心,您會發(fā)現(xiàn)這個步驟非常簡單)
首先根據(jù)需要從dmoz.org獲取到的數(shù)據(jù)對item進(jìn)行建模氮凝。 我們需要從dmoz中獲取名字羔巢,url,以及網(wǎng)站的描述。 對此竿秆,在item中定義相應(yīng)的字段启摄。編輯 tutorial
目錄中的 items.py
文件:



import scrapy


class DmozItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()
    link = scrapy.Field()
    desc = scrapy.Field()
    ```

###編寫一個爬蟲(Spider)###
為了創(chuàng)建一個Spider , 必須繼承`scrapy.Spider`類, 并且定義以下三個屬性:
- `name` :  用于區(qū)別Spider幽钢, 名字需要唯一
- `start_url` : 包含了Spider 啟動的時候需要抓取了url列表歉备,因此,第一個被抓取的頁面將是其中之一匪燕,后續(xù)的URL則從初始的URL獲取到的數(shù)據(jù)提取
- `parse()` :  是spider的一個方法蕾羊。 被調(diào)用時,每個初始URL完成下載后生成的 [Response
](http://scrapy-chs.readthedocs.io/zh_CN/0.24/topics/request-response.html#scrapy.http.Response) 對象將會作為唯一的參數(shù)傳遞給該函數(shù)帽驯。 該方法負(fù)責(zé)解析返回的數(shù)據(jù)(response data)龟再,提取數(shù)據(jù)(生成item)以及生成需要進(jìn)一步處理的URL的 [Request
](http://scrapy-chs.readthedocs.io/zh_CN/0.24/topics/request-response.html#scrapy.http.Request) 對象。 
以下為我們的第一個Spider代碼界拦,保存在 tutorial/spiders
 目錄下的 dmoz_spider.py
 文件中:

import scrapy

class DmozSpider(scrapy.spiders.Spider):
name = "dmoz"
allowed_domains = ["dmoz.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):
    filename = response.url.split("/")[-2]
    with open(filename, 'wb') as f:
        f.write(response.body)
啟用命令 : scrapy craml  項(xiàng)目名
Scrapy為Spider的 start_urls
 屬性中的每個URL創(chuàng)建了 [scrapy.Request
](http://scrapy-chs.readthedocs.io/zh_CN/0.24/topics/request-response.html#scrapy.http.Request) 對象吸申,并將 parse
 方法作為回調(diào)函數(shù)(callback)賦值給了Request。
Request對象經(jīng)過調(diào)度享甸,執(zhí)行生成 [scrapy.http.Response
](http://scrapy-chs.readthedocs.io/zh_CN/0.24/topics/request-response.html#scrapy.http.Response) 對象并送回給spider [parse()
](http://scrapy-chs.readthedocs.io/zh_CN/0.24/topics/spiders.html#scrapy.spider.Spider.parse) 方法截碴。

###提取 Item ###
Scrapy 使用基于XPath 和 CSS 表達(dá)機(jī)制, Scrapy Selectors 

列XPath 表達(dá)式對應(yīng)了含義:
- `/html/head/title` : 選擇HTML 中`<head>` 標(biāo)簽內(nèi)的`<title>`元素
- `/html/head/title/text()` : 選擇上面提到的`<title>`元素的文字
- `//td` :選擇所有的`<td>`元素
- `//div[@class='mine']` : 選擇所有帶具有`class='mine'` 屬性的`div`元素

為了配合XPath 蛉威, Scrapy 除了`selector` 之外日丹,還提供了方法避免每次response 中提取數(shù)據(jù)生成selector的麻煩。

Selector 有四個基礎(chǔ)方法
- `xpath()`  : 傳入xpath表達(dá)式蚯嫌, 返回該表達(dá)式對應(yīng)的所有selector list 列表
- `css()` : 傳入CSS 表達(dá)式哲虾, 返回表達(dá)式內(nèi)所有selector list 列表
- `extract` :序列化該節(jié)點(diǎn)為unicode字符串并返回list
- `re()` :  根據(jù)傳入的正則表達(dá)式對數(shù)據(jù)進(jìn)行提取,返回unicode字符串list列表


### Spider 參數(shù) ###
在運(yùn)行`crawl` 可以添加 `-a ` 可以傳遞Spider參數(shù):
  `scrapy crawl  <name> -a category=electronics`
Spider在構(gòu)造器(constructor)中獲取參數(shù)



###Spider###
`name` :  定義名稱
`allowed_domains` : 可選择示。包含了spider允許爬取的域名(domain)列表(list)束凑。 當(dāng) [OffsiteMiddleware
](http://scrapy-chs.readthedocs.io/zh_CN/0.24/topics/spider-middleware.html#scrapy.contrib.spidermiddleware.offsite.OffsiteMiddleware) 啟用時, 域名不在列表中的URL不會被跟進(jìn)栅盲。
`start_urls` : URL列表汪诉。當(dāng)沒有制定特定的URL時,spider將從該列表中開始進(jìn)行爬取谈秫。 因此扒寄,第一個被獲取到的頁面的URL將是該列表之一。 后續(xù)的URL將會從獲取到的數(shù)據(jù)中提取拟烫。
`start_requests()`: 
該方法必須返回一個可迭代對象(iterable)该编。該對象包含了spider用于爬取的第一個Request。
當(dāng)spider啟動爬取并且未制定URL時硕淑,該方法被調(diào)用课竣。 當(dāng)指定了URL時嘉赎,[make_requests_from_url()
](http://scrapy-chs.readthedocs.io/zh_CN/0.24/topics/spiders.html#scrapy.spider.Spider.make_requests_from_url) 將被調(diào)用來創(chuàng)建Request對象。 該方法僅僅會被Scrapy調(diào)用一次稠氮,因此您可以將其實(shí)現(xiàn)為生成器曹阔。
該方法的默認(rèn)實(shí)現(xiàn)是使用 [start_urls
](http://scrapy-chs.readthedocs.io/zh_CN/0.24/topics/spiders.html#scrapy.spider.Spider.start_urls) 的url生成Request。
如果您想要修改最初爬取某個網(wǎng)站的Request對象隔披,您可以重寫(override)該方法赃份。 例如,如果您需要在啟動時以POST登錄某個網(wǎng)站奢米,你可以這么寫:

def start_requests(self):
return [scrapy.FormRequest("http://www.example.com/login",
formdata={'user': 'john', 'pass': 'secret'},
callback=self.logged_in)]

def logged_in(self, response):
# here you would extract links to follow and return Requests for
# each of them, with another callback
pass

`log(message[, level, componet])`: 日志


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抓韩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鬓长,更是在濱河造成了極大的恐慌谒拴,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涉波,死亡現(xiàn)場離奇詭異英上,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)啤覆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門苍日,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人窗声,你說我怎么就攤上這事相恃。” “怎么了笨觅?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵拦耐,是天一觀的道長。 經(jīng)常有香客問我见剩,道長杀糯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任苍苞,我火速辦了婚禮火脉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘柒啤。我一直安慰自己,他們只是感情好畸颅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布担巩。 她就那樣靜靜地躺著,像睡著了一般没炒。 火紅的嫁衣襯著肌膚如雪涛癌。 梳的紋絲不亂的頭發(fā)上犯戏,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機(jī)與錄音拳话,去河邊找鬼先匪。 笑死,一個胖子當(dāng)著我的面吹牛弃衍,可吹牛的內(nèi)容都是我干的呀非。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼镜盯,長吁一口氣:“原來是場噩夢啊……” “哼岸裙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起速缆,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤降允,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后艺糜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體剧董,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年破停,在試婚紗的時候發(fā)現(xiàn)自己被綠了翅楼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡辱挥,死狀恐怖犁嗅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情晤碘,我是刑警寧澤褂微,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站园爷,受9級特大地震影響宠蚂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜求厕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扰楼。 院中可真熱鬧呀癣,春花似錦、人聲如沸弦赖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蹬竖。三九已至沼沈,卻和暖如春流酬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背列另。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工芽腾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人页衙。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓摊滔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拷姿。 傳聞我的和親對象是個殘疾皇子惭载,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容