看完python這段爬蟲代碼,java流淚了c#沉默了


哈哈,其實很簡單,寥寥幾行代碼網頁爬一部小說,不賣關子,立刻開始。

首先安裝所需的包,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+"保存成功")

 

 

文章成功爬取,文件成功保存,搞定。就這么簡單的幾行代碼搞定。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM