哈哈,其實很簡單,寥寥幾行代碼網頁爬一部小說,不賣關子,立刻開始。 首先安裝所需的包,requests,BeautifulSoup4 控制台執行 pip install requests pip install BeautifulSoup4 如果不能正確安裝,請檢查你的環境變數,至於環境變數配置,在 ...
哈哈,其實很簡單,寥寥幾行代碼網頁爬一部小說,不賣關子,立刻開始。
首先安裝所需的包,requests,BeautifulSoup4
控制台執行
pip install requests
pip install BeautifulSoup4
如果不能正確安裝,請檢查你的環境變數,至於環境變數配置,在這裡不再贅述,相關文章有很多。
兩個包的安裝命令都結束後,輸入pip list
可以看到,兩個包都成功安裝了。
好的,我們立刻開始編寫代碼。
我們的目標是抓取這個鏈接下所有小說的章節 https://book.qidian.com/info/1013646681#Catalog
我們訪問頁面,用chrome調試工具查看元素,查看各章節的html屬性。我們發現所有章節父元素是<ul class="cf">這個元素,章節的鏈接以及標題,在子<li>下的<a>標簽內。
那我們第一步要做的事,就是要提取所有章節的鏈接。
'用於進行網路請求' import requests chapter = requests.get("https://book.qidian.com/info/1013646681#Catalog") print(chapter.text)
頁面順利的請求到了,接下來我們從頁面中抓取相應的元素
'用於進行網路請求' import requests '用於解析html' from bs4 import BeautifulSoup chapter = requests.get("https://book.qidian.com/info/1013646681#Catalog") ul_bs = BeautifulSoup(chapter.text) '提取class為cf的ul標簽' ul = ul_bs.find_all("ul",class_="cf") print(ul)
ul也順利抓取到了,接下來我們遍歷<ul>下的<a>標簽取得所有章節的章節名與鏈接
'用於進行網路請求' import requests '用於解析html' from bs4 import BeautifulSoup chapter = requests.get("https://book.qidian.com/info/1013646681#Catalog") ul_bs = BeautifulSoup(chapter.text) '提取class為cf的ul標簽' ul = ul_bs.find_all("ul",class_="cf") ul_bs = BeautifulSoup(str(ul[0])) '找到<ul>下的<a>標簽' a_bs = ul_bs.find_all("a") '遍歷<a>的href屬性跟text' for a in a_bs: href = a.get("href") text = a.get_text() print(href) print(text)
ok,所有的章節鏈接搞定,我們去看想想章節詳情頁面長什麼樣,然後我們具體制定詳情頁面的爬取計劃。
打開一個章節,用chrome調試工具審查一下。文章標題保存在<h3 class="j_chapterName">中,正文保存在<div class="read-content j_readContent">中。
我們需要從這兩個標簽中提取內容。
'用於進行網路請求' import requests '用於解析html' from bs4 import BeautifulSoup chapter = requests.get("https://book.qidian.com/info/1013646681#Catalog") ul_bs = BeautifulSoup(chapter.text) '提取class為cf的ul標簽' ul = ul_bs.find_all("ul",class_="cf") ul_bs = BeautifulSoup(str(ul[0])) '找到<ul>下的<a>標簽' a_bs = ul_bs.find_all("a") detail = requests.get("https:"+a_bs[0].get("href")) text_bs = BeautifulSoup(detail.text) text = text_bs.find_all("div",class_ = "read-content j_readContent") print(text)
正文頁很順利就爬取到了,以上代碼僅是用第一篇文章做示範,通過調試文章已經可以爬取成功,所有下一步我們只要把所有鏈接遍歷逐個提取就好了
'用於進行網路請求' import requests '用於解析html' from bs4 import BeautifulSoup chapter = requests.get("https://book.qidian.com/info/1013646681#Catalog") ul_bs = BeautifulSoup(chapter.text) '提取class為cf的ul標簽' ul = ul_bs.find_all("ul",class_="cf") ul_bs = BeautifulSoup(str(ul[0])) '找到<ul>下的<a>標簽' a_bs = ul_bs.find_all("a") '遍歷所有<href>進行提取' for a in a_bs: detail = requests.get("https:"+a.get("href")) d_bs = BeautifulSoup(detail.text) '正文' content = d_bs.find_all("div",class_ = "read-content j_readContent") '標題' name = d_bs.find_all("h3",class_="j_chapterName")[0].get_text()
在上圖中我們看到正文中的每一個<p>標簽為一個段落,提取的文章包含很多<p>標簽這也是我們不希望的,接下來去除p標簽。
但是去除<p>標簽後文章就沒有段落格式了呀,這樣的閱讀體驗很不爽的,我們只要在每個段落的結尾加一個換行符就好了
'用於進行網路請求' import requests '用於解析html' from bs4 import BeautifulSoup chapter = requests.get("https://book.qidian.com/info/1013646681#Catalog") ul_bs = BeautifulSoup(chapter.text) '提取class為cf的ul標簽' ul = ul_bs.find_all("ul",class_="cf") ul_bs = BeautifulSoup(str(ul[0])) '找到<ul>下的<a>標簽' a_bs = ul_bs.find_all("a") '遍歷所有<href>進行提取' for a in a_bs: detail = requests.get("https:"+a.get("href")) d_bs = BeautifulSoup(detail.text) '正文' content = d_bs.find_all("div",class_ = "read-content j_readContent") '標題' name = d_bs.find_all("h3",class_="j_chapterName")[0].get_text() txt = "" p_bs = BeautifulSoup(str(content)) '提取每個<p>標簽的內容' for p in p_bs.find_all("p"): txt = txt + p.get_text()+"\r\n"
去掉<p>標簽了,所有的工作都做完了,我們只要把文章保存成一個txt就可以了,txt的文件名以章節來命名。
'用於進行網路請求' import requests '用於解析html' from bs4 import BeautifulSoup def create_txt(path,txt): fd = None try: fd = open(path,'w+',encoding='utf-8') fd.write(txt) except: print("error") finally: if (fd !=None): fd.close() chapter = requests.get("https://book.qidian.com/info/1013646681#Catalog") ul_bs = BeautifulSoup(chapter.text) '提取class為cf的ul標簽' ul = ul_bs.find_all("ul",class_="cf") ul_bs = BeautifulSoup(str(ul[0])) '找到<ul>下的<a>標簽' a_bs = ul_bs.find_all("a") '遍歷所有<href>進行提取' for a in a_bs: detail = requests.get("https:"+a.get("href")) d_bs = BeautifulSoup(detail.text) '正文' content = d_bs.find_all("div",class_ = "read-content j_readContent") '標題' name = d_bs.find_all("h3",class_="j_chapterName")[0].get_text() path = 'F:\\test\\' path = path + name+".txt" txt = "" p_bs = BeautifulSoup(str(content)) '提取每個<p>標簽的內容' for p in p_bs.find_all("p"): txt = txt + p.get_text()+"\r\n" create_txt(path,txt) print(path+"保存成功")
文章成功爬取,文件成功保存,搞定。就這麼簡單的幾行代碼搞定。