本節(jié)通過(guò)具體的爬蟲(chóng)程序,演示BS4解析庫(kù)的實(shí)際應(yīng)用。爬蟲(chóng)程序目標(biāo):下載詩(shī)詞名句網(wǎng)(https://www.shicimingju.com/book/)《兩晉演義》小說(shuō)。 關(guān)于分析網(wǎng)頁(yè)分過(guò)程,這里不再做詳細(xì)介紹了,只要通讀了前面的文章,那么關(guān)于如何分析網(wǎng)頁(yè),此時(shí)您應(yīng)該了然于胸了。其實(shí),無(wú)論您爬取什么類型的網(wǎng)站,分析過(guò)程總是相似的。 案例簡(jiǎn)單分析首先判網(wǎng)站屬于靜態(tài)網(wǎng)站,因此您的主要任務(wù)是分析網(wǎng)頁(yè)元素的組成,然后使用BS4提取所需的信息。如下所示: 提取到a標(biāo)簽是解決本程序的重點(diǎn),a標(biāo)簽的頁(yè)面代碼結(jié)構(gòu)如下所示: <div class="book-mulu"> <ul> <li><a href="/book/liangjinyanyi/1.html">自序</a></li> <li><a href="/book/liangjinyanyi/2.html">第一回 祀南郊司馬開(kāi)基 立東宮庸雛伏禍</a></li> <li><a href="/book/liangjinyanyi/3.html">第二回 墮詭計(jì)儲(chǔ)君納婦 慰癡情少女偷香</a></li> ...123456復(fù)制代碼類型:[python] 從上述代碼可以看出,a標(biāo)簽包含了目錄名稱以及詳情頁(yè)的地址鏈接。那么如何獲取a標(biāo)簽?zāi)???jīng)過(guò)簡(jiǎn)單分析后可知a標(biāo)簽屬于div>ul>li的子節(jié)點(diǎn),因此可以使用BS4的select()獲取。如下所示: list_name = soup.select('.book-mulu > ul > li > a')1復(fù)制代碼類型:[python] 上述代碼的返回值是一個(gè)列表,列表中每一個(gè)元素都是一個(gè)Tag對(duì)象,類型為<class'bs4.element.Tag'>。 下載詳情頁(yè)的URL也非常容易獲得,它是由發(fā)起請(qǐng)求的URL與a標(biāo)簽的herf鏈接拼接而成。因此通過(guò)字符串拼接就可以獲取下載詳內(nèi)容頁(yè)的URL。 https://www.shicimingju.com/book/liangjinyanyi/2.html https://www.shicimingju.com/book/liangjinyanyi/3.html12復(fù)制代碼類型:[python] 最后一步是提取具體的內(nèi)容。通過(guò)分析詳情頁(yè)的元素構(gòu)成可知,我們想要的內(nèi)容都包含在以下標(biāo)簽中: <div class="chapter_content"> 具體內(nèi)容 </div>123復(fù)制代碼類型:[python] 因此使用BS4的find()方法就可以獲取所需內(nèi)容,如下所示: artist = soup.find('div', class_='chapter_content')1復(fù)制代碼類型:[python] 之后把獲取的內(nèi)容寫入到txt文件中就可以了。下面我使用之前學(xué)習(xí)過(guò)的urllib模塊與BS4模塊編寫爬蟲(chóng)程序,這樣才能做到溫故而知新。 編寫爬蟲(chóng)程序代碼如下所示,程序中已經(jīng)做了詳細(xì)的注釋: import urllib.requestimport randomfrom bs4 import BeautifulSoupimport timedef request_html(url): headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'} request = urllib.request.Request(url, headers=headers) return requestdef parse_html(html, f): # 生成soup對(duì)象 soup = BeautifulSoup(html, 'lxml') # 查找所有的章節(jié)鏈接和標(biāo)題內(nèi)容 list_name = soup.select('.book-mulu > ul > li > a') # 遍歷每一個(gè)列表中的tag對(duì)象,獲取鏈接個(gè)目錄 for item in list_name: # 獲取鏈接 #item: <a href="/book/liangjinyanyi/1.html">自序</a> #拼接目錄鏈接,此處item類型為<class 'bs4.element.Tag'>,使用下面方法可以值獲取href屬性值 href = 'http://www.shicimingju.com' + item['href'] # 獲取標(biāo)題 title = item.text print('正在下載:-**--%s--**-......' % title) # 獲取章節(jié)內(nèi)容函數(shù) text = get_text(href) # 寫入文件 f.write(title + '\n' + text) print('結(jié)束下載:-**--%s--**-' % title) time.sleep(random.uniform(0,1))# 提取章節(jié)內(nèi)容def get_text(href): #創(chuàng)建請(qǐng)求對(duì)象 request = request_html(href) content = urllib.request.urlopen(request).read().decode('utf8') soup = BeautifulSoup(content, 'lxml') # 查找包含內(nèi)容的tag--div artist = soup.find('div', class_='chapter_content') #獲取tag標(biāo)簽中的文本內(nèi)容 return artist.textdef run(): # 打開(kāi)文件 f = open('兩晉演義.txt', 'w', encoding='utf8') url = 'http://www.shicimingju.com/book/liangjinyanyi.html' # 構(gòu)建請(qǐng)求對(duì)象 request = request_html(url) # 發(fā)送請(qǐng)求,得到響應(yīng),轉(zhuǎn)換為HTML對(duì)象 html = urllib.request.urlopen(request).read().decode('utf8') # 解析內(nèi)容 parse_html(html,f) #關(guān)閉文件 f.close()if __name__ == '__main__': run()12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152復(fù)制代碼類型:[python] 程序運(yùn)行結(jié)果: 正在下載:-**--自序--**-...... 結(jié)束下載:-**--自序--**- 正在下載:-**--第一回 祀南郊司馬開(kāi)基 立東宮庸雛伏禍--**-...... 結(jié)束下載:-**--第一回 祀南郊司馬開(kāi)基 立東宮庸雛伏禍--**- 正在下載:-**--第二回 墮詭計(jì)儲(chǔ)君納婦 慰癡情少女偷香--**-...... .... |
|
來(lái)自: 碼農(nóng)9527 > 《Python》