一.三大在線百科
隨著互聯網和大數據的飛速發展,我們需要從海量信息中挖掘出有價值的信息,而在收集這些海量信息過程中,通常都會涉及到底層數據的抓取構建工作,比如多源知識庫融合、知識圖譜構建、計算引擎建立等。其中具有代表性的知識圖譜應用包括谷歌公司的Knowledge Graph、Facebook推出的實體搜索服務(Graph Search)、百度公司的百度知心、搜狗公司的搜狗知立方等。這些應用的技術可能會有所區別,但相同的是它們在構建過程中都利用了Wikipedia、百度百科、互動百科等在線百科知識。所以本章將教大家分別爬取這三大在線百科。
百科是指天文、地理、自然、人文、宗教、信仰、文學等全部學科的知識的總稱,它可以是綜合性的,包含所有領域的相關內容;也可以是面向專業性的。接下來將介紹常見的三大在線百科,它們是信息抽取研究的重要語料庫之一。
1.Wikipedia
「Wikipedia is a free online encyclopedia with the aim to allow anyone to edit articles.」 這是Wikipedia的官方介紹。Wikipedia是一個基於維基技術的多語言百科全書協作計劃,用多種語言編寫的網路百科全書。Wikipedia一詞取自於該網站核心技術「Wiki」以及具有百科全書之意的「encyclopedia」共同創造出來的新混成詞「Wikipedia」,接受任何人編輯。
在所有在線百科中,Wikipedia知識準確性最好,結構化最好,但是Wikipedia本以英文知識為主,涉及的中文知識很少。在線百科頁面通常包括:Title(標題)、Description(摘要描述)、InfoBox(消息盒)、Categories(實體類別)、Crosslingual Links(跨語言鏈接)等。Wikipedia中實體「黃果樹瀑布」的中文頁面信息如圖1所示。
圖1所示的Wikipedia信息主要包括:
- 文章標題(Article Title):唯一標識一篇文章(除存在歧義的頁面),即對應一個實體,對應圖中的「黃果樹瀑布」。
- 摘要(Abstract):通過一段或兩段精簡的信息對整篇文章或整個實體進行描述,它具有重要的使用價值。
- 自由文本(Free Text):自由文本包括全文本內容和部分文本內容。全文本內容是描述整篇文章的所有文本信息,包括摘要信息和各個部分的信息介紹。部分文本內容是描述一篇文章的部分文本信息,用戶可以自定義摘取。
- 分類標籤(Category Label):用於鑒定該篇文章所屬的類型,如圖中「黃果樹瀑布」包括的分類標籤有「國家5A級旅遊景區」、「中國瀑布」、「貴州旅遊」等。
- 消息盒(InfoBox):又稱為信息模塊或信息盒。它採用結構化形式展現網頁信息,用於描述文章或實體的屬性和屬性值信息。消息盒包含了一定數量的「屬性-屬性值」對,聚集了該篇文章的核心信息,用於表徵整個網頁或實體。
2.百度百科
百度百科是百度公司推出的一部內容開放、自由的網路百科全書平台。截至2017年4月,百度百科已經收錄了超過1432萬的詞條,參與詞條編輯的網友超過610萬人,幾乎涵蓋了所有已知的知識領域。百度百科旨在創造一個涵蓋各領域知識的中文信息收集平台。百度百科強調用戶的參與和奉獻精神,充分調動互聯網用戶的力量,匯聚廣大用戶的頭腦智慧,積極進行交流和分享。同時,百度百科實現與百度搜索、百度知道的結合,從不同的層次上滿足用戶對信息的需求。
與Wikipedia相比,百度百科所包含中文知識最多最廣,但是準確性相對較差。百度百科頁面也包括:Title(標題)、Description(摘要描述)、InfoBox(消息盒)、Categories(實體類別)、Crosslingual Links(跨語言鏈接)等。圖2為百度百科「Python」網頁知識,該網頁的消息盒為中間部分,採用鍵值對(Key-value Pair)的形式,比如「外文名」對應的值為「Python」,「經典教材」對應的值為「Head First Python」等。
3.互動百科
互動百科(www.baike.com)是中文百科網站的開拓與領軍者,致力於為數億中文用戶免費提供海量、全面、及時的百科信息,並通過全新的維基平台不斷改善用戶對信息的創作、獲取和共享方式。截止到2016年年底,互動百科已經發展成為由超過1100萬用戶共同打造的擁有1600萬詞條、2000萬張圖片、5萬個微百科的百科網站,新媒體覆蓋人群1000餘萬人,手機APP用戶超2000萬。
相對於百度百科而言,互動百科的準確性更高、結構化更好,在專業領域上知識質量較高,故研究者通常會選擇互動百科作為主要語料之一。圖3顯示的是互動百科的首頁。
互動百科的信息分為兩種形式存儲,一種是百科中結構化的信息盒,另一種是百科正文的自由文本。對於百科中的詞條文章來說,只有少數詞條含有結構化信息盒,但所有詞條均含有自由文本。信息盒是採用結構化方式展現詞條信息的形式,一個典型的百科信息盒展示例子如圖4,顯示了Python的InfoBox信息,採用鍵值對的形式呈現,比如Python的「設計人」為「Guido van Rossum」。
下面分別講解Selenium技術爬取三大在線百科的消息盒,三大百科的分析方法略有不同。Wikipedia先從列表頁面分別獲取20國集團(簡稱G20)各國家的鏈接,再依次進行網頁分析和信息爬取;百度百科調用selenium自動操作,輸入各種編程語言名,再進行訪問定位爬取;互動百科採用分析網頁的鏈接url,再去到不同的景點進行分析及信息抓取。
二.Selenium爬取百度百科知識
百度百科作為最大的中文在線百科或中文知識平台,它提供了各行各業的知識,可以供研究者從事各方面的研究。雖然詞條的準確率不是最好,但依然可以為從事數據挖掘、知識圖譜、自然語言處理、大數據等領域的學者提供很好的知識平台。
1.網頁分析
本小節將詳細講解Selenium爬取百度百科消息盒的例子,爬取的主題為10個國家5A級景區,其中景區的名單定義在TXT文件中,然後再定向爬取它們的消息盒信息。其中網頁分析的核心步驟如下:
(1) 調用Selenium自動搜索百度百科關鍵詞
首先,調用Selenium技術訪問百度百科首頁,網址為「https://baike.baidu.com」,圖5為百度百科首頁,其頂部為搜索框,輸入相關詞條如「故宮」,點擊「進入詞條」,可以得到故宮詞條的詳細信息。
然後,在瀏覽器滑鼠選中「進入詞條」按鈕,右鍵滑鼠點擊「審查元素」,可以查看該按鈕對應的HTML源代碼,如圖6所示。注意,不同瀏覽器查看網頁控制項或內容對應源代碼的稱呼是不同的,圖中使用的是360安全瀏覽器,稱呼為「審查元素」,而Chrome瀏覽器稱為「檢查」,QQ瀏覽器稱為「檢查」等。
「進入詞條」對應的HTML核心代碼如下所示:
<div class="form">
<form id="searchForm" action="/search/word" method="GET">
<input id="query" nslog="normal" name="word" type="text"
autocomplete="off" autocorrect="off" value="">
<button id="search" nslog="normal" type="button">
進入詞條
</button>
<button id="searchLemma" nslog="normal" type="button">
全站搜索
</button>
<a class="help" href="/help" nslog="normal" target="_blank">
幫助
</a>
</form>
...
</div>
調用Selenium函數可以獲取輸入框input控制項。
find_element_by_xpath("//form[@id=『searchForm』]/input")
然後自動輸入「故宮」,獲取按鈕「進入詞條」並自動點擊,這裡採用的方法是在鍵盤上輸入回車鍵即可訪問「故宮」界面,核心代碼如下所示:
driver.get("http://baike.baidu.com/")
elem_inp=driver.find_element_by_xpath("//form[@id='searchForm']/input")
elem_inp.send_keys(name)
elem_inp.send_keys(Keys.RETURN)
(2) 調用Selenium訪問「故宮」頁面並定位消息盒
第一步完成後,進入「故宮」頁面然後找到中間消息盒InfoBox部分,右鍵滑鼠並點擊「審查元素」,返回結果如圖7所示。
消息盒核心代碼如下:
消息盒主要採用<屬性-屬性值>的形式存儲,詳細概括了「故宮」實體的信息。例如,屬性「中文名稱」對應值為「北京故宮」,屬性「外文名稱」對應值為「Fobidden City」。對應的HTML部分源代碼如下。
<div class="basic-info J-basic-info cmn-clearfix">
<dl class="basicInfo-block basicInfo-left">
<dt class="basicInfo-item name">中文名稱</dt>
<dd class="basicInfo-item value">
北京故宮
</dd>
<dt class="basicInfo-item name">外文名稱</dt>
<dd class="basicInfo-item value">
Forbidden City
</dd>
<dt class="basicInfo-item name">類 別</dt>
<dd class="basicInfo-item value">
世界文化遺產、歷史古迹、歷史博物館
</dd>
</dl>
...
<dl class="basicInfo-block basicInfo-right">
<dt class="basicInfo-item name">建築面積</dt>
<dd class="basicInfo-item value">
約15萬平方米
</dd>
<dt class="basicInfo-item name">著名景點</dt>
<dd class="basicInfo-item value">
三大殿、乾清宮、養心殿、皇極殿
</dd>
</dl>
...
</div>
整個消息盒位於< div class=「basic-info J-basic-info cmn-clearfix」 >標籤中,接下來是< dl >、< dt >、< dd >一組合HTML標籤,其中消息盒div布局共包括兩個< dl >…</ dl >布局,一個是記錄消息盒左邊部分的內容,另一個< dl >記錄了消息盒右部分的內容,每個< dl >標籤里再定義屬性和屬性值,如圖8所示。
注意:使用dt、dd最外層必須使用dl包裹,< dl >標籤定義了定義列表(Definition List),< dt >標籤定義列表中的項目,< dd >標籤描述列表中的項目,此組合標籤叫做表格標籤,與table表格組合標籤類似。
接下來調用Selenium擴展包的find_elements_by_xpath()函數分別定位屬性和屬性值,該函數返回多個屬性及屬性值集合,再通過for循環輸出已定位的多個元素值。代碼如下:
elem_name=driver.find_elements_by_xpath("//div[@class='basic-info J-basic-info cmn-clearfix']/dl/dt")
elem_value=driver.find_elements_by_xpath("//div[@class='basic-info J-basic-info cmn-clearfix']/dl/dd")
for e in elem_name:
print(e.text)
for e in elem_value:
print(e.text)
此時,使用Selenium技術爬取百度百科國家5A級景區的分析方法就講解完了,下面是這部分完整的代碼及一些難點。
2.代碼實現
注意,接下來我們嘗試定義多個Python文件相互調用實現爬蟲功能。完整代碼包括兩個文件,即:
- test10_01_baidu.py:定義了主函數main並調用getinfo.py文件
- getinfo.py:通過getInfobox()函數爬取消息盒
test10_01_baidu.py
# -*- coding: utf-8 -*-
"""
test10_01_baidu.py
定義了主函數main並調用getinfo.py文件
By:Eastmount CSDN 2021-06-23
"""
import codecs
import getinfo #引用模塊
#主函數
def main():
#文件讀取景點信息
source = open('data.txt','r',encoding='utf-8')
for name in source:
print(name)
getinfo.getInfobox(name)
print('End Read Files!')
source.close()
if __name__ == '__main__':
main()
在代碼中調用「import getinfo」代碼導入getinfo.py文件,導入之後就可以在main函數中調用getinfo.py文件中的函數和屬性,接著我們調用getinfo.py文件中的getInfobox()函數,執行爬取消息盒的操作。
getinfo.py
# coding=utf-8
"""
getinfo.py:獲取信息
By:Eastmount CSDN 2021-06-23
"""
import os
import codecs
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
#getInfobox函數: 獲取國家5A級景區消息盒
def getInfobox(name):
try:
#訪問百度百科並自動搜索
driver = webdriver.Firefox()
driver.get("http://baike.baidu.com/")
elem_inp = driver.find_element_by_xpath("//form[@id='searchForm']/input")
elem_inp.send_keys(name)
elem_inp.send_keys(Keys.RETURN)
time.sleep(1)
print(driver.current_url)
print(driver.title)
#爬取消息盒InfoBox內容
elem_name=driver.find_elements_by_xpath("//div[@class='basic-info J-basic-info cmn-clearfix']/dl/dt")
elem_value=driver.find_elements_by_xpath("//div[@class='basic-info J-basic-info cmn-clearfix']/dl/dd")
"""
for e in elem_name:
print(e.text)
for e in elem_value:
print(e.text)
"""
#構建欄位成對輸出
elem_dic = dict(zip(elem_name,elem_value))
for key in elem_dic:
print(key.text,elem_dic[key].text)
time.sleep(5)
return
except Exception as e:
print("Error: ",e)
finally:
print('\n')
driver.close()
比如爬取過程Firefox瀏覽器會自動搜索「故宮」頁面,如下圖所示:
最終輸出結果如下圖所示:
內容如下:
https://baike.baidu.com/item/北京故宮
北京故宮_百度百科
https://baike.baidu.com/item/%E5%8C%97%E4%BA%AC%E6%95%85%E5%AE%AB
北京故宮_百度百科
中文名 北京故宮
地理位置 北京市東城區景山前街4號 [91]
開放時間 4.1-10.31:08:20-17:00(停止售票16:00,最晚入園16:10) ;11.1-3.31:08:30-16:30(停止售票15:30,最晚入園15:40) ;除法定節假日外每周一閉館 [6] [91]
景點級別 AAAAA級
門票價格 60元旺季/40元淡季 [7]
佔地面積 72萬平方米(建築面積約15萬平方米)
保護級別 世界文化遺產;第一批全國重點文物保護單位
批准單位 聯合國教科文組織;中華人民共和國國務院
批 號 III-100
主要藏品 清明上河圖、乾隆款金甌永固杯、酗亞方樽
別 名 紫禁城 [8]
官方電話 010-85007057 [92]
Python運行結果如下所示,其中data.txt文件中包括了常見的幾個景點。
- 北京故宮
- 黃果樹瀑布
- 頤和園
- 八達嶺長城
- 明十三陵
- 恭王府
- 北京奧林匹克公園
- 黃山
上述代碼屬性和屬性值通過字典進行組合輸出的,核心代碼如下:
elem_dic = dict(zip(elem_name,elem_value))
for key in elem_dic:
print(key.text,elem_dic[key].text)
同時,讀者可以嘗試調用本地的無界面瀏覽器PhantomJS進行爬取的,調用方法如下:
webdriver.PhantomJS(executable_path="C:\...\phantomjs.exe")
課程作業:
作者這裡教大家爬取了消息盒,同時百科知識的摘要及正文也非常重要,讀者不妨嘗試分別爬取。這些語料都將成為您後續文本挖掘或NLP領域的必備儲備,比如文本分類、實體對齊、實體消歧、知識圖譜構建等。
三.Selenium爬取Wikipedia
在線百科是互聯網中存在公開的最大數據量的用戶生成數據集合,這些數據具有一定的結構,屬於半結構化數據,最知名的三大在線百科包括Wikipedia 、百度百科、互動百科。首先,作者將介紹Selenium爬取Wikipedia的實例。
1.網頁分析
第一個實例作者將詳細講解Selenium爬取20國家集團(G20)的第一段摘要信息,具體步驟如下:
(1) 從G20列表頁面中獲取各國超鏈接
20國集團列表網址如下,Wikipedia採用國家英文單詞首寫字母進行排序,比如「Japan」、「Italy」、「Brazil」等,每個國家都採用超鏈接的形式進行跳轉。
https://en.wikipedia.org/wiki/Category:G20_nations
首先,需要獲取20個國家的超鏈接,然後再去到具體的頁面進行爬取。選中一個國家的超鏈接,比如「China」,右鍵滑鼠並點擊「檢查」按鈕,可以獲取對應的HTML源代碼,如下所示。
其中超鏈接位於< div class=「mw-category-group」 >布局的< ul >< li >< a >節點下,對應代碼:
<div class="mw-pages">
<div lang="en" dir="ltr" class="mw-content-ltr">
<div class="mw-category">
<div class="mw-category-group">
<h3>C<h3>
<ul><li>
<a href="/wiki/China" title="China">China</a>
</li></ul>
</div>
<div class="mw-category-group">...</div>
<div class="mw-category-group">...</div>
...
</div>
</div>
</div>
調用Selenium的find_elements_by_xpath()函數獲取節點class屬性為「mw-category-group」的超鏈接,它將返回多個元素。定位超鏈接的核心代碼如下:
driver.get("https://en.wikipedia.org/wiki/Category:G20_nations")
elem=driver.find_elements_by_xpath("//div[@class='mw-category-group']/ul/li/a")
for e in elem:
print(e.text)
print(e.get_attribute("href"))
函數find_elements_by_xpth()先解析HTML的DOM樹形結構並定位到指定節點,並獲取其元素。然後定義一個for循環,依次獲取節點的內容和href屬性,其中e.text表示節點的內容,例如下面節點之間的內容為China。
<a href="/wiki/China" title="China">China</a>
同時,e.get_attribute(「href」)表示獲取節點屬性href對應的屬性值,即「/wiki/China」,同理,e.get_attribute(「title」)可以獲取標題title屬性,得到值「China」。
此時將獲取的超鏈接存儲至變數中如下圖,再依次定位到每個國家並獲取所需內容。
(2) 調用Selenium定位並爬取各國頁面消息盒
接下來開始訪問具體的頁面,比如中國「https://en.wikipedia.org/wiki/China」,如圖所示,可以看到頁面的URL、標題、摘要、內容、消息盒等,其中消息盒在途中右部分,包括國家全稱、位置等。
下面採用<屬性-屬性值>對的形式進行描述,很簡明精準地概括了一個網頁實體,比如<首都-北京>、<人口-13億人>等信息。通常獲取這些信息之後,需要進行預處理操作,之後才能進行數據分析,後面章節將詳細講解。
訪問到每個國家的頁面後,接下來需要獲取每個國家的第一段介紹,本小節講解的爬蟲內容可能比較簡單,但是講解的方法非常重要,包括如何定位節點及爬取知識。詳情頁面對應的HTML核心部分代碼如下:
<div class="mw-parser-output">
<div role="note" class="hatnote navigation-not-searchable">...</div>
<div role="note" class="hatnote navigation-not-searchable">...</div>
<table class="infobox gegraphy vcard">...</table>
<p>
<b>China</b>
, officially the
<b>People』s Republic of China</b>
....
</p>
<p>...</p>
<p>...</p>
...
</table>
</div>
</div>
</div>
瀏覽器審查元素方法如圖所示。
正文內容位於屬性class為「mw-parser-output」的< div >節點下。在HTML中,< P >標籤表示段落,通常用於標識正文,< b >標籤表示加粗。獲取第一段內容即定位第一個< p >節點即可。核心代碼如下:
driver.get("https://en.wikipedia.org/wiki/China")
elem=driver.find_element_by_xpath("//div[@class='mw-parser-output']/p[2]").text
print elem
注意,正文第一段內容位於第二個< p >段落,故獲取p[2]即可。同時,如果讀者想從源代碼中獲取消息盒,則需獲取消息盒的位置並抓取數據,消息盒(InfoBox)內容在HTML對應為如下節點,記錄了網頁實體的核心信息。
<table class="infobox gegraphy vcard">...</table>
2.代碼實現
完整代碼參考文件test10_02.py,如下所示:
# coding=utf-8
#By:Eastmount CSDN 2021-06-23
import time
import re
import os
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Firefox()
driver.get("https://en.wikipedia.org/wiki/Category:G20_nations")
elem = driver.find_elements_by_xpath("//div[@class='mw-category-group']/ul/li/a")
name = [] #國家名
urls = [] #國家超鏈接
#爬取鏈接
for e in elem:
print(e.text)
print(e.get_attribute("href"))
name.append(e.text)
urls.append(e.get_attribute("href"))
print(name)
print(urls)
#爬取內容
for url in urls:
driver.get(url)
elem = driver.find_element_by_xpath("//div[@class='mw-parser-output']/p[1]").text
print(elem)
其中,爬取的信息如圖所示。
PS:該部分大家簡單嘗試即可,更推薦爬取百度百科、互動百科和搜狗百科。
四.Selenium爬取互動百科
幾年過去,互動百科變成了快懂百科,但還好網頁結構未變化。
1.網頁分析
目前,在線百科已經發展為眾多科研工作者從事語義分析、知識圖譜構建、自然語言處理、搜索引擎和人工智慧等領域的重要語料來源。互動百科作為最熱門的在線百科之一,為研究者提供了強大的語料支持。
本小節將講解一個爬取互動百科最熱門的十個編程語言頁面的摘要信息,通過該實例加深讀者使用Selenium爬蟲技術的印象,更加深入地剖析網路數據爬取的分析技巧。不同於Wikipedia先爬取詞條列表超鏈接再爬取所需信息、百度百科輸入詞條進入相關頁面再進行定向爬取,互動百科採用的方法是:
- 設置不同詞條的網頁url,再去到該詞條的詳細界面進行信息爬取。
由於互動百科搜索不同詞條對應的超鏈接是存在一定規律的,即採用 「常用url+搜索的詞條名」 方式進行跳轉,這裡我們通過該方法設置不同的詞條網頁。具體步驟如下:
(1) 調用Selenium分析URL並搜索互動百科詞條
我們首先分析互動百科搜索詞條的一些規則,比如搜索人物「貴州」,對應的超鏈為:
http://www.baike.com/wiki/貴州
對應頁面如圖所示,從圖中可以看到,頂部的超鏈接URL、詞條為「貴州」、第一段為「貴州」的摘要信息、「右邊為對應的圖片等信息。
同理,搜索編程語言「Python」,對應的超鏈接為:
http://www.baike.com/wiki/Python
可以得出一個簡單的規則,即:
http://www.baike.com/wiki/詞條
可以搜索對應的知識,如編程語言「Java」對應為:
http://www.baike.com/wiki/Java
(2) 訪問熱門Top10編程語言並爬取摘要信息
2016年,Github根據各語言過去12個月提交的PR數量進行排名,得出最受歡迎的Top10編程語言分別是:JavaScript、Java、Python、Ruby、PHP、C++、CSS、C#、C和GO語言。
然後,需要分布獲取這十門語言的摘要信息。在瀏覽器中選中摘要部分,右鍵滑鼠點擊「審查元素」返回結果如圖所示,可以在底部看到摘要部分對應的HTML源代碼。
新版本的「快懂百科」內容如下圖所示:
「Java」詞條摘要部分對應的HTML核心代碼如下所示:
<div class="summary">
<div class="content-p ">
<span class=" ">Java是一門面向對象</span>
<a href="/wikiid/7601579597865866248?from=wiki_content"
class="" clicklog="baike_search_inlink_click">
<span class=" ">編程語言</span>
</a>
<span class=" ">,不僅吸收了C++語言的各種優點,還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語言具有功能強大和簡單易用兩個特徵。Java語言作為靜態面向對象編程語言的代表,極好地實現了面向對象理論,允許程序員以優雅的思維方式進行複雜的編程。</span>
</div>
<div class="content-p ">
<span class=" ">Java具有簡單性、面向對象、分散式、</span>
...
</div>
</div>
調用Selenium的find_element_by_xpath()函數,可以獲取摘要段落信息,核心代碼如下。
driver = webdriver.Firefox()
url = "http://www.baike.com/wiki/" + name
driver.get(url)
elem = driver.find_element_by_xpath("//div[@class='summary']/div/span")
print(elem.text)
這段代碼的基本步驟是:
- 首先調用webdriver.Firefox()驅動,打開火狐瀏覽器。
- 分析網頁超鏈接,並調用driver.get(url)函數訪問。
- 分析網頁DOM樹結構,調用driver.find_element_by_xpath()進行分析。
- 輸出結果,部分網站的內容需要存儲至本地,並且需要過濾掉不需要的內容等。
下面是完整的代碼及詳細講解。
2.代碼實現
完整代碼為blog10_03.py如下所示,主函數main()中循環調用getgetAbstract()函數爬取Top10編程語言的摘要信息。
# coding=utf-8
#By:Eastmount CSDN 2021-06-23
import os
import codecs
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Firefox()
#獲取摘要信息
def getAbstract(name):
try:
#新建文件夾及文件
basePathDirectory = "Hudong_Coding"
if not os.path.exists(basePathDirectory):
os.makedirs(basePathDirectory)
baiduFile = os.path.join(basePathDirectory,"HudongSpider.txt")
#文件不存在新建,存在則追加寫入
if not os.path.exists(baiduFile):
info = codecs.open(baiduFile,'w','utf-8')
else:
info = codecs.open(baiduFile,'a','utf-8')
url = "http://www.baike.com/wiki/" + name
print(url)
driver.get(url)
elem = driver.find_elements_by_xpath("//div[@class='summary']/div/span")
content = ""
for e in elem:
content += e.text
print(content)
info.writelines(content+'\r\n')
except Exception as e:
print("Error: ",e)
finally:
print('\n')
info.write('\r\n')
#主函數
def main():
languages = ["JavaScript", "Java", "Python", "Ruby", "PHP",
"C++", "CSS", "C#", "C", "GO"]
print('開始爬取')
for lg in languages:
print(lg)
getAbstract(lg)
print('結束爬取')
if __name__ == '__main__':
main()
其中「JavaScript」和「Java」編程語言的抓取結果如圖所示,該段代碼爬取了熱門十門語言在互動百科中的摘要信息。
程序成功抓取了各個編程語言的摘要信息,如下圖所示:
同時將數據存儲至本地TXT文件中,這將有效為NLP和文本挖掘進行一步分析提供支撐。
寫到這裡,幾種常見的百科數據抓取方法就介紹完畢了,希望您喜歡。
五.本章小結
在線百科被廣泛應用於科研工作、知識圖譜和搜索引擎構建、大小型公司數據集成、Web2.0知識庫系統中,由於其公開、動態、可自由訪問和編輯、擁有多語言版本等特點,它深受科研工作者和公司開發人員的喜愛,常見的在線百科包括Wikipedia、百度百科和互動百科等。
本文結合Selenium技術分別爬取了Wikipedia的段落內容、百度百科的消息盒和互動百科的摘要信息,並採用了三種分析方法,希望讀者通過該章節的案例掌握Selenium技術爬取網頁的方法。
- 消息盒爬取
- 文本摘要爬取
- 網頁多種跳轉方式
- 網頁分析及爬取核心代碼
- 文件保存
Selenium用得更廣泛的領域是自動化測試,它直接運行在瀏覽器中(如Firefox、Chrome、IE等),就像真實用戶操作一樣,對開發的網頁進行各式各樣的測試,它更是自動化測試方向的必備工具。希望讀者能掌握這種技術的爬取方法,尤其是目標網頁需要驗證登錄等情形。
該系列所有代碼下載地址:
https://github.com/eastmountyxz/Python-zero2one
最後
- 更多參考精彩博文請看這裡:@林夕編程
- 喜歡小編的小夥伴可以加個關注、點個贊哦,持續更新嘿嘿!
————————————————
版權聲明:本文為CSDN博主「Eastmount」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/Eastmount/article/details/118147562