資源描述:
《爬蟲學(xué)習(xí)之基于scrapy的網(wǎng)絡(luò)爬蟲》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、爬蟲學(xué)習(xí)之基于Scrapy的網(wǎng)絡(luò)爬蟲 建立目標(biāo) 同樣在做任何事情之前都需要明確目標(biāo),那這次我們的目標(biāo)是爬取一些技術(shù)性的文章并存儲(chǔ)到數(shù)據(jù)庫中。這就需要有目標(biāo)網(wǎng)址和數(shù)據(jù)庫結(jié)構(gòu),數(shù)據(jù)庫我們選擇使用MySql,目標(biāo)網(wǎng)站我們找了一個(gè)叫腳本之家的內(nèi)容站。我們這里首先準(zhǔn)備好一張用于存儲(chǔ)文章的表結(jié)構(gòu): 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; 分析目標(biāo)結(jié)構(gòu) 這里我們首先需要爬取得入口是“網(wǎng)絡(luò)編程”這個(gè)節(jié)點(diǎn),主入口網(wǎng)址為(http://www.jb51.net/list/index_1.htm)打開這個(gè)網(wǎng)站我們通過Chrom
3、e或者其他瀏覽器的查看元素來分析當(dāng)前頁面的HTML語義結(jié)構(gòu),如下圖所示: 從圖中紅色框線的部分可以看出,這里是我們需要在“網(wǎng)絡(luò)編程”這個(gè)節(jié)點(diǎn)下需要提取的所有文章的主分類入口,通過這些入口可以進(jìn)去到不同文章分類的列表中。所以根據(jù)初步結(jié)構(gòu)分析,我們得出本次爬蟲的爬取路線為: 從主入口進(jìn)去->提取當(dāng)前入口中的所有分類->通過分類入口進(jìn)入到分類列表->通過列表進(jìn)入到文章頁 分類入口確定了接下來看看我們的分類列表,隨意點(diǎn)開一個(gè)分類入口,打開列表如下圖所示: 這里我框出了兩個(gè)主要部分,第一個(gè)是文章的標(biāo)題,第二個(gè)是分頁,文章對(duì)應(yīng)的URL就是我們接下來需要爬取文章內(nèi)容的入口,這
4、里需要注意的是分頁的處理,通過分頁的最后一頁我們可以知道當(dāng)前這類列表共有多少頁文章。結(jié)合以上分析我們基本確定了本次爬蟲的各個(gè)路線入口,接下來我們就開始通過程序來實(shí)現(xiàn)本次的目標(biāo)?! ?shí)現(xiàn)爬蟲 在實(shí)現(xiàn)爬蟲之前我們通過一張圖來對(duì)Scrapy有個(gè)基本的認(rèn)識(shí),為了保持本章內(nèi)容的簡(jiǎn)潔性,我們這里暫時(shí)不會(huì)討論ItemPipeline部分,Scrapy架構(gòu)圖如下所示(圖片來自網(wǎng)絡(luò)): 從圖中可以很清晰的看到Scrapy所包含的幾大塊,下面我們通過代碼來演示我們所用到的基礎(chǔ)功能部分。 主要依賴第三方庫: web.pyweb框架,這里只用到了database部分,將來會(huì)用來進(jìn)行內(nèi)容
5、展示 scrapy爬蟲框架,這里只用到了最基本的內(nèi)容提取 這里還會(huì)用到一些xpath相關(guān)知識(shí),請(qǐng)自行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') #允許的站點(diǎn)域
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