本節(jié)通過具體的爬蟲程序,,演示BS4解析庫的實(shí)際應(yīng)用,。爬蟲程序目標(biāo):下載詩詞名句網(wǎng)(https://www.shicimingju.com/book/)《兩晉演義》小說。 關(guān)于分析網(wǎng)頁分過程,這里不再做詳細(xì)介紹了,只要通讀了前面的文章,那么關(guān)于如何分析網(wǎng)頁,,此時(shí)您應(yīng)該了然于胸了。其實(shí),,無論您爬取什么類型的網(wǎng)站,,分析過程總是相似的。 案例簡單分析首先判網(wǎng)站屬于靜態(tài)網(wǎng)站,,因此您的主要任務(wù)是分析網(wǎng)頁元素的組成,,然后使用BS4提取所需的信息。如下所示: 提取到a標(biāo)簽是解決本程序的重點(diǎn),,a標(biāo)簽的頁面代碼結(jié)構(gòu)如下所示: <div class="book-mulu"> <ul> <li><a href="/book/liangjinyanyi/1.html">自序</a></li> <li><a href="/book/liangjinyanyi/2.html">第一回 祀南郊司馬開基 立東宮庸雛伏禍</a></li> <li><a href="/book/liangjinyanyi/3.html">第二回 墮詭計(jì)儲(chǔ)君納婦 慰癡情少女偷香</a></li> ...123456復(fù)制代碼類型:[python] 從上述代碼可以看出,,a標(biāo)簽包含了目錄名稱以及詳情頁的地址鏈接。那么如何獲取a標(biāo)簽?zāi)???jīng)過簡單分析后可知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對象,,類型為<class'bs4.element.Tag'>。 下載詳情頁的URL也非常容易獲得,,它是由發(fā)起請求的URL與a標(biāo)簽的herf鏈接拼接而成,。因此通過字符串拼接就可以獲取下載詳內(nèi)容頁的URL,。 https://www.shicimingju.com/book/liangjinyanyi/2.html https://www.shicimingju.com/book/liangjinyanyi/3.html12復(fù)制代碼類型:[python] 最后一步是提取具體的內(nèi)容。通過分析詳情頁的元素構(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í)過的urllib模塊與BS4模塊編寫爬蟲程序,,這樣才能做到溫故而知新,。 編寫爬蟲程序代碼如下所示,程序中已經(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對象 soup = BeautifulSoup(html, 'lxml') # 查找所有的章節(jié)鏈接和標(biāo)題內(nèi)容 list_name = soup.select('.book-mulu > ul > li > a') # 遍歷每一個(gè)列表中的tag對象,,獲取鏈接個(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)建請求對象 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(): # 打開文件 f = open('兩晉演義.txt', 'w', encoding='utf8') url = 'http://www.shicimingju.com/book/liangjinyanyi.html' # 構(gòu)建請求對象 request = request_html(url) # 發(fā)送請求,得到響應(yīng),,轉(zhuǎn)換為HTML對象 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é)束下載:-**--自序--**- 正在下載:-**--第一回 祀南郊司馬開基 立東宮庸雛伏禍--**-...... 結(jié)束下載:-**--第一回 祀南郊司馬開基 立東宮庸雛伏禍--**- 正在下載:-**--第二回 墮詭計(jì)儲(chǔ)君納婦 慰癡情少女偷香--**-...... .... |
|