使用Scrapy來爬取本身的CSDN文章 (2)

前言

前面講到只是爬取了title和url,那麼怎麼爬取文章,其實原理是同樣的。mongodb

過程

保存文章內容的Item

咱們在item.py中添加一項,以下:瀏覽器

class CsdnArticleItem(Item):
    title = Field()
    article = Field()
    pass

咱們保存文章的題目和內容。markdown

分析文章的連接

csdn是怎麼來保存一篇文章的,咱們來看一個url:
http://blog.csdn.net/zhx6044/article/details/45698535
http://blog.csdn.net是域名。
zhx6044是做者。
article/details是固定的,那麼只是最後的數字不一樣,因此數字用來索引一篇文章。ide

更新咱們的爬蟲

csdn_crawler.py中的CsdnCrawlerSpiderrules中添加一個對於文章內容的爬取規則,以下:函數

rules = (
        Rule(LinkExtractor(allow=r'article/list/[0-9]{1,20}'), callback='parse_item', follow=True),
        Rule(LinkExtractor(allow=r'article/details/[0-9]{1,20}'), callback='parse_article', follow=True),
    )

而後咱們實現一個其處理這個規則連接內容的回調函數。以下:url

def parse_article(self, response):
        i = CsdnArticleItem()
        i['title'] = response.xpath('//*[@id="article_details"]/div[1]/h1/span/a/text()').extract()
        i['article'] = response.xpath('//*[@id="article_content"]').extract()
        return i

使用的仍是Chromium瀏覽器的Copy XPath功能。
在提取文章內容時很差處理,爲了實現更好的頁面表現效果,其中實現比較複雜,我不能值爬取文字內容,因此如今只能連樣式一塊兒爬下來。
這樣添加以後,咱們的爬蟲就但是運行了。spa

結果

這是其中的一些運行log:.net

2015-05-16 14:35:51+0800 [csdn_crawler] DEBUG: Filtered duplicate request: <GET http://blog.csdn.net/zhx6044/article/list/3> - no more duplicates will be shown (see DUPEFILTER_DEBUG to show all duplicates)
2015-05-16 14:35:57+0800 [csdn_crawler] DEBUG: Crawled (200) <GET http://blog.csdn.net/zhx6044/article/details/45649045> (referer: http://blog.csdn.net/zhx6044)
2015-05-16 14:35:57+0800 [csdn_crawler] DEBUG: Article add to mongodb database!

其能夠看到其爬取了http://blog.csdn.net/zhx6044/article/details/45649045這篇文章。
你們須要注意的是,這個爬蟲雖然是從你的blog開始爬取,可是你的博客頁面中還會包含其它人的連接,好比在推薦文章這一欄,如圖:
這裏寫圖片描述code

這是你能夠在添加爬取規則時添加上限制,好比:
Rule(LinkExtractor(allow=r'zhx6044/article/details/[0-9]{1,20}'), callback='parse_article', follow=True),
就能夠了,否則你會發現你的爬蟲根本停不下來。blog

這是我爬取到的數據,文章內容有點亂。
這裏寫圖片描述

相關文章
相關標籤/搜索