Scrapy入門(mén)教程之爬糗事百科

接著之前的文章(http://blog.csdn.net/androidworkor/article/details/51171098)來(lái)分析Scrapy的目錄結(jié)構(gòu)

項(xiàng)目目錄結(jié)構(gòu)

打開(kāi)之前的指定的文件目錄(F:\WorkSpace\python\Hello)完整的目錄結(jié)構(gòu)如下:

Hello/
    scrapy.cfg
    Hello/
        __init__.py
        items.py
        pipelines.py
        settings.py
        spiders/
            __init__.py
            ...

這些文件分別是:

  • scrapy.cfg: 項(xiàng)目的配置文件
  • Hello/: 該項(xiàng)目的python模塊早芭。之后您將在此加入代碼署隘。
  • Hello/items.py: 項(xiàng)目中的item文件.
  • Hello/pipelines.py: 項(xiàng)目中的pipelines文件.
  • Hello/settings.py: 項(xiàng)目的設(shè)置文件.
  • Hello/spiders/: 放置spider代碼的目錄.

定義Item

Item 是保存爬取到的數(shù)據(jù)的容器;其使用方法和python字典類似宋欺, 并且提供了額外保護(hù)機(jī)制來(lái)避免拼寫(xiě)錯(cuò)誤導(dǎo)致的未定義字段錯(cuò)誤胸墙。我們來(lái)看一個(gè)例子


這里就有用戶圖標(biāo)寸痢、用戶名稱囊榜、內(nèi)容书闸、好笑和評(píng)論這5個(gè)屬性那么item就可以這么定義了尼变,打開(kāi)items.py文件

# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/items.html

import scrapy

class HelloItem(scrapy.Item):
       # define the fields for your item here like:
    userIcon = scrapy.Field()
    userName = scrapy.Field()
    content = scrapy.Field()
    like = scrapy.Field()
    comment = scrapy.Field()

編寫(xiě)第一個(gè)爬蟲(chóng)(Spider)

Spider是用戶編寫(xiě)用于從單個(gè)網(wǎng)站(或者一些網(wǎng)站)爬取數(shù)據(jù)的類。

其包含了一個(gè)用于下載的初始URL浆劲,如何跟進(jìn)網(wǎng)頁(yè)中的鏈接以及如何分析頁(yè)面中的內(nèi)容嫌术, 提取生成 item 的方法。

為了創(chuàng)建一個(gè)Spider牌借,您必須繼承 scrapy.Spider 類度气, 且定義以下三個(gè)屬性:

name: 用于區(qū)別Spider。 該名字必須是唯一的膨报,您不可以為不同的Spider設(shè)定相同的名字磷籍。
start_urls: 包含了Spider在啟動(dòng)時(shí)進(jìn)行爬取的url列表。 因此丙躏,第一個(gè)被獲取到的頁(yè)面將是其中之一择示。 后續(xù)的URL則從初始的URL獲取到的數(shù)據(jù)中提取。

parse() 是spider的一個(gè)方法晒旅。 被調(diào)用時(shí)栅盲,每個(gè)初始URL完成下載后生成的 Response 對(duì)象將會(huì)作為唯一的參數(shù)傳遞給該函數(shù)。 該方法負(fù)責(zé)解析返回的數(shù)據(jù)(response data)废恋,提取數(shù)據(jù)(生成item)以及生成需要進(jìn)一步處理的URL的 Request 對(duì)象谈秫。

以下為我們的第一個(gè)Spider代碼,保存在 Hello/spiders 目錄下的 spider_qiushibaike.py 文件中:

# -*- coding: utf-8 -*-
import scrapy
from Hello.items import HelloItem

class Spider_qiushibaike(scrapy.Spider):
    name = "qiubai"

    start_urls = [
        'http://www.qiushibaike.com'
    ]

    def parse(self, response):
        for item in response.xpath('//div[@id="content-left"]/div[@class="article block untagged mb15"]'):
            qiubai = HelloItem()

            icon = item.xpath('./div[@class="author clearfix"]/a[1]/img/@src').extract()
            if icon:
                icon = icon[0]
                qiubai['userIcon'] = icon

            userName = item.xpath('./div[@class="author clearfix"]/a[2]/h2/text()').extract()
            if userName:
                userName = userName[0]
                qiubai['userName'] = userName

            content = item.xpath('./div[@class="content"]/descendant::text()').extract()
            if content:
                con = ''
                for str in content:
                    con += str
                qiubai['content'] = con

            like = item.xpath('./div[@class="stats"]/span[@class="stats-vote"]/i/text()').extract()
            if like:
                like = like[0]
                qiubai['like'] = like

            comment = item.xpath('./div[@class="stats"]/span[@class="stats-comments"]/a/i/text()').extract()
            if comment:
                comment = comment[0]
                qiubai['comment'] = comment

            yield qiubai

爬取

進(jìn)入項(xiàng)目的根目錄鱼鼓,執(zhí)行下列命令啟動(dòng)spider:

scrapy crawl qiubai

crawl qiubai 啟動(dòng)用于爬取 http://www.qiushibaike.com 的spider拟烫,您將得到類似的輸出:

當(dāng)然你想保存到文件也是可以的,執(zhí)行下列命令啟動(dòng)spider:

scrapy crawl qiubai -o items.json

這里保存為json格式迄本,當(dāng)然你也可以保存成其他格式硕淑。執(zhí)行的結(jié)果:


解析

# -*- coding: utf-8 -*-

這個(gè)是指定文件為utf-8格式

import scrapy
from Hello.items import HelloItem

這個(gè)是導(dǎo)包

class Spider_qiushibaike(scrapy.Spider):

這個(gè)是定義一個(gè)類并繼承自scrapy.Spider

name = "qiubai"

這個(gè)是指定spider的名稱,該名字必須是唯一的嘉赎,以區(qū)別不同的spider

start_urls = [
        'http://www.qiushibaike.com'
]

這個(gè)是指定要爬的網(wǎng)站

def parse(self, response):

這個(gè)是默認(rèn)執(zhí)行的方法置媳,只要打開(kāi)了上面設(shè)置的start_urls的網(wǎng)站就會(huì)調(diào)用這個(gè)方法,在這個(gè)方法中就可以解析數(shù)據(jù)了公条,其中response是抓取的網(wǎng)站的整個(gè)html內(nèi)容拇囊。

for item in response.xpath('//div[@id="content-left"]/div[@class="article block untagged mb15"]'):

這句話就是遍歷每項(xiàng)的內(nèi)容,如下圖所示:



至于如何查看頁(yè)面的源碼就是在瀏覽器中按f12靶橱,就可以看到如上圖所示的效果了寥袭。

qiubai = HelloItem()

定義一個(gè)item并初始化路捧,這個(gè)就是之前定義的item,注: 所有之前必須先導(dǎo)入這個(gè)類
from Hello.items import HelloItem

 icon = item.xpath('./div[@class="author clearfix"]/a[1]/img/@src').extract()
if icon:
    icon = icon[0]
    qiubai['userIcon'] = icon

這幾行代碼就是獲取用戶的圖像传黄,xpath的規(guī)則和寫(xiě)法可以參考http://scrapy-chs.readthedocs.org/zh_CN/latest/topics/selectors.html#topics-selectors-relative-xpaths大家一看就了解杰扫。

userName = item.xpath('./div[@class="author clearfix"]/a[2]/h2/text()').extract()
if userName:
    userName = userName[0]
    qiubai['userName'] = userName

這幾行是獲取用戶名稱

注意

如果執(zhí)行spider沒(méi)結(jié)果并出現(xiàn)如下圖所示的提示:

一般是因?yàn)槟銢](méi)設(shè)定USER_AGENT,你可以打開(kāi)文件目錄中的settings.py添加一行代碼

USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0'

至于值你可以設(shè)置成其他的尝江。

如果獲取的文字內(nèi)容不全涉波,如下如所示:

在頁(yè)面文字中含有其他標(biāo)簽的,直接這樣寫(xiě)

content = item.xpath('./div[@class="content"]/text()').extract()

這樣獲取到的文字只能獲取前面一半的文字(在公園玩手機(jī)炭序,看到一個(gè)車禍視頻,我連忙拍著胸口說(shuō): 嚇?biāo)缹殞毩瞬匀铡#┠憧梢愿某桑?/p>

content = item.xpath('./div[@class="content"]/descendant::text()').extract()

這樣獲取到全部的文字信息了惭聂。

參考文獻(xiàn)

  1. http://scrapy-chs.readthedocs.org/zh_CN/latest/intro/tutorial.html
  2. http://www.v2ex.com/t/135633
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市相恃,隨后出現(xiàn)的幾起案子辜纲,更是在濱河造成了極大的恐慌,老刑警劉巖拦耐,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耕腾,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡杀糯,警方通過(guò)查閱死者的電腦和手機(jī)扫俺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)固翰,“玉大人狼纬,你說(shuō)我怎么就攤上這事÷罴剩” “怎么了疗琉?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)歉铝。 經(jīng)常有香客問(wèn)我盈简,道長(zhǎng),這世上最難降的妖魔是什么太示? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任柠贤,我火速辦了婚禮,結(jié)果婚禮上先匪,老公的妹妹穿的比我還像新娘种吸。我一直安慰自己,他們只是感情好呀非,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布坚俗。 她就那樣靜靜地躺著镜盯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪猖败。 梳的紋絲不亂的頭發(fā)上速缆,一...
    開(kāi)封第一講書(shū)人閱讀 52,457評(píng)論 1 311
  • 那天,我揣著相機(jī)與錄音恩闻,去河邊找鬼艺糜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛幢尚,可吹牛的內(nèi)容都是我干的破停。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼尉剩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼真慢!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起理茎,我...
    開(kāi)封第一講書(shū)人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤黑界,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后皂林,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體朗鸠,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年础倍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了烛占。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡著隆,死狀恐怖扰楼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情美浦,我是刑警寧澤弦赖,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站浦辨,受9級(jí)特大地震影響蹬竖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜流酬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一币厕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧芽腾,春花似錦旦装、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)店乐。三九已至,卻和暖如春呻袭,著一層夾襖步出監(jiān)牢的瞬間眨八,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工左电, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留廉侧,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓篓足,卻偏偏與公主長(zhǎng)得像段誊,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子栈拖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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

  • scrapy學(xué)習(xí)筆記(有示例版) 我的博客 scrapy學(xué)習(xí)筆記1.使用scrapy1.1創(chuàng)建工程1.2創(chuàng)建爬蟲(chóng)模...
    陳思煜閱讀 12,713評(píng)論 4 46
  • Python版本管理:pyenv和pyenv-virtualenvScrapy爬蟲(chóng)入門(mén)教程一 安裝和基本使用Scr...
    inke閱讀 60,264評(píng)論 6 99
  • Scrapy介紹 Scrapy是一個(gè)為了爬取網(wǎng)站數(shù)據(jù)枕扫,提取結(jié)構(gòu)性數(shù)據(jù)而編寫(xiě)的應(yīng)用框架。 可以應(yīng)用在包括數(shù)據(jù)挖掘辱魁,信...
    JasonDing閱讀 122,518評(píng)論 15 126
  • 這兩天摸索了下scrapy,剛看文檔的時(shí)候覺(jué)得有點(diǎn)生無(wú)可戀诗鸭,scrapy框架個(gè)人還是覺(jué)得比較難懂的染簇,需要學(xué)習(xí)的地方...
    Treehl閱讀 5,639評(píng)論 7 10
  • 糾結(jié),其實(shí)也沒(méi)有什么糾結(jié)的强岸,就是不想去而已锻弓。我所糾結(jié)的地方在于怎么和那些關(guān)心我的人說(shuō)拒絕。既然已經(jīng)回到家鄉(xiāng)了蝌箍,那就...
    淡淡的好嗎閱讀 221評(píng)論 0 0