一诡必、前沿
首先推薦一個好看的網(wǎng)絡(luò)小說網(wǎng)站:武俠world,又可以學(xué)英語搔扁,又可以看小說爸舒,還可以治療各種上癮癥(無法治療小說癮),非常不錯稿蹲。
這段時間真是小說荒扭勉,好看的網(wǎng)絡(luò)小說本來就少,而且更新得實(shí)在是太慢苛聘,于是想到把之前得小說再翻出來看看涂炎。雖然,網(wǎng)上免費(fèi)的小說網(wǎng)站不少设哗,但廣告實(shí)在是太多唱捣,于是想自己把小說下載下來,方便又無廣告网梢,總之就是綠色無污染震缭,還可以練習(xí)一下爬蟲技術(shù)。這里選擇爬取“火星引力”的小說“天辰”战虏,推薦大家閱讀“火星引力”的小說拣宰。
一党涕、爬蟲思路
首先,在利用國內(nèi)最大的爬蟲之百度巡社,找到想要爬去的網(wǎng)站膛堤,主要是測試一下網(wǎng)站的訪問速度,再確定是否為選擇目標(biāo)重贺。這次選擇的目標(biāo)就是筆趣閣
選擇目標(biāo)后骑祟,接著就是分析網(wǎng)站,看看網(wǎng)站爬去的難度气笙,再根據(jù)難度選擇爬去目標(biāo)的工具次企。
經(jīng)過分析,該網(wǎng)站的請求方式為GET潜圃,連續(xù)點(diǎn)擊“下一章”缸棵,發(fā)現(xiàn)沒有采用AJAX等技術(shù),URL規(guī)則也比較簡單谭期,確定初始URL及最終URL后就可以爬取所有的章節(jié)了堵第,總之,爬取不會有什么難度隧出,先選擇單線程的方式實(shí)現(xiàn)踏志。
最后,具體的實(shí)現(xiàn)過程胀瞪,先考慮爬取一章的內(nèi)容针余,再保存在本地txt文件中,接著進(jìn)行格式的調(diào)整凄诞,讓文章格式看起來更舒服圆雁,用戶體驗(yàn)感更好,最后再擴(kuò)展到爬取所有的章節(jié)帆谍,保存所有的章節(jié)伪朽。這些都完成后,還可以考慮采取多線程汛蝙、進(jìn)程烈涮、協(xié)程等方式提高爬取的效率,當(dāng)然這是后話患雇。
三跃脊、具體實(shí)現(xiàn)過程
開始擼代碼
import requests
from fake_useragent import UserAgent
import random
from lxml import etree
import time
def parse_page(url,offset):
headers = {
'Cookie': 'fikker-tShm-4UR5=LUtS2wHKlLdAbGv9tKnSBCJKZGZWP3pA; fikker-tShm-4UR5=LUtS2wHKlLdAbGv9tKnSBCJKZGZWP3pA; UM_distinctid=16a5797e00ca7-02a4dfb07b62ea-3b65470f-e1000-16a5797e00e1b4; CNZZDATA1273376891=1130256466-1556246740-https%253A%252F%252Fwww.baidu.com%252F%7C1556246740; bcolor=; font=; fontcolor=; width=; size=12pt',
'Host': 'www.biqiuge.com',
'Referer': 'https://www.biqiuge.com/book/29463/1823{0}.html'.format(offset-1),
'User-Agent': random.choice([UserAgent().chrome, UserAgent().firefox, UserAgent().ie])
}
resp = requests.get(url,headers=headers)
#判斷請求是否成功
if resp.status_code == 200:
fp = open('tiancheng.txt','a',encoding='utf-8')
#設(shè)置網(wǎng)站的編碼方式
resp.encoding = resp.apparent_encoding
tree = etree.HTML(resp.text)
#獲取標(biāo)題
title = tree.xpath('//div[@class="content"]/h1/text()')[0]
#獲取小說內(nèi)容
contents = tree.xpath('//div[@id="content"]//text()')
print('正在保存“天辰”:{0}'.format(title))
#多方嘗試,還是這種一行行的保存格式更好看
fp.write(title + '\n')
for content in contents[:-3]:
content = ''.join(content).strip()
fp.write('\n' + content)
fp.write(100 * '=' + '\n')
fp.close()
else:
print("請求頁面出錯:{0}".format(resp.status_code))
def main():
for offset in range(3971,4536):
url = 'https://www.biqiuge.com/book/29463/1823{0}.html'.format(offset)
parse_page(url,offset)
#限制一下爬取的速度
time.sleep(1)
print("下載完畢")
if __name__ == '__main__':
main()
四苛吱、展示成果
五酪术、分析小說內(nèi)容
from matplotlib.pylab import plt
from wordcloud import WordCloud
import jieba
import re
string = []
text = 'tiancheng.txt'#文件名稱
fp = open(text,'r',encoding='utf-8')#打開文件
cut = jieba.cut(fp.read())#讀取小說
strings = ' '.join(cut)#切割內(nèi)容轉(zhuǎn)換成字符串
string_data = re.sub(r'【|】|=|“|”|《|》|%|\d+|—','', strings)#將字符串中的特殊字符替換位空字符
string.append(string_data)
font = 'C:\Windows\Fonts\msyh.ttc'#微軟黑體字體安裝路徑
wc = WordCloud(font_path=font,
background_color='white',
width=1000,
height=800)
wc.generate_from_text("".join(string))#生成詞云
wc.to_file('tiancheng.png')#保存圖片
plt.imshow(wc)#用plt顯示圖片
plt.axis('off')#不顯示坐標(biāo)軸
plt.show()#顯示圖片
fp.close()#關(guān)閉文件
最后,不用看也知道主角是誰了吧。