Python爬取365好書(shū)中小說(shuō)代碼實(shí)例
需要轉(zhuǎn)載的小伙伴轉(zhuǎn)載后請(qǐng)注明轉(zhuǎn)載的地址
需要用到的庫(kù)
- from bs4 import BeautifulSoup
- import requests
- import time
365好書(shū)鏈接:http://www.365haoshu.com/ 爬取《我以月夜寄相思》小說(shuō)
首頁(yè)進(jìn)入到目錄:http://www.365haoshu.com/Book/Chapter/List.aspx?NovelId=3026
獲取小說(shuō)的每個(gè)章節(jié)的名稱(chēng)和章節(jié)鏈接
打開(kāi)瀏覽器的開(kāi)發(fā)者工具,查找一個(gè)章節(jié):如下圖,找到第一章的名稱(chēng)和href(也就是第一章節(jié)內(nèi)容頁(yè)面的鏈接),開(kāi)始寫(xiě)代碼
from bs4 import BeautifulSoup import requests import time # 分別導(dǎo)入time、requests、BeautifulSoup庫(kù) url = 'http://www.365haoshu.com/Book/Chapter/' # 鏈接地址url,這兒url章節(jié)鏈接沒(méi)全寫(xiě)出來(lái)是因?yàn)橄旅娅@取章節(jié)鏈接時(shí)要用到這些url req = requests.get(url+'List.aspx?NovelId=0326') # 打開(kāi)章節(jié)頁(yè)面, req_bf = BeautifulSoup(req.text,"html.parser") print(req_bf) # 將打開(kāi)的頁(yè)面以text打印出來(lái) div = req_bf.find_all('div',class_='user-catalog-ul-li') # 分析頁(yè)面,所需要的章節(jié)名和章節(jié)鏈接是在div標(biāo)簽,屬性class為user-catalog-ul-li下 # 找到這個(gè)下的內(nèi)容,并打印 s = [] for d in div: s.append(d.find('a')) print(s) # 獲取div下面的a標(biāo)簽下的內(nèi)容 names=[] # 存儲(chǔ)章節(jié)名 hrefs=[] # 存儲(chǔ)章節(jié)鏈接 for i in s: names.append(i.find('span').string) hrefs.append(url + i.get('href')) # 將所有的章節(jié)和章節(jié)鏈接存入的列表中 觀察href后的鏈接和打開(kāi)章節(jié)內(nèi)容頁(yè)面的鏈接是不完全的相同的, 所以要拼接使得瀏覽器能直接打開(kāi)章節(jié)內(nèi)容
獲取到鏈接和章節(jié)名后打開(kāi)一個(gè)章節(jié)獲取文本內(nèi)容;
和獲取章節(jié)名方法一致,一步一步查找到內(nèi)容的位置
txt = requests.get(hrefs[0]) div_bf = BeautifulSoup(txt.text,'html.parser') div = div_bf.find_all('div',class_='container user-reading-online pos-rel') #print(div) ps = BeautifulSoup(str(div),"html.parser") p=ps.find_all('p',class_='p-content') print(p) txt=[] for i in p: txt.append(i.string+'\n') print(txt)
獲取單一章節(jié)完成
接下來(lái)整理代碼,獲取整個(gè)小說(shuō)的內(nèi)容,代碼如下:
# --*-- coding=utf-8 --*-- from bs4 import BeautifulSoup import requests import time class spiderstory(object): def __init__(self): # 初始化 self.url = 'http://www.365haoshu.com/Book/Chapter/' self.names = [] # 存放章節(jié)名 self.hrefs = [] # 存放章節(jié)鏈接 def get_urlAndName(self): '''獲取章節(jié)名和章節(jié)鏈接''' req = requests.get(url=self.url+'List.aspx?NovelId=0326') # 獲取章節(jié)目錄頁(yè)面 time.sleep(1) # 等待1秒 div_bf = BeautifulSoup(req.text,"html.parser") # req后面跟text和html都行 div = div_bf.find_all('div', class_='user-catalog-ul-li') # 查找內(nèi)容,標(biāo)簽為div,屬性為class='user-catalog-ul-li' a_bf = BeautifulSoup(str(div)) a = a_bf.find_all('a') # # 查找內(nèi)容,標(biāo)簽為a for i in a: self.names.append(i.find('span').string) # 獲取內(nèi)容直接string就行 self.hrefs.append(self.url + i.get('href')) # 獲取鏈接 def get_text(self,url): '''獲取章節(jié)內(nèi)容''' req = requests.get(url=url) div_bf = BeautifulSoup(req.text,"html.parser") div = div_bf.find_all('div', class_='container user-reading-online pos-rel') # 查找內(nèi)容 ps = BeautifulSoup(str(div), "html.parser") p = ps.find_all('p', class_='p-content') text = [] for each in p: text.append(each.string) print(text) return text # 將獲得的內(nèi)容返回 def writer(self, name, path, text): '''寫(xiě)入text文檔中''' with open(path, 'a', encoding='utf-8') as f: f.write(name + '\n') f.writelines(text) f.write('\n\n') if __name__ == "__main__": # 運(yùn)行入口 s = spiderstory() s.get_urlAndName() le = len(s.names) for i in range(le): # 利用for循環(huán)獲得所有的內(nèi)容 name = s.names[i] text = str(s.get_text(s.hrefs[i])) s.writer(name,"我以月夜寄相思.txt",text) print('下載完畢!?。?)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
pyqt5 comboBox獲得下標(biāo)、文本和事件選中函數(shù)的方法
今天小編就為大家分享一篇pyqt5 comboBox獲得下標(biāo)、文本和事件選中函數(shù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06用python標(biāo)準(zhǔn)庫(kù)difflib比較兩份文件的異同詳解
今天小編就為大家分享一篇用python標(biāo)準(zhǔn)庫(kù)difflib比較兩份文件的異同詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11把csv文件轉(zhuǎn)化為數(shù)組及數(shù)組的切片方法
今天小編就為大家分享一篇把csv文件轉(zhuǎn)化為數(shù)組及數(shù)組的切片方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07python將類(lèi)似json的數(shù)據(jù)存儲(chǔ)到MySQL中的實(shí)例
今天小編就為大家分享一篇python將類(lèi)似json的數(shù)據(jù)存儲(chǔ)到MySQL中的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07在Django admin中編輯ManyToManyField的實(shí)現(xiàn)方法
今天小編就為大家分享一篇在Django admin中編輯ManyToManyField的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08Django使用模板后無(wú)法找到靜態(tài)資源文件問(wèn)題解決
這篇文章主要介紹了Django使用模板后無(wú)法找到靜態(tài)資源文件問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07Python實(shí)現(xiàn)SMTP發(fā)送郵件詳細(xì)教程
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)SMTP發(fā)送郵件詳細(xì)教程,附SMTP郵件發(fā)送代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08