吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2885|回复: 32
收起左侧

[Python 原创] 写了一个获取中国新闻网的资讯归档爬虫

  [复制链接]
hoochanlon 发表于 2023-5-1 23:37

这主要是受csdn-Python爬取新闻信息,分词统计并画词云启发,中途也写了百度热搜的爬虫,对繁杂的新闻条目进行精细分类,涉及到AI与机械学习方面,我试了试,觉得工程量还是太大了,还不如用这个中国新闻网现成的分类。再考虑到上述文章的源码不大易读,以及附加了词云之类的库,要想跨平台还是有些不便,就自己写一个吧。

本地测试,效果如图:

(注:Windows多半是要注释掉 r.encoding='utf-8' ,保存路径多半是家目录或c:/Windows/System32

在线测试

python -c "$(curl -fsSL https://ghproxy.com/https://raw.githubusercontent.com/hoochanlon/ihs-simple/main/d-python/get_chinanews.py)"

附源码:https://github.com/hoochanlon/ihs-simple/blob/main/d-python/get_chinanews.py

import requests
from bs4 import BeautifulSoup
from openpyxl import Workbook
from datetime import datetime
# -----参考文档,三件套-------
# https://docs.python-requests.org/en/latest/
# https://www.crummy.com/software/BeautifulSoup/bs4/doc/
# https://openpyxl.readthedocs.io/en/stable/
# https://docs.python.org/3/library/stdtypes.html#str.strip (切片)
# -----参考文档,三件套-------
# 5.1 新增时间格式规范化输出文件名
# 获取当前时间
now = datetime.now()
# 将时间格式化为指定的字符串格式
formatted_time = now.strftime('%Y-%-m-%-d')
# 创建一个Workbook对象,用于Excel的读写
wb = Workbook()
# 添加一个Sheet页,并且指定Sheet名称
sheet = wb.active
sheet.title = 'Sheet1'
# 定义变量row,用于循环时控制每一行的写入位置
row = 1
# 添加表头
sheet['A1'] = '栏目'
sheet['B1'] = '标题'
sheet['C1'] = '时间'
# 遍历页码1从2页
for page_num in range(1,3):
    # f-string
    url = f"https://www.chinanews.com.cn/scroll-news/news{page_num}.html"
    # 反爬通用套码
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
    }
    r = requests.get(url, headers=headers)
    r.encoding='utf-8'
    soup = BeautifulSoup(r.text, 'html.parser')
    # 遍历栏目、标题和时间
    dangdu_lanmu = soup.find_all('div', class_='dd_lm')
    dangdu_biaoti = soup.find_all('div', class_='dd_bt')
    dangdu_time = soup.find_all('div', class_='dd_time')

    # 追加具体数据
    for news_num in range(len(dangdu_lanmu)):
        sheet.append([dangdu_lanmu[news_num].text.strip('[]'), dangdu_biaoti[news_num].text, dangdu_time[news_num].text])
        # row=row+1
        row += 1
# 保存Excel文件
wb.save("chinanews_{}.xlsx".format(formatted_time))

配合一些大数据分析的论文食用更佳:

  • 许诺、唐锡晋 -《基于百度热搜新闻词的社会风险事件5W提取研究》(中国科学院、中国科学院大学,《系统工程理论与实践》,Vol.40, No.2, Feb., 2020)
  • 毛贺祺 -《大数据背景下微博热搜的新闻阅读服务功能》(吉林大学文学院, 2017年3月)
  • 王小新 -《当前我国受众网络新闻的阅读倾向——以百度热搜词为例》(上海理工大学,《今传媒》2013年第9期)
  • 喻国明 -《大数据分析下的中国社会舆情 总体态势与结构性特征》(中国人民大学,中国人民大学学报,2013年第5期)

举例来说,就是简单的数据对比与分析:

免费评分

参与人数 6吾爱币 +10 热心值 +5 收起 理由
Lemon1001 + 1 + 1 谢谢@Thanks!
luozi1653 + 1 + 1 热心回复!
echoaku + 1 + 1 谢谢@Thanks!
苏紫方璇 + 5 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
shadmmd + 1 谢谢@Thanks!
evalPrivateJS + 1 + 1 用心讨论,共获提升!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

