抓取网页新闻(数据抓取方法仅为技术理论可行性研究技术实现思路:)

优采云 发布时间: 2021-10-25 07:01

  抓取网页新闻(数据抓取方法仅为技术理论可行性研究技术实现思路:)

  数据捕获方法只是一种技术理论可行性研究,不鼓励任何人进行现实世界的捕获。

  先分享一下资源~我整理了2019年全年的成绩单:

  提取码:2438

  然后分享一下代码的实现思路:

  首先确定数据源。其实网上有一些网站聚合新闻网文稿,甚至有的结构比较清晰,容易掌握。但是为了追求词的准确,我选择了官网而不是二道展。

  接下来分析页面结构。

  我们可以在页面上看到一个日历控件。点击相应日期后,下方会显示当天的新闻列表。一般来说,列表中的第一个是当天的整个新闻播放,下面是单个新闻。点击进入 每个新闻页面都会找到“相关文章”的内容。

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

  希望新的一年,大家都能有所收获,有所收获,实现每一个小目标。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线