廢話不多說,直接進入正題。
今天我要爬取的網站是起點中文網,內容是一部小說。
首先是引入庫
from urllib.request import urlopen from bs4 import BeautifulSoup
然后將網址賦值
html=urlopen("http://read.qidian.com/chapter/dVQvL2RfE4I1/hJBflakKUDMex0RJOkJclQ2.html") //小說的第一章的網址 bsObj=BeautifulSoup(html) //創建beautifulsoup對象
首先嘗試爬取該頁的小說內容
firstChapter=bsObj.find("div",{"class","read-content"}) //find方法是beautifulsoup對象擁有的函數, print (firstChapter.read_text())
find方法也可以和正則表達式搭配使用,並且多用於圖片,視頻等資源的爬取
由於本次爬取內容全在一個class屬性值為read-content的盒子中,所以采用了find方法,如果該網頁中,文字被放在多個盒子里,則應采用findAll方法,並且返回值為一個集合,需要用循環遍歷輸出。
將代碼整合運行,發現可以實現文章的爬取,但是現在的問題是,爬取了該小說的一章,那么,往后的幾章該如何爬取呢?
由前面步驟可以得出,只要得知下一章的網址,即可進行爬取。首先,將打印文字的部分封裝為函數,那么,每次取得新的地址,即可打印出對應文本
def writeNovel(html): bsObj=BeautifulSoup(html) chapter=bsObj.find("div",{"class","read-content"}) print (chapter.get_text())
現在的問題是如何爬取下一章的網址,觀察網頁結構可得知,下一章的按鈕實質是一個id為j_chapterNext的a標簽,那么,可由這個標簽獲得下一章的網址
重新包裝函數,整理得:
from urllib.request import urlopen
from bs4 import BeautifulSoup
def writeNovel(html):
bsObj=BeautifulSoup(html)
chapter=bsObj.find("div",{"class","read-content"})
print (chapter.get_text())
bsoup=bsObj.find("",{"id":"j_chapterNext"})
html2="http:"+bsoup.get('href')+".html"
return (urlopen(html2))
html=urlopen("http://read.qidian.com/chapter/dVQvL2RfE4I1/hJBflakKUDMex0RJOkJclQ2.html")
i=1
while(i<10):
html=writeNovel(html)
i=i+1
將文本寫入text文件中
from urllib.request import urlopen from bs4 import BeautifulSoup def writeNovel(html): bsObj=BeautifulSoup(html) chapter=bsObj.find("div",{"class","read-content"}) print (chapter.get_text()) fo=open("novel.text","a") fo.write(chapter.get_text()) fo.close bsoup=bsObj.find("",{"id":"j_chapterNext"}) html2="http:"+bsoup.get('href')+".html" return (urlopen(html2)) html=urlopen("http://read.qidian.com/chapter/dVQvL2RfE4I1/hJBflakKUDMex0RJOkJclQ2.html") i=1 while(i<8): html=writeNovel(html) i=i+1