初識(shí)Scrapy

為什么使用Scrapy载绿?

我們可以用requests和beautifulsoup完成一個(gè)實(shí)用的爬蟲唉侄,但如果想大規(guī)模爬取的話育勺,我們需要學(xué)習(xí)Scrapy這個(gè)優(yōu)秀Python框架,學(xué)習(xí)它的哲學(xué)思想早芭,可以幫助我們更好寫自己的爬蟲彼城。

事前準(zhǔn)備

由于Windows存在許多莫名其妙的坑,所以建議安裝anaconda這個(gè)優(yōu)秀的python發(fā)行版退个,并且在anaconda目錄添加到環(huán)境變量中募壕。

  1. 使用<code>create -n scrapy_app python=2 scrapy</code>創(chuàng)建一個(gè)預(yù)裝scrapy的虛擬環(huán)境。
  2. 在cmd下啟動(dòng)虛擬環(huán)境<code> activate scrapy_app</code>语盈。
  3. <code>conda install -c scrapinghub scrapy</code>安裝其他必須庫
  4. <code>scrapy bench </code>驗(yàn)證能否正常工作

官方教程

1.新建項(xiàng)目<code>scrapy startproject tutorial</code>

這個(gè)命令將會(huì)創(chuàng)建如下內(nèi)容:

2.定義Item

items用來裝scraped data司抱,也就是從網(wǎng)頁提取的數(shù)據(jù),是一類簡單的Python字典黎烈。比如我們想從stackoverflow提取問題名习柠、鏈接和描述。那么就可以在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()

3.第一個(gè)爬蟲(spider)

爬蟲是你自定義的類资溃,用于讓Scrapy從某個(gè)網(wǎng)站提取信息。你需要定義起始的URL(start_urls)烈炭,如何跟蹤鏈接以及如何檢索網(wǎng)頁內(nèi)容并進(jìn)行提取溶锭。
我們可以在命令行中輸入<code>scrapy genspider -t basic domz dmoz.org</code>創(chuàng)建一個(gè)爬蟲,得到spiders/domz.py符隙。
# -- coding: utf-8 --
import scrapy

class DomzSpider(scrapy.Spider):
    name = "domz" #用于定位爬蟲
    allowed_domains = ["dmoz.org"] #限定域名趴捅,就不會(huì)爬到baidu.com了
    start_urls =[
        "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
        "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
    ] # 起始的URL

    def parse(self, response):
        filename = response.url.split("/")[-2]+'.html'
        with open(filename,'wb') as f:
            f.write(response.body) 
   # parse是Scarpy在請求未指定回調(diào)時(shí),用于處理下載響應(yīng)的默認(rèn)回調(diào)霹疫。

進(jìn)一步想了解scrapy.Spider的話看這里拱绑。

4.工作吧!爬蟲

命令行下輸入<code>scrapy crawl domz</code>丽蝎。
結(jié)束后會(huì)在項(xiàng)目文件下載生成兩個(gè)HTML文件猎拨。單單下載網(wǎng)頁并沒有意義,我們需要從網(wǎng)頁從提取數(shù)據(jù)才有意義。

5.數(shù)據(jù)提取

Scrapy使用基于Xpath或CSS表達(dá)式的Scrapy Selectors提取網(wǎng)頁數(shù)據(jù)红省。
讓我們在shell下使用一下Scrapy Selectors吧额各。<code>scrapy shell "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/"</code>

In [1]: response.xpath('//title')
Out[1]: [<Selector xpath='//title' data=u'<title>Open Directory - Computers: Progr'>]

In [2]: response.xpath('//title').extract()
Out[2]: [u'<title>Open Directory - Computers: Programming: Languages: Python: Books</title>']

In [3]: response.xpath('//title/text()')
Out[3]: [<Selector xpath='//title/text()' data=u'Open Directory - Computers: Programming:'>]

In [4]: response.xpath('//title/text()').extract()
Out[4]: [u'Open Directory - Computers: Programming: Languages: Python: Books']

In [5]: response.xpath('//title/text()').re('(\w+):')
Out[5]: [u'Computers', u'Programming', u'Languages', u'Python']

