前面講到只是爬取了title和url,那麼怎麼爬取文章,其實原理是同樣的。mongodb
咱們在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
中的CsdnCrawlerSpider
的rules
中添加一個對於文章內容的爬取規則,以下:函數
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
這是我爬取到的數據,文章內容有點亂。