shadmmd 发表于 2023-5-2 10:34
保存路径多半是家目录或c:/Windows/System32

另外,windows的保存路径一般默认在用户目录(C:\Users\用户名)或者Python安装目录,会保存到
[Shell] 纯文本查看 复制代码
C:\Windows\System32\
这个文件夹的原因,要么是你在命令行运行的时候切换到这里、要么是环境变量里面改了path、要么手动指定、要么是魔改版win,起码XP开始的系统就已经把命令行默认到用户目录了。
 楼主| hoochanlon 发表于 2023-5-2 11:01
本帖最后由 hoochanlon 于 2023-5-2 11:11 编辑
shadmmd 发表于 2023-5-2 10:16
文件第20行
[mw_shl_code=python,true]# 将时间格式化为指定的字符串格式

看个人

 楼主| hoochanlon 发表于 2023-5-2 11:37
qiusj88 发表于 2023-5-2 11:24
有成品吗
我在线打包 提示:
Traceback (most recent call last):

ModuleNotFoundError: No module named 'requests'

pip3 install requests

其他同理。

 楼主| hoochanlon 发表于 2023-5-2 12:06
shadmmd 发表于 2023-5-2 12:00
win跟Mac的差异?我在Py3.10中用你的时间格式是报错的。

八九不离十的样子,Windows上不行的话,可能又是另一种写法,为了通用性我觉得你的格式已经是正解了。

pubh 发表于 2023-5-11 14:07
本帖最后由 pubh 于 2023-5-11 18:01 编辑
JKARES 发表于 2023-5-2 11:10
import requests
from bs4 import BeautifulSoup
from openpyxl import Workbook

1、改用parsel采集
2、增加新闻链接
3、修改部分单元格格式

[Python] 纯文本查看 复制代码
import sys
import datetime
import requests
from parsel import Selector
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment

# 获取网页原始内容
def geturl(urls):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/89.0.4389.114 Mobile Safari/537.36',
        'Referer': 'https://www.chinanews.com.cn/'
    }
    try:
        response = requests.get(url=urls, headers=headers, timeout=30)
        response.encoding = response.apparent_encoding
        return response
    except requests.exceptions.RequestException as e:
        print(e)
        sys.exit(1)

if __name__ == '__main__':
    # 将当前时间格式化为指定格式字符串
    formatted_time = datetime.datetime.now().strftime('%Y%m%d')
    # 创建一个Workbook对象,用于Excel的读写
    wb = Workbook()
    # 添加一个Sheet页,并且指定Sheet名称
    sheet = wb.active
    sheet.title = '滚动新闻'
    # 添加表头
    sheet.append(['栏目', '标题', '链接', '时间'])
    # 遍历1-2页
    for page_num in range(1, 3):
        url = f"https://www.chinanews.com.cn/scroll-news/news{page_num}.html"
        data = geturl(url).text
        # 遍历栏目、标题、链接和时间
        news_column = Selector(data).css('div.dd_lm a::text').getall()
        news_title = Selector(data).css('div.dd_bt a::text').getall()
        news_url = Selector(data).css('div.dd_bt a::attr(href)').getall()
        news_time = Selector(data).css('div.dd_time::text').getall()

        # 追加具体数据
        for i in range(len(news_column)):
            print(news_column[i], news_title[i], 'https://www.chinanews.com.cn' + news_url[i], news_time[i])
            sheet.append([news_column[i], news_title[i], 'https://www.chinanews.com.cn' + news_url[i], news_time[i]])

        # 将数据列表一次性写入Excel文件
        # news_data = list(zip(news_column, news_title, news_url, news_time))
        # sheet.append(news_data)

    # 单元格式
    for j in ["A","B","C","D",]:
        sheet[j+"1"].alignment = Alignment(vertical='center')
        sheet[j+"1"].font = Font(bold=True)
    sheet.row_dimensions[1].height = 20
    sheet.column_dimensions["A"].width = 5
    sheet.column_dimensions["B"].width = 80
    sheet.column_dimensions["C"].width = 80
    sheet.column_dimensions["D"].width = 12

    # 保存Excel文件
    wb.save("chinanews_{}.xlsx".format(formatted_time))

免费评分

参与人数 1吾爱币 +2 热心值 +1 收起 理由
hoochanlon + 2 + 1 用心讨论,共获提升!

