吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3232|回复: 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] 纯文本查看 复制代码
1
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] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
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, 2025-4-25 07:25

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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