Python 抓取新聞稿語料庫
- 2020 年 2 月 12 日
- 筆記
2020 年的第一天,給大家分享如何用 Python 抓取新聞聯播語料庫。
語料庫是什麼?
語料庫是語料庫語言學研究的基礎資源,也是經驗主義語言研究方法的主要資源。應用於詞典編纂,語言教學,傳統語言研究,自然語言處理中基於統計或實例的研究等方面。
為什麼是新聞聯播?
新聞聯播是最權威的新聞來源,用語規範,內容涉及時政和社會的方方面面,對生活生產有著很強的指導意義。
怎麼獲取新聞聯播語料庫?
在 Tushare Pro 數據開放平台有新聞聯播文本的介面,可以直接調用獲取。
或者像我這樣,直接自己寫程式碼獲取就好了~
版權&免責聲明:該語料庫收集自網路公開資訊,版權歸原作者所有,本人出於科研學習交流的目的進行分享,僅用於 NLP 或其他學慣用途,傳播後造成任何違規不當使用,責任自負。若有侵權,請後台給我留言。
數據抓取方法僅為技術理論可行性研究,並不鼓勵任何人進行真實抓取。
首先分享資源吧~我已經整理好了 2019 年全年的文字稿:
https://pan.baidu.com/s/1sN6YXjVeJBNf_2OPMkTpLQ
提取碼: 2438
然後我們來分享一下程式碼的實現思路:
首先確定數據來源。網路上其實有一些聚合了新聞聯播文字稿的網站,甚至有一些結構相對清晰容易抓取,但是為了追求字字精確,我還是選擇了官網而不是二道販子。
接下來分析頁面結構。
http://tv.cctv.com/lm/xwlb/
我們在頁面上可以看到一個日曆控制項,點擊相應日期以後,下面會顯示該日的新聞單,一般來講,列表中的第一個是當天的全程新聞聯播,後面則是單個新聞,點進每個新聞頁面會發現「相關稿件」內容。


打開 F12 調試,點擊不同的日期,即可在 XHR 標籤里找到歷次請求,可以發現唯一的變化就是鏈接地址中的日期字元串。

由此確定我們的思路。
根據變化的日期 → 獲取當日新聞列表 → 循環保存新聞的稿件內容
之後的工作就是很基礎的爬蟲操作了,唯一稍微有技術含量的地方,就在於如何生成一個日期列表。比如我們要抓取 2019 年全年的新聞,就需要生成20190101 至 20191231 之間 365 個日期列表。以前我們寫過一篇文章介紹日期列表的生成,用的是 datetime 庫,這次我們用 pandas 實現。
剩下的就不多說了,大家自己看程式碼就好了~
import requests from bs4 import BeautifulSoup from datetime import datetime import os import pandas as pd import time headers = { 'Accept': 'text/html, */*; q=0.01', 'Referer': 'http://tv.cctv.com/lm/xwlb/', 'X-Requested-With': 'XMLHttpRequest', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36', } def href(date): """ 用於獲取某天新聞聯播各條新聞的鏈接 :param date: 日期,形如20190101 :return: href_list: 返回新聞鏈接的列表 """ href_list = [] response = requests.get('http://tv.cctv.com/lm/xwlb/day/' + str(date) + '.shtml', headers=headers) bs_obj = BeautifulSoup(response.text, 'lxml') lis = bs_obj.find_all('li') for each in lis: href_list.append(each.find('a')['href']) return href_list def news(url): print(url) response = requests.get(url, headers=headers, ) bs_obj = BeautifulSoup(response.content.decode('utf-8'), 'lxml') if 'news.cctv.com' in url: text = bs_obj.find('div', {'id': 'content_body'}).text else: text = bs_obj.find('div', {'class': 'cnt_bd'}).text return text def datelist(beginDate, endDate): # beginDate, endDate是形如『20160601』的字元串或datetime格式 date_l = [datetime.strftime(x, '%Y%m%d') for x in list(pd.date_range(start=beginDate, end=endDate))] return date_l def save_text(date): f = open(str(date) + '.txt', 'a', encoding='utf-8') for each in href(date)[1:]: f.write(news(each)) f.write('n') f.close() for date in datelist('20190101', '20191231'): save_text(date) time.sleep(3)
最後,還是祝大家 2020 新年快樂~
希望大家在新的一年,學有所得,學有所成,實現每個小目標。