因此,我們可以改寫之前dmoz.py中的parse部分吧恃。

.......
def parse(self, response):
    for sel in response.xpath('//ui/li'):
        title = sel.xpath('a/text()').extract()
        link = sel.xpath('a/@href').extract()
        desc = sel.xpath('text()').extract()
        print title, link, desc

重新運(yùn)行<code>scrapy crawl domz</code>
這里我們只是把結(jié)果打印出來虾啦,實(shí)際運(yùn)行應(yīng)該是把數(shù)據(jù)保存下來,首先需要用到之前定義的DmozItem先結(jié)構(gòu)化數(shù)據(jù)痕寓, 繼續(xù)改寫傲醉。

from tutorial.items import DmozItem 
...
def parse(self, response):
    for sel in response.xpath('//ui/li'):
        item = DmozItem()
        item['title']' = sel.xpath('a/text()').extract()
        item['link'] = sel.xpath('a/@href').extract()
        item['desc'] = sel.xpath('text()').extract()
        yield item

重新運(yùn)行<code>scrapy crawl domz</code>

6.鏈接跟蹤

假設(shè)你不滿足爬取起始頁面,想繼續(xù)爬取起始頁面中你感興趣的鏈接厂抽,那么我么就需要進(jìn)一步改寫之前的爬蟲了。

def parse(self, response):
    for href in response.css("ul.directory.dir-col > li > a::attr('href')"):
        url = response.urljoin(href.extract())#構(gòu)建絕對路徑的URL
        yield scrapy.Request(url, callback=self.parse_dir_contents)

def parse_dir_contents(self, response):
    for sel in response.xpath('//ui/li'):
        item = DmozItem()
        item['title']' = sel.xpath('a/text()').extract()
        item['link'] = sel.xpath('a/@href').extract()
        item['desc'] = sel.xpath('text()').extract()
        yield item

這里我們使用parse函數(shù)獲取網(wǎng)頁的url丁眼,然后通過scrapy.Request對獲取的每一個(gè)url調(diào)用parse_dir_contents函數(shù)筷凤,提取數(shù)據(jù)。

7.數(shù)據(jù)儲(chǔ)存

數(shù)據(jù)儲(chǔ)存有很多方式苞七,可以放在數(shù)據(jù)庫中藐守,由于是教程,我們使用最簡單的<code>scrapy crawl domz -o items.json</code>把數(shù)據(jù)放在json文件中蹂风。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末卢厂,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子惠啄,更是在濱河造成了極大的恐慌慎恒,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撵渡,死亡現(xiàn)場離奇詭異融柬,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)趋距,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進(jìn)店門粒氧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人节腐,你說我怎么就攤上這事外盯。” “怎么了翼雀?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵饱苟,是天一觀的道長。 經(jīng)常有香客問我狼渊,道長掷空,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮坦弟,結(jié)果婚禮上护锤,老公的妹妹穿的比我還像新娘。我一直安慰自己酿傍,他們只是感情好烙懦,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著赤炒,像睡著了一般氯析。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上莺褒,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天掩缓,我揣著相機(jī)與錄音,去河邊找鬼遵岩。 笑死你辣,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的尘执。 我是一名探鬼主播舍哄,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼誊锭!你這毒婦竟也來了表悬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤丧靡,失蹤者是張志新(化名)和其女友劉穎蟆沫,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體温治,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡饥追,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了罐盔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片但绕。...
    茶點(diǎn)故事閱讀 40,769評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖惶看,靈堂內(nèi)的尸體忽然破棺而出捏顺,到底是詐尸還是另有隱情,我是刑警寧澤纬黎,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布幅骄,位于F島的核電站,受9級特大地震影響本今,放射性物質(zhì)發(fā)生泄漏拆座。R本人自食惡果不足惜主巍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望挪凑。 院中可真熱鬧孕索,春花似錦、人聲如沸躏碳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽菇绵。三九已至肄渗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間咬最,已是汗流浹背翎嫡。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留永乌,地道東北人惑申。 一個(gè)月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像铆遭,于是被迫代替她去往敵國和親硝桩。 傳聞我的和親對象是個(gè)殘疾皇子沿猜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評論 2 361

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