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 新年快樂~

希望大家在新的一年,學有所得,學有所成,實現每個小目標。