金融財經新聞的文本爬取

大家一定還記得《金融數據的獲取——一個爬蟲的簡單例子》這篇文章中介紹的爬蟲思想和方法吧。看過之後,大多數人都會有這樣的感受,雖然爬蟲的原理比較簡單,但是正則表達式卻很難寫。對於每個頁面內容的爬取,首先需要要分析出HTML的大致結構,然後寫一串很長很長的正則表達式,再需驗證正則是否正確。

幸運的是,有人已經為我們造好了輪子,不必在爬取內容的定位上花較多時間。在Python中常用的爬蟲工具有BeautifulSoup、lxml和pyquery,這些爬蟲利器讓我們脫離了繁瑣的正則,僅需要幾句簡單的代碼即可獲得需要爬取的內容。

  • BeautifulSoup:一個可以從HTML或XML文件中提取數據的Python庫,並且支持一些第三方的解析器;

  • lxml:lxml採用的是XPath語法,XPath是一種專門對xml文檔進行操作的語言;

  • pyquery:pyquery是python仿jquery的實現,與jquery的語法基本一致。

就筆者而言對jquery的語法比較熟悉,因此選擇pyquery作為爬蟲工具,大家可以根據自己的喜好來選擇。

在這篇講解中,我們會爬取中國證券網上的金融財經新聞。金融財經新聞是非結構化的文本數據,爬取這些文本是為了後續文本挖掘做準備的,關於金融文本挖掘相關的內容將會在後面文章中詳細說明。

我們要爬取新聞初始頁面是要聞 - 新聞 - 上海證券報·中國證券網。查看該頁面的源碼,可以發現在href屬性中有跳轉至各新聞正文的鏈接。

因此,第一步是要爬取這些新聞正文的URL。另外,新聞列表是可以翻頁的,第二頁頁面鏈接是news.cnstock.com/news/s,根據URL的特點很容易對其進行字元串的拼接組裝。

def get_urls(max_page):

start_url = news.cnstock.com/news/s

urls = []

for i in range(1,max_page+1):

spec_url = start_url + str(i) if i>1 else start_url + index.html

source = pq(spec_url)

urls += [item.attr(href) for item in source(.new-list li a).items()]

return urls

上述代碼中,通過source(.new-list li a).items()可以定位到html的元素<a>,取各標籤<a>中的href屬性即可獲取各新聞正文的鏈接。可以看到,pyquery與jquery中的selector語法基本一致。max_page是可以控制的爬取最大頁數,如果不想爬取所有的新聞可以將它設置小一點。

獲取到每條新聞正文的鏈接後,根據該鏈接即可得到每條新聞對應的新聞標題、時間以及正文內容。打開正文頁面的源代碼,找到這些信息的所在位置。

採用pyquery定位並提取裡面的html內容,並存放在字典中。

def get_news(url):

source = pq(url)

title = source(h1.title).text()

date = source(span.timer).text()

content = source(#qmt_content_div.content).text()

if content:

return {URL: url, Title: title, Date: date, Content: content}

獲取了我們想要的信息後,需要將其存到文本文件中,作為後續分析挖掘的原始數據。在這裡,每條新聞都會使用一個txt文件去存儲。

def save_txt(res):

reload(sys)

sys.setdefaultencoding(utf-8)

news_date = datetime.datetime.strptime(res[Date],%Y-%m-%d %H:%M:%S).strftime(%Y%m%d)

f_name = news_date + _ + res[Title]

with codecs.open(securitynews/%s.txt%f_name, w+, encoding=utf-8) as f:

f.write(來源網址: + res[URL] + n)

f.write(標題: + res[Title] + n)

f.write(日期: + res[Date] + n)

f.write(正文: + res[Content] + n)

大家可以看到,有了爬蟲利器後我們再也不用寫複雜的正則表達式了。對於靜態網頁的爬取,並沒有什麼技術上的難點,每位讀者都可以去嘗試獲取自己想要的數據。

我的微信公眾號:會掘金的小鹿(NuggetsRoad)

是時候關注一波了!

推薦閱讀:

R 和 Python 中的文本挖掘:8 個入門小貼士
PPT分享|40頁PPT勘破三生三世數據奧秘,坐觀十里桃花之美

TAG:金融 | 爬虫计算机网络 | 文本数据挖掘 |