查看全部评分

 楼主| hoochanlon 发表于 2023-5-1 23:42

编码过程

01 simple demo(标题遍历)

简单试手遍历新闻标题,如图div部分,“lm”、“time”,都能进行简单的遍历。

01 simple demo 源码

import requests
from bs4 import BeautifulSoup

# ---- 常规操作 -------

url = 'https://www.chinanews.com.cn/scroll-news/news1.html'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
r = requests.get(url, headers=headers)
r.encoding='utf-8'
soup = BeautifulSoup(r.text, 'html.parser')

# ----- 遍历 ---------

dangdu_biaoti = soup.find_all('div', class_='dd_bt')

for div in dangdu_biaoti:
    print(div.text)

效果如下

02 simple demo(页码遍历)

https://www.chinanews.com.cn/scroll-news/news1.html  ,做个遍历链接,再遍历内容也是可行的。

02 simple demo 源码

import requests
from bs4 import BeautifulSoup

# ---- 遍历页码从1到10 -------
for i in range(1, 11):
    # f-string
    url = f"https://www.chinanews.com.cn/scroll-news/news{i}.html"
    # 反爬通用套码
    headers = {
     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
    r = requests.get(url, headers=headers)
    r.encoding='utf-8'
    soup = BeautifulSoup(r.text, 'html.parser')

    # ----- 遍历标题 (dd_time dd_lm 已测可行) ---------
    dangdu_biaoti = soup.find_all('div', class_='dd_bt')
    for div in dangdu_biaoti:
        print(div.text)

03 simple demo(debug)

不恰当的for循环逻辑,导致各列各项“错位”

错误演示demo

# 错位了
    # 遍历栏目 
    dangdu_lanmu = soup.find_all('div', class_='dd_lm')
    for div in dangdu_lanmu:
        # 将标题文本写入第2列(即A列),第row+1行中
        sheet.write(row, 0, div.text)
        row += 1  # 写入下一行

    # 遍历标题 (dd_time dd_lm 已测可行)
    dangdu_biaoti = soup.find_all('div', class_='dd_bt')
    for div in dangdu_biaoti:
        # 将标题文本写入第2列(即B列),第row+1行中
        sheet.write(row, 1, div.text)
        row += 1  # 写入下一行

    # 遍历时间
    dangdu_time = soup.find_all('div', class_='dd_time')
    for div in dangdu_time:
        # 将标题文本写入第2列(即C列),第row+1行中
        sheet.write(row, 2, div.text)
        row += 1  # 写入下一行

A、B、C列发生了偏移

将A、B、C列的项目并排齐头的二种方式

方式一:先把表头占据,2起步。

# 添加表头
sheet['A1'] = '栏目'
sheet['B1'] = '标题'
sheet['C1'] = '时间'

# 定义变量row,用于循环时控制每一行的写入位置
row = 2

    # 遍历栏目、标题和时间
    dangdu_lanmu = soup.find_all('div', class_='dd_lm')
    dangdu_biaoti = soup.find_all('div', class_='dd_bt')
    dangdu_time = soup.find_all('div', class_='dd_time')

    for j in range(len(dangdu_lanmu)):
        # 将栏目、标题和时间分别写入第1列、第2列和第3列,第j+row行中
        sheet.cell(row=row, column=1, value=dangdu_lanmu[j].text)
        sheet.cell(row=row, column=2, value=dangdu_biaoti[j].text)
        sheet.cell(row=row, column=3, value=dangdu_time[j].text)

同理于

# 添加表头
sheet.write(0, 0, '栏目')
sheet.write(0, 1, '标题')
sheet.write(0, 2, '时间')

# 定义变量row,用于循环时控制每一行的写入位置
row = 1

    # 遍历栏目、标题和时间
    dangdu_lanmu = soup.find_all('div', class_='dd_lm')
    dangdu_biaoti = soup.find_all('div', class_='dd_bt')
    dangdu_time = soup.find_all('div', class_='dd_time')

    for j in range(len(dangdu_lanmu)):
        # 将栏目、标题和时间分别写入第1列、第2列和第3列,第j+row行中
        sheet.cell(row=row, column=1, value=dangdu_lanmu[j].text)
        sheet.cell(row=row, column=2, value=dangdu_biaoti[j].text)
        sheet.cell(row=row, column=3, value=dangdu_time[j].text)

方式二:使用append,精简化

# 定义变量row,用于循环时控制每一行的写入位置
row = 1

# 添加表头
sheet['A1'] = '栏目'
sheet['B1'] = '标题'
sheet['C1'] = '时间'

   # 遍历栏目、标题和时间
    dangdu_lanmu = soup.find_all('div', class_='dd_lm')
    dangdu_biaoti = soup.find_all('div', class_='dd_bt')
    dangdu_time = soup.find_all('div', class_='dd_time')

    # 追加具体数据
    for news_num in range(len(dangdu_lanmu)):
        sheet.append([dangdu_lanmu[news_num].text, dangdu_biaoti[news_num].text, dangdu_time[news_num].text])
        # row=row+1
        row += 1

效果如图

03 simple demo

import requests
from bs4 import BeautifulSoup
from openpyxl import Workbook

# -----参考文档,三件套-------
# https://docs.python-requests.org/en/latest/
# https://www.crummy.com/software/BeautifulSoup/bs4/doc/
# https://openpyxl.readthedocs.io/en/stable/
# -----参考文档,三件套-------

# 创建一个Workbook对象,用于Excel的读写
wb = Workbook()

# 添加一个Sheet页,并且指定Sheet名称
sheet = wb.active
sheet.title = 'Sheet1'

# 定义变量row,用于循环时控制每一行的写入位置
row = 1

# 添加表头
sheet['A1'] = '栏目'
sheet['B1'] = '标题'
sheet['C1'] = '时间'

# 遍历页码从1到2
for page_num in range(1,2):
    # f-string
    url = f"https://www.chinanews.com.cn/scroll-news/news{page_num}.html"

    # 反爬通用套码
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
    }

    r = requests.get(url, headers=headers)
    r.encoding='utf-8'
    soup = BeautifulSoup(r.text, 'html.parser')

    # 遍历栏目、标题和时间
    dangdu_lanmu = soup.find_all('div', class_='dd_lm')
    dangdu_biaoti = soup.find_all('div', class_='dd_bt')
    dangdu_time = soup.find_all('div', class_='dd_time')

    # 追加具体数据
    for news_num in range(len(dangdu_lanmu)):
        sheet.append([dangdu_lanmu[news_num].text.strip('[]'), dangdu_biaoti[news_num].text, dangdu_time[news_num].text])
        # row=row+1
        row += 1

