廖澤龍 王昊源 劉紫嫣
【摘 要】互聯(lián)網(wǎng)時(shí)代,信息復(fù)雜多樣,查找一件新聞事件的所有報(bào)道,時(shí)常難以以時(shí)間順序正常游覽所有報(bào)道,給讀者帶來(lái)不好的閱讀體驗(yàn),部分新聞事件經(jīng)過(guò)一段時(shí)間發(fā)展后會(huì)被人遺忘,使得不少人只知新聞早期報(bào)道,而不知后續(xù)發(fā)展?!靶侣剷r(shí)間軸自動(dòng)化”是一個(gè)基于Python爬蟲(chóng)的項(xiàng)目,該項(xiàng)目可自動(dòng)或人工創(chuàng)建新聞詞條,利用Python網(wǎng)絡(luò)爬蟲(chóng)技術(shù)獲取“新聞詞條”的收錄權(quán)威信息,并可根據(jù)信息內(nèi)容的發(fā)布時(shí)間報(bào)道順序自動(dòng)建立起新聞的時(shí)間軸,從而方便讀者閱讀新聞及理清邏輯。
【關(guān)鍵詞】Pyhton;requests庫(kù);BeautifulSoup庫(kù);MySQLdb模塊;網(wǎng)絡(luò)爬蟲(chóng)
1.相關(guān)技術(shù)簡(jiǎn)介
1.1 requests庫(kù)和BeautifulSoup庫(kù)
requests是Python第三方工具包,是實(shí)現(xiàn)爬蟲(chóng)所常用的HTTP庫(kù),主要用于自動(dòng)爬取HTML頁(yè)面,自動(dòng)網(wǎng)絡(luò)請(qǐng)求提交等。
BeautifulSoup是一個(gè)非常流行的Python第三方工具包,可實(shí)現(xiàn)解析網(wǎng)頁(yè),并提供定位內(nèi)容的便捷接口。利用它不用編寫(xiě)正則表達(dá)式也能方便的實(shí)現(xiàn)網(wǎng)頁(yè)信息的抓取,利用BeautifulSoup編寫(xiě)的代碼雖然有時(shí)比正則表達(dá)式復(fù)雜,但其更容易構(gòu)造和理解,也無(wú)需擔(dān)心類似多余的空格和標(biāo)簽屬性這種布局上的小變化。Beautiful Soup支持Python標(biāo)準(zhǔn)庫(kù)中的HTML解析器,還支持一些第三方的解析器,如果我們不安裝它,則 Python 會(huì)使用 Python默認(rèn)的解析器。
在Python網(wǎng)絡(luò)爬蟲(chóng)中,以上兩個(gè)庫(kù)通常結(jié)合使用,requests庫(kù)實(shí)現(xiàn)自動(dòng)爬取頁(yè)面 源代碼,再通過(guò)BeautifulSoup庫(kù)在頁(yè)面源代碼中定向提取所需要的內(nèi)容。[1]
2.“新聞時(shí)間軸自動(dòng)化”的設(shè)計(jì)
第一步:在云服務(wù)器下通過(guò)Python爬蟲(chóng)程序獲取新聞事件的關(guān)鍵詞;第二步,以關(guān)鍵詞為線索開(kāi)始自動(dòng)化的定向爬取工作,從而獲取關(guān)于目標(biāo)事件的權(quán)威報(bào)道;第三步:將爬取到的內(nèi)容按一定順序和編碼導(dǎo)出至數(shù)據(jù)庫(kù)或緩存到云服務(wù)器中;第四步:借助Python或JSP等方法連接數(shù)據(jù)庫(kù)并將數(shù)據(jù)庫(kù)或緩存到云服務(wù)器中的數(shù)據(jù)輸出到頁(yè)面上,從而完成新聞時(shí)間軸。
3.“新聞時(shí)間軸自動(dòng)化”的實(shí)現(xiàn)
3.1獲取新聞事件的關(guān)鍵詞
通過(guò)分析百度的“搜索風(fēng)云榜”或新浪微博的“實(shí)時(shí)熱搜榜”頁(yè)面源代碼,建立定向爬蟲(chóng),從而獲得新聞詞條的關(guān)鍵詞;以百度的“搜索風(fēng)云榜”為例,該網(wǎng)頁(yè)的網(wǎng)址為:http://top.baidu.com/buzz?b=341&c=513&fr=topbuzz_b1_c513,通過(guò)分析其頁(yè)面源代碼可知新聞事件關(guān)鍵詞都位于一個(gè)
newsUrls = []
pengpaiSearUrl = https://www.thepaper.cn/searchResult.jsp?inpsearch={nnnew}
#設(shè)置新聞關(guān)鍵詞,以“長(zhǎng)春長(zhǎng)生”為例
testString="長(zhǎng)春長(zhǎng)生"
#利用format()函數(shù)設(shè)定爬取的關(guān)鍵詞
pengpaiNews = pengpaiSearUrl.format(nnnew=testString)
nnnew=keywords[0]
print(pengpaiNews)
#獲得url信息,設(shè)置60秒超時(shí)時(shí)間
r = requests.get(pengpaiNews, timeout=60)
r.raise_for_status()
r.encoding = r.apparent_encoding
#獲得的HTML文本
html = r.text
print(html)
#對(duì)獲得的文本進(jìn)行html解析,查找id='mainContent'
h2 = BeautifulSoup(html,"html.parser").find(id='mainContent')
for aimNews in h2.find_all('h2'):
newsTitles.append(aimNews.getText())
print(newsTitles)
#獲取新聞的扼要和時(shí)間
for aimUrls in h2.find_all('a', href=True):
if aimUrls.get_text(strip=True):
if len(aimUrls['href'])>10:
newsUrls.append(pengpaiUrl+aimUrls['href'])
r = requests.get(pengpaiUrl+aimUrls['href'], timeout=40)
r.raise_for_status()
r.encoding = r.apparent_encoding
herfHtml = r.text
#print(herfHtml)
aimTime=BeautifulSoup(herfHtml,"html.parser").find
(class_="news_about")
if aimTime!=None:
htmlTime=aimTime.getText()
#利用正則表達(dá)式匹配時(shí)間
mat = re.search(r"(\d{4}-\d{1,2}-\d{1,2}\s\d{1,2}:\d{1,2})",htmlTime)
newsTime.append(mat.group(0))
else:
newsTime.append("視頻(error)")
3.3數(shù)據(jù)存儲(chǔ):
數(shù)據(jù)存儲(chǔ)有多種方式,其中有兩種常用的方法——寫(xiě)入數(shù)據(jù)庫(kù)或?qū)懭隿sv文件。寫(xiě)入數(shù)據(jù)庫(kù)的大致方法如下:第一步,利用Python的第三方庫(kù)pymysql庫(kù)連接MySQL數(shù)據(jù)庫(kù),在指定數(shù)據(jù)庫(kù)下創(chuàng)建表;[2]第二步,將3.1、3.2爬取到的數(shù)據(jù)寫(xiě)入創(chuàng)建的表中。
3.4數(shù)據(jù)顯示:
在Web服務(wù)器上,先利用JSP連接數(shù)據(jù)庫(kù),讀取指定數(shù)據(jù)庫(kù)中的數(shù)據(jù),將數(shù)據(jù)輸出至已編寫(xiě)好的JSP頁(yè)面中,最后將JSP文件保存在網(wǎng)站服務(wù)器的指定目錄,完成上述操作后數(shù)據(jù)即可顯示在相應(yīng)頁(yè)面上,從而自動(dòng)生成新聞時(shí)間軸。
4.總結(jié)
近幾年,Python網(wǎng)絡(luò)爬蟲(chóng)十分流行,發(fā)展迅速,目前已有多種Python爬蟲(chóng)平臺(tái),如Scrapy、Crawley。“新聞時(shí)間軸自動(dòng)化”項(xiàng)目利用Python標(biāo)準(zhǔn)庫(kù)與第三方庫(kù),實(shí)現(xiàn)在無(wú)人監(jiān)督的條件下對(duì)時(shí)事熱點(diǎn)的自動(dòng)搜索與收錄,圍繞著熱點(diǎn)搜索和爬取權(quán)威報(bào)道,并對(duì)得到的數(shù)據(jù)進(jìn)行展示,整個(gè)過(guò)程簡(jiǎn)單,移植性強(qiáng),對(duì)環(huán)境等要求不高。
【參考文獻(xiàn)】
[1].Beautiful Soup 4.2.0 文檔[EB/OL].https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/.
[2].Python3 MySQL 數(shù)據(jù)庫(kù)連接[EB/OL].http://www.runoob.com/python3/
python3-mysql.html.