专栏首页不二小段Python 抓取新闻稿语料库

Python 抓取新闻稿语料库

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

希望大家在新的一年,学有所得,学有所成,实现每个小目标。

本文分享自微信公众号 - 不二小段(rose-fun),作者:段晓晨

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-01-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【爬虫军火库】生成指定日期间的日期列表

    今天没能空下来时间写太多,所以只简单记录一个很具体的需求: 指定了起止日期,如何生成一个日期列表。 这个需求是我之前在抓取一个环保的历史数据时遇到的: ? 如...

    不二小段
  • 程序员必读的互联网书单(文末有福利)

    程序员是最能够体会知识恐慌的一个群体,我们每天面临太多的新技术,时时刻刻都在学习和创造新内容。同时我们还需要了解互联网的风口与产品理念,否则非常容易被互联网抛下...

    不二小段
  • 【QQ/微信个人号变身机器人】炸群+远程监控个人PC的尝试

    最近简直惰怠。公众号的粉丝都开始负增长了。 其实一直没有闲着,只不过没写成文字。大家可以在优酷关注我的账号:不二小段,我会把日常一些探索录屏给大家。 今天来简单...

    不二小段
  • OushuDB入门(四)——数仓架构篇

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/...

    用户1148526
  • nodejs时间工具类

    /** * * @fmt 格式化字符串 * @Date 为需要格式化的日期 * * 示例:format(new Date(),'yyyy-MM-dd ...

    用户1141560
  • 回调

    回调简单而言:在一个类(A)的方法(a)中调用另一个类(B)的方法(b),当方法(b)执行完之后就调用类(A)中的方法(c),这就是回调的过程,是不是很简单?简...

    Howl
  • 1分钟链圈|V神被拒绝进行辩论直播;君士坦丁堡协议或于11月升级

    这里是 10 月 13 日的每日1句话新闻晚报,只需1分钟,看看全球最热、最新的区块链新闻。

    区块链大本营
  • 算法(BMP图像格式处理)

    张爱玲:人生是一袭华丽的袍子,里面爬满了虱子。 林世霖:BMP是一幅美丽的图画,里面爬满了算法。

    用户2617681
  • 一行代码,Pandas秒变分布式,快速处理TB级数据

    刚刚在Pandas上为十几KB的数据做好了测试写好了处理脚本,上百TB的同类大型数据集摆到了面前。这时候,你可能面临着一个两难的选择: 继续用Pandas?可能...

    量子位
  • [ 利器篇 ] - 抓取蓝牙广播包数据

    实际项目中,需要抓取蓝牙广播包数据进行调试,除了专有的设备之外,也可以通过手机专用的蓝牙APP进行抓包测试,这里主要介绍 LightBlue 和 nRF Too...

    程序手艺人

扫码关注云+社区

领取腾讯云代金券