資源描述:
《爬蟲學習之基于scrapy的網(wǎng)絡爬蟲》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在行業(yè)資料-天天文庫。
1、爬蟲學習之基于Scrapy的網(wǎng)絡爬蟲 建立目標 同樣在做任何事情之前都需要明確目標,那這次我們的目標是爬取一些技術性的文章并存儲到數(shù)據(jù)庫中。這就需要有目標網(wǎng)址和數(shù)據(jù)庫結構,數(shù)據(jù)庫我們選擇使用MySql,目標網(wǎng)站我們找了一個叫腳本之家的內(nèi)容站。我們這里首先準備好一張用于存儲文章的表結構: CREATETABLE`articles`( `id`mediumint(8)AUTO_INCREMENTNOTNULL, `title`varchar(255)DEFAULTNULL, `content`longtext, `add_date`int(11)DEFAULT
2、0, `hits`int(11)DEFAULT'0', `origin`varchar(500)DEFAULT'', `tags`varchar(45)DEFAULT'', PRIMARYKEY(`id`), KEY`add_date`(`add_date`) )ENGINE=InnoDBDEFAULTCHARSET=utf8COLLATE=utf8_unicode_ci; 分析目標結構 這里我們首先需要爬取得入口是“網(wǎng)絡編程”這個節(jié)點,主入口網(wǎng)址為(http://www.jb51.net/list/index_1.htm)打開這個網(wǎng)站我們通過Chrom
3、e或者其他瀏覽器的查看元素來分析當前頁面的HTML語義結構,如下圖所示: 從圖中紅色框線的部分可以看出,這里是我們需要在“網(wǎng)絡編程”這個節(jié)點下需要提取的所有文章的主分類入口,通過這些入口可以進去到不同文章分類的列表中。所以根據(jù)初步結構分析,我們得出本次爬蟲的爬取路線為: 從主入口進去->提取當前入口中的所有分類->通過分類入口進入到分類列表->通過列表進入到文章頁 分類入口確定了接下來看看我們的分類列表,隨意點開一個分類入口,打開列表如下圖所示: 這里我框出了兩個主要部分,第一個是文章的標題,第二個是分頁,文章對應的URL就是我們接下來需要爬取文章內(nèi)容的入口,這
4、里需要注意的是分頁的處理,通過分頁的最后一頁我們可以知道當前這類列表共有多少頁文章。結合以上分析我們基本確定了本次爬蟲的各個路線入口,接下來我們就開始通過程序來實現(xiàn)本次的目標?! 崿F(xiàn)爬蟲 在實現(xiàn)爬蟲之前我們通過一張圖來對Scrapy有個基本的認識,為了保持本章內(nèi)容的簡潔性,我們這里暫時不會討論ItemPipeline部分,Scrapy架構圖如下所示(圖片來自網(wǎng)絡): 從圖中可以很清晰的看到Scrapy所包含的幾大塊,下面我們通過代碼來演示我們所用到的基礎功能部分?! ≈饕蕾嚨谌綆欤骸 eb.pyweb框架,這里只用到了database部分,將來會用來進行內(nèi)容
5、展示 scrapy爬蟲框架,這里只用到了最基本的內(nèi)容提取 這里還會用到一些xpath相關知識,請自行Google了解xpath語法 #-*-coding:utf-8-*- '''bysudorm-rfhttp://imchenkun.com''' importscrapy fromscrapy.httpimportRequest importweb importtime db=web.database(dbn='mysql',host='127.0.0.1',db='imchenkun',user='root',pw='root') #允許的站點域
6、 allow_domain="jb51.net" base_url="http://www.jb51.net" #列表頁 list_url="http://www.jb51.net/list/list_%d_%d.htm" #列表分頁 list_page=1 #文章頁 crawl_url="http://www.jb51.net/article/%d.htm" classJB51Spider(scrapy.Spider): name="jb51" start_urls=[ "http://www.jb51.net/list/index_1.htm"
7、 ] cate_list=[] defparse(self,response): cate_id=response.selector.xpath('//div[@class="index_borclearfix"]/div[@class="index_con"]/span/a/@href').re('(\\d+)')[::2] foridincate_id: cate_url=list_url%(int(id),1) yieldRequest(cate_url,callback=self.parse_page) def