本次是小阿鵬,第一次通過python爬蟲去爬一個小說網站的小說。
下面直接上菜。
1.首先我需要導入相應的包,這里我采用了第三方模塊的架包,requests。requests是python實現的簡單易用的HTTP庫,使用起來比urllib簡潔很多,因為是第三方庫,所以使用前需要cmd安裝。
cmd安裝方式,打開cmd,輸入以下命令:
pip install requests
2.添加相應的包后,我們需要一個小說鏈接去爬下這本小說也就是一個url。下面是我當時爬的小說url:http://www.shujy.com/5200/244309/
3.我們現在有了小說的鏈接,這時候就要模擬瀏覽器發送http的請求:
response=requests.get(url)
response.encoding='gbk'
4.我們可以嘗試獲取目標小說的網頁源碼
html=response.text
我們把它打印出來看下:
有html基礎的朋友應該對這些很熟悉。通過打印我們可以看見小說的名字,作者,以及小說章節的url。這時候我們就先通過HTML網頁源碼獲取小說的名字:
title=re.findall(r'<meta property="og:novel:book_name" content="(.*?)"/>',html)[0]
從上面的代碼我們可以看見是通過正則表達式去匹配的,對正則表達式有疑問的同學可以自行百度下。當然不同網站的具體小說名字可能會放在不同的標簽里,需要我們打開網頁源碼去看看下。
5.這時候我們也就新建一個文本文件來保存小說內容。
fb=open('%s.txt'% title,'w',encoding='utf-8')
這時候我們需要獲取小說的章節目錄對應的url,我們還是來觀察下網頁的源碼。我們通過火狐瀏覽器的f12看下網頁可發現:
小說的章節目標都在標簽<div id='list'>里我們通過下面的代碼獲取對應的章節名和url。用一個list來存放章節信息。
dl=re.findall(r'<div id="list">.*?</div>',html,re.S)[0] chapter_info_list=re.findall(r'<a href="(.*?)">(.*?)</a>',dl)
6.這個時候我們循環每一章節,分別下載,先把章節的鏈接,章節名提取出來。
for chapter_info in chapter_info_list: chapter_url,chapter_title=chapter_info chapter_url="http://www.shujy.com/5200/244309/%s " % chapter_url chapter_url=chapter_url.replace(' ','')
我們可以看見對章節的鏈接進行的拼接,因為我們可以看見直接提取出來的鏈接是這樣的:
所以也就需要一個拼接的操作,取得完整的章節鏈接。
這個時候來下載小說內容:
chapter_response=requests.get(chapter_url,headers=headers) chapter_response.encoding='gbk' chapter_html=chapter_response.text
我們先是獲取到小說具體章節的頁面。打開具體小說章節f12查看網頁的源碼:
可以清楚的看見小說的具體內容是在標簽<div id=content>里,和獲取小說章節一樣我們采用正則表達式來取得小說的內容。
chapter_content=re.findall(r'<div id="content">(.*?)</div>',chapter_html,re.S)[0]
我們把獲取到的小說的內容打印出來看看,
我們看見一些奇怪的字符 ,<br/>等,我們在實際的小說里沒有這些東西,這里就需要我們處理數據。進行一些操作,也叫做數據的清洗。
chapter_content=chapter_content.replace(' ','') chapter_content=chapter_content.replace('<br />','') chapter_content=chapter_content.replace('&t;','')
清洗后的小說內容:
7.現在就是最后一步把小說保存到本地。
fb.write(chapter_title) fb.write('\n') fb.write(chapter_content) fb.write('\n') print(chapter_url,chapter_title)
我們來看下最后的結果,我們每爬完一章打印相應的章節鏈接信息和返回的response信息來看是否成功爬取:
當當當當,成功的爬下了這邊小說。
最后總結下,本次的爬蟲就很簡單是小阿鵬的初次嘗試,中間如果有不對的地方也希望大家的指正,謝謝!