当前位置: 首页 > news >正文

【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)的页面信息,看是否有今日热点列表数据。

import requestsurl = '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)整理获取列表脚本:

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 爬取详情信息

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

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库

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

3. 爬虫脚本整理

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

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'] =tipresult['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].textreturn text# 调用接口进行验证
getNewsList(url)

导出的Excel文件内容如下:

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 网络安全抓包封包WEB
  • Java基础语法之封装
  • C++:容器了解
  • 触屏交互设备的安全风险
  • Windows系统设置网络IPv4和IPv6优先访问级
  • Ps:通过 RGB 值计算 HSB 值
  • Sass/Scss基础
  • Windows安装Swoft框架
  • Linux -- 进度条小程序
  • 3Done学习笔记
  • 全网最适合入门的面向对象编程教程:33 Python 的内置数据类型-对象 Object 和类型 Type 的关系
  • DSP如何进行竞价
  • vue3--实现vue2插件JSONPathPicker的路径获取功能
  • 用koa2 和 html javascript做了一个视频列表功能
  • Java设计模式(适配器模式)
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • Android交互
  • Angular2开发踩坑系列-生产环境编译
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • js
  • Making An Indicator With Pure CSS
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • REST架构的思考
  • SpiderData 2019年2月13日 DApp数据排行榜
  • 猴子数据域名防封接口降低小说被封的风险
  • 手机端车牌号码键盘的vue组件
  • 想写好前端,先练好内功
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 用Visual Studio开发以太坊智能合约
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • 整理一些计算机基础知识!
  • ​VRRP 虚拟路由冗余协议(华为)
  • #{}和${}的区别是什么 -- java面试
  • #define
  • #预处理和函数的对比以及条件编译
  • (3)nginx 配置(nginx.conf)
  • (7)STL算法之交换赋值
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (pycharm)安装python库函数Matplotlib步骤
  • (翻译)terry crowley: 写给程序员
  • (附源码)ssm高校实验室 毕业设计 800008
  • (黑马C++)L06 重载与继承
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (七)Java对象在Hibernate持久化层的状态
  • (转) ns2/nam与nam实现相关的文件
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转)用.Net的File控件上传文件的解决方案
  • .apk文件,IIS不支持下载解决
  • .cfg\.dat\.mak(持续补充)
  • .mysql secret在哪_MySQL如何使用索引
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .NET编程C#线程之旅:十种开启线程的方式以及各自使用场景和优缺点