最近正在學(xué)習(xí) Machine leaning,加之余閑之際,又喜看小說(shuō),故偶生一技,采用機(jī)器學(xué)習(xí)分析金庸小說(shuō)與網(wǎng)絡(luò)小說(shuō)(仙俠類(lèi))的差異几缭;
廢話少道,先看看此次項(xiàng)目的實(shí)現(xiàn)流程:
項(xiàng)目簡(jiǎn)單流程圖
1沃呢、Get Data
首先年栓,要對(duì)比金庸及網(wǎng)絡(luò)小說(shuō)的差異之處,那第一步肯定是獲取數(shù)據(jù)了薄霜,在這里我們選取最近比較火的5部網(wǎng)絡(luò)小說(shuō)某抓,分別為:《天影》、《無(wú)疆》惰瓜、《盜天仙途》否副、《雙天行》、《兩儀道》崎坊,金庸大大的書(shū)副编,就選擇為:《天龍八部》、《倚天屠龍記》流强、《鹿鼎記》痹届、《笑傲江湖》、《神雕俠侶》打月;
書(shū)籍選好了队腐,接下來(lái)便是獲取書(shū)籍的內(nèi)容了,本文采取 Python Request庫(kù)及 BeautifulSoup4 庫(kù)對(duì)書(shū)籍文本進(jìn)行爬取網(wǎng)絡(luò)文學(xué)奏篙,采取 Python Request庫(kù)及 RE庫(kù)進(jìn)行對(duì)金庸大大的書(shū)籍進(jìn)爬炔裉浴;
1秘通、1 Python 爬取書(shū)籍?dāng)?shù)據(jù):
a为严、Request & BeautifulSoup 爬取網(wǎng)絡(luò)文學(xué):
首先,百度一下《天影》肺稀,發(fā)現(xiàn)頂點(diǎn)小說(shuō)內(nèi)可以免費(fèi)閱讀(天影)第股,就已此書(shū)為例爬取此書(shū)到本地;
研究發(fā)現(xiàn)话原,所有的文本鏈接均在一個(gè)類(lèi)別(class)為 chapterlist的標(biāo)簽內(nèi)(dl)夕吻,而且每個(gè)章節(jié)的鏈接為都在 'dd>a' 下,故利用此規(guī)律可以對(duì)此進(jìn)行遍歷及索引繁仁;
其次涉馅,打開(kāi)章節(jié)內(nèi)容,發(fā)現(xiàn)黄虱,文本存儲(chǔ)在 類(lèi)別(class)為 ‘inner’ 的標(biāo)簽內(nèi)(div),而且稚矿,其中 <h1>..</h1>
標(biāo)簽內(nèi)的內(nèi)容為章節(jié)標(biāo)題,<div id='content'>..</div>
,Id 為‘content’的 標(biāo)簽內(nèi)為章節(jié)內(nèi)容(txt);.故可以按照此規(guī)律對(duì)其進(jìn)行遍歷,詳細(xì)程序如下:
import os
import requests
from bs4 import BeautifulSoup #引入基本python使用庫(kù)
def url_requests(url): #定義一個(gè)url處理函數(shù) :url——soup對(duì)象
headers={'User-Agent':'Mozilla/5.0'}
re=requests.get(url,headers=headers,timeout=20)
re.encoding=re.apparent_encoding
if re.status_code==200:
soup=BeautifulSoup(re.text,'html.parser')
return soup
else:
print('linking error')
def file_write(text):#文件寫(xiě)入函數(shù)
with open('天影.text','a',encoding='utf-8') as file:#指定編碼類(lèi)型為‘UTF-8’型
file.write(name+text)
file.close()
if os.path.exists(r'./art')==0:#判斷文件夾是否存在晤揣,若NOT偶翅,創(chuàng)建一個(gè)到本地;
os.mkdir(r'./art')
os.chdir(r'./art')
url='http://www.23us.com/html/65/65090/'
links=url_requests(url).select('td > a')#查詢(xún)所有帶有目的url的 a(Tag)標(biāo)簽
for i in range(len(links)):
urls=url+links[i]['href']
text=url_requests(urls).select_one('#contents').get_text()
name=links[i].get_text()
file_write(text)#引入寫(xiě)入函數(shù)中
同理碉渡,只需要修改一下url 及保存文檔名字,就可以spider 所有的目的小說(shuō)母剥;
b滞诺、Requests&Re(正則表達(dá)式)爬取武俠小說(shuō):
源碼如下:
import re
import requests
from bs4 import BeautifulSoup
import os
def change_url(url):
response=requests.get(url)
response.encoding=response.apparent_encoding
if response.status_code==200:
soup=BeautifulSoup(response.text,'html.parser')
return soup
else:
print('link error 1')
def file_write(text):
with open('倚天屠龍記.text','a',encoding='utf-8') as file:
file.write(text)
file.close()
if os.path.exists(r'./art')==0:
os.mkdir(r'./art')
os.chdir(r'./art')
url='http://jinyong.zuopinj.com/7/'
rs=requests.get(url)
rs.encoding=rs.apparent_encoding
if rs.status_code==200:
links=re.findall(r'href\=\".{29}\d{2,3}.html\"',rs.text) #re:含義為 href="..",比bs4更為簡(jiǎn)潔
for i in range(len(links)):
urls=eval(links[i].split('=')[1])#對(duì)字符串進(jìn)行分割處理
content=change_url(urls).select_one('#htmlContent').get_text()
file_write(content)
else:
print('link error 0') #PS:其實(shí)從此份代碼可以看出环疼,有時(shí)候用正則庫(kù)可能還不如用bs4庫(kù)方便
下一小節(jié)习霹,更新第二點(diǎn)數(shù)據(jù)處理