最近正在學(xué)習(xí) Machine leaning,加之余閑之際,又喜看小說,故偶生一技,采用機器學(xué)習(xí)分析金庸小說與網(wǎng)絡(luò)小說(仙俠類)的差異;
廢話少道,先看看此次項目的實現(xiàn)流程:
項目簡單流程圖
1、Get Data
首先,要對比金庸及網(wǎng)絡(luò)小說的差異之處,那第一步肯定是獲取數(shù)據(jù)了,在這里我們選取最近比較火的5部網(wǎng)絡(luò)小說,分別為:《天影》、《無疆》、《盜天仙途》、《雙天行》、《兩儀道》,金庸大大的書,就選擇為:《天龍八部》、《倚天屠龍記》、《鹿鼎記》、《笑傲江湖》、《神雕俠侶》;
書籍選好了,接下來便是獲取書籍的內(nèi)容了,本文采取 Python Request庫及 BeautifulSoup4 庫對書籍文本進行爬取網(wǎng)絡(luò)文學(xué),采取 Python Request庫及 RE庫進行對金庸大大的書籍進爬取;
1、1 Python 爬取書籍?dāng)?shù)據(jù):
a、Request & BeautifulSoup 爬取網(wǎng)絡(luò)文學(xué):
首先,百度一下《天影》,發(fā)現(xiàn)頂點小說內(nèi)可以免費閱讀(天影),就已此書為例爬取此書到本地;
研究發(fā)現(xiàn),所有的文本鏈接均在一個類別(class)為 chapterlist的標(biāo)簽內(nèi)(dl),而且每個章節(jié)的鏈接為都在 'dd>a' 下,故利用此規(guī)律可以對此進行遍歷及索引;
其次,打開章節(jié)內(nèi)容,發(fā)現(xiàn),文本存儲在 類別(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ī)律對其進行遍歷,詳細程序如下:
import os
import requests
from bs4 import BeautifulSoup #引入基本python使用庫
def url_requests(url): #定義一個url處理函數(shù) :url——soup對象
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):#文件寫入函數(shù)
with open('天影.text','a',encoding='utf-8') as file:#指定編碼類型為‘UTF-8’型
file.write(name+text)
file.close()
if os.path.exists(r'./art')==0:#判斷文件夾是否存在,若NOT,創(chuàng)建一個到本地;
os.mkdir(r'./art')
os.chdir(r'./art')
url='http://www.23us.com/html/65/65090/'
links=url_requests(url).select('td > a')#查詢所有帶有目的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)#引入寫入函數(shù)中
同理,只需要修改一下url 及保存文檔名字,就可以spider 所有的目的小說;
b、Requests&Re(正則表達式)爬取武俠小說:
源碼如下:
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更為簡潔
for i in range(len(links)):
urls=eval(links[i].split('=')[1])#對字符串進行分割處理
content=change_url(urls).select_one('#htmlContent').get_text()
file_write(content)
else:
print('link error 0') #PS:其實從此份代碼可以看出,有時候用正則庫可能還不如用bs4庫方便
下一小節(jié),更新第二點數(shù)據(jù)處理