抓取网页新闻(数据抓取方法仅为技术理论可行性研究技术)
优采云 发布时间: 2021-09-09 01:11抓取网页新闻(数据抓取方法仅为技术理论可行性研究技术)
数据采集方法只是技术理论可行性研究,不鼓励任何人进行现实世界的采集。
先分享一下资源吧~我整理了2019年全年的成绩单:
/s/1sN6YXjVeJBNf_2OPMkTpLQ 提取码:2438
接下来分享一下实现代码的思路:首先确定数据的来源。其实网上有一些网站聚合新闻网文稿,有的结构比较清晰,容易掌握。但是为了追求词的准确,我选择了官网,而不是二道。
接下来分析页面结构。 /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('20200101', '20200101'):
save_text(date)
time.sleep(3)
最后,祝大家2020年新年快乐~希望大家在新的一年里有所收获,有所收获,实现每一个小目标。