# 保存Excel文件
wb.save('output.xlsx')

做统计饼图遇到的问题

01 数据格式

代码生成的output.xlsx清除内容做了简单的数据统计测试,出现了饼图“不显示”的问题,但新建的Excel表填入一样数据,测试后却并没问题。

问题如图所示

中途发现:知乎专栏-用原生的方式操作Excel,Python玩转Excel神器xlsxwriter详解!csdn-python实现——处理Excel表格(超详细);最后参考这篇csdn-excel无法做图,是因为数据格式的原因解决的,我推测这个问题是我复制了表头,随手粘贴连同属性也一块复制进去了,所造成的。

02 筛选统计

无意间点到数据透视图,如下图以标题对应着栏目数,查了 microsoft-设计数据透视表的布局和格式对“轴”与“值”的说明,我觉得其类似于键值对的设计,当做统计汇总时,“轴”相当于分组和分类的列、"值"相当于的统计的数目的列。

问及人资同事有关于报表方面的制作,他让我去找在线图表的,于是试了下水,确实从使用上确实简单了不少,算是意外发现了。

阿杰曾爱 发表于 2023-5-1 23:45
中   不孬
雾都孤尔 发表于 2023-5-1 23:54
支持原创,感谢分享。
clarkdavid 发表于 2023-5-1 23:58
不错,学习了
exnet 发表于 2023-5-2 00:41
感谢分享。
lzr1000 发表于 2023-5-2 07:19
支持一下,谢谢。
darksetyaer 发表于 2023-5-2 08:08
支持一下
iapeng 发表于 2023-5-2 08:26
支持原创,谢谢分享成功
xwawa 发表于 2023-5-2 08:35
这个就是“新闻小偷”吗?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 02:01

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表