【Python】爬取网易新闻今日热点列表数据并导出

1. 需求

从网易新闻的科技模块爬取今日热点的列表数据,其中包括标题、图片、标签、发表时间、路径、详细文本内容,最后导出这些列表数据到Excel中。

网易科技新闻网址:https://tech.163.com

2. 解决步骤

2.1 前期准备

爬虫脚本中需要引用的Python库:

  • requests:一个HTTP客户端库,‌专门用于发送HTTP请求;
  • BeautifulSoup:可以从HTML或XML文件中提取数据;
  • pandas:用于数据分析的一个强大库,这里主要用于整理数据、导出Excel。
  • json:python的一个内置库,用于处理JSON格式的数据。

注意:

在执行Python爬虫脚本之前需要引入库,如:

pip install BeautifulSoup

否则会报错(Couldn't find ....... you requested: XXX库.)。

2.2 爬取列表基础信息

**(1)通过简单脚本爬取页面信息:**先爬取网易新闻(https://tech.163.com)的页面信息,看是否有今日热点列表数据。

python 复制代码
import requests

url = 'http://tech.163.com/'
response = requests.get(url)    # 发送HTTP GET请求  
print(response.text)            # 打印网页内容

可以在控制台看到打印的页面信息。(该打印信息在步骤(3)中会使用到)

(2)查看列表所在的模块位置 :在网易科技新闻页面,键盘按【F12】弹出开发者工具,通过开发者工具左上角的小箭头在页面定位今日热点列表的位置,根据操作可知列表所在div元素的class属性为 "ndi_main" 。

(3)通过打印的页面信息,查看其中是否能获取列表数据: 复制div元素的class属性的值 "ndi_main" 到之前打印的页面信息中查看位置。从图中可知今日热点列表的数据是动态加载的。

**(4)从资源文件获取今日热点列表数据链接地址:**从开发者工具的【Source --> Page】加载的文件中查找到今日热点列表的数据是从这个JSON文件获取的。

选择该JSON文件地址,鼠标右键,点击【Copy link address】复制链接地址。

(5)整理获取列表脚本:

python 复制代码
import requests
import json

# 今日热点的JSON数据链接地址
url = "https://tech.163.com/special/00097UHL/tech_datalist.js?callback=data_callback"

# 发送HTTP GET请求
response = requests.get(url) 
# 处理字符串成JSON格式的字符串
str = response.text.replace(')', '').replace('data_callback(', '')
# 将JSON格式的字符串转换为Python对象
json_data = json.loads(str)

for i in json_data:
    title = i["title"]
    docurl = i["docurl"]
    imgurl = i["imgurl"]
    time = i["time"]
    label = i["label"]

    tip = ''
    for j in i["keywords"]:
        tip += j["keyname"] + ', '

    print("标题:" + title)
    print("发表时间:" + time)
    print("类型:" + label)
    print("标识:" + tip)
    print("路径:" + docurl)
    print("图片地址:" + imgurl)
    print("----------------------------------------")

打印结果:

2.3 爬取详情信息

根据第一条新闻路径获取详情信息

python 复制代码
import requests
import json
from bs4 import BeautifulSoup

# 详情地址
detailUrl = 'https://www.163.com/dy/article/J8K51SIR0519QIKK.html'

# headers可取固定值,访问所有详情页均可用
headers = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36"}
# 发送HTTP GET请求页面信息。注意这里不带请求头无权限获取详情数据信息。
response = requests.get(url=detailUrl, headers=headers)
# 从HTML文件中提取数据
soup = BeautifulSoup(response.text, 'html.parser')
# 获取class为"post_body"元素内部的文字内容(无图)
text = soup.select('.post_body')[0].text
print(text)

打印结果:

需要注意以下几点:

(1)HTTP请求不带请求头,则无权限访问。

headers的值可从任一请求的请求头中获取即可。

(2)代码中倒数第二行的 ".post_body" 是通过开发者工具左上角的小标签去快速定位详情内容的位置中获取。

2.4 导出数据到Excel中

导出的时候需要使用到pandas库

python 复制代码
import pandas

df = pandas.DataFrame(list_res)
df.head(5)
df.to_excel("tech163.xlsx")
print("导出成功")

3. 爬虫脚本整理

根据解决步骤,最终整理的爬取网页新闻的脚本如下:

python 复制代码
import requests
import json
from bs4 import BeautifulSoup
import pandas

# 网易科技新闻地址
url = "https://tech.163.com/special/00097UHL/tech_datalist.js?callback=data_callback"

# 获取今日热点列表信息
def getNewsList(url):
    list_res = []
    response = requests.get(url)
    str = response.text.replace(')', '').replace('data_callback(', '')
    json_data = json.loads(str)
    for i in json_data:
        result = {}
        tip = ''
        for j in i["keywords"]:
            tip += j["keyname"] + ', '
        result['title']=i["title"]
        result['time']= i["time"]
        result['label'] = i["label"]
        result['tip'] =tip
        result['imgurl'] =i["imgurl"]
        result['detail']= getNewsDetail(i["docurl"])
        list_res.append(result)
    df = pandas.DataFrame(list_res)
    df.head(5)
    df.to_excel("tech163.xlsx")
    print("导出成功")

# 获取详情信息
def getNewsDetail(detailUrl):
    headers = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36"}
    response = requests.get(url=detailUrl, headers=headers)
    soup = BeautifulSoup(response.text, 'html.parser')
    text = soup.select('.post_body')[0].text
    return text

# 调用接口进行验证
getNewsList(url)

导出的Excel文件内容如下:

相关推荐
紫雾凌寒39 分钟前
计算机视觉 |解锁视频理解三剑客——TimeSformer
python·深度学习·神经网络·计算机视觉·transformer·timesformer
程序员杰哥1 小时前
测试用例详解
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例
go54631584657 小时前
本地部署 GitHub 上的 Python 人脸识别项目
开发语言·python·github
FreakStudio8 小时前
手把手教你用 MicroPython 玩转幻尔串口舵机,代码+教程全公开
python·嵌入式·大学生·面向对象·技术栈·电子diy·电子计算机
tekin8 小时前
基于 Python 开发在线多人游戏服务器案例解析
服务器·python·游戏·在线多人游戏服务器
让学习成为一种生活方式10 小时前
libGL.so.1: cannot open shared object file: No such file or directory-linux022
linux·开发语言·python
java1234_小锋10 小时前
一周学会Flask3 Python Web开发-Jinja2模板继承和include标签使用
python·flask·flask3
图书馆钉子户10 小时前
from flask_session import Session 为什么是Session(app)这么用?
python·flask·mybatis
FeiCat Henry11 小时前
KGG转MP3工具|非KGM文件|解密音频
科技·算法·音视频·软件工程·视频编解码
一只蜗牛儿11 小时前
Sherpa-ONNX:说话人识别与语音识别自动开启(VAD)+ Python API 完整指南
人工智能·python·语音识别