从网页结构分析,到 BeautifulSoup 提取数据,再到导出 Excel,全程零基础讲解
前言
上一篇文章,我完成了自己的第一个 Python 爬虫项目——百度热搜采集器
在那个项目中,我学会了:
requests 请求网页 BeautifulSoup 解析 HTML .find() 与 .find_all() .text .get(“href”) Excel 导出
这一次,我决定挑战真正的新闻网站
这篇文章记录了我从分析网页,到完成整个新闻列表采集的全过程,希望能帮助刚接触 Python 爬虫的同学少走一些弯路
一、项目效果
最终实现的功能:
✅ 获取首页新闻
✅ 提取新闻标题
✅ 提取新闻链接
✅ 导出 Excel
最终效果:
50多国外宾齐聚宁夏,探寻中国减贫密码 https://www.news.cn/…
国务院安委会挂牌督办福建泉州“7·9”重大火灾查处 https://www.news.cn/…
最终生成:
xinhuanet_news.xlsx 二、先不要写代码,先分析网页
很多新手学习爬虫,上来就是写代码
实际上:
爬虫最重要的是分析网页,而不是写代码
我打开新闻网站首页:
https://www.news.cn/
按下:
F12
打开开发者工具
第一步:寻找新闻区域
通过不断展开 HTML,我发现:
整个新闻区域都放在:
<div class="depth-cont">
里面
于是第一步就确定了:
depth-cont
↓
整个新闻区域
第二步:寻找新闻列表
继续分析:
<div class="list list-txt dot">
我发现:
页面里面一共有 3 个
每一个:
list list-txt dot
都是一列新闻
于是网页结构变成:
depth-cont │ ├── list list-txt dot ├── list list-txt dot └── list list-txt dot 第三步:寻找每一条新闻
继续展开:
<ul>
<li>
<a href="……">
新闻标题
</a>
</li>
</ul>
终于找到真正的数据
一条新闻就是:
<li>
标题:
<a>
链接:
href
整个网页结构就变成了:
depth-cont │ ├── list │ │ │ ▼ │ li │ │ │ ▼ │ a
到这里,整个网页结构已经分析完成
三、开始写代码
首先导入库:
import requests
from bs4 import BeautifulSoup
请求网页:
url = "https://www.news.cn/"
response = requests.get(url)
soup = BeautifulSoup(response.text,"html.parser")
获取新闻区域
因为:
depth-cont
只有一个
所以使用:
find()
depth = soup.find(
"div",
class_="depth-cont"
)
获取三个新闻列表
里面有三个:
list list-txt dot
所以:
使用:
```python
find_all()
lists = depth.find_all(
"div",
class_="list list-txt dot"
)
这里特别容易犯错
我的经验:
一个用 find(),多个用 find_all()
获取每一条新闻
继续:
for news_list in lists:
items = news_list.find_all("li")
这里:
items
就是:
所有新闻 获取标题
继续:
title = item.find(“a”)
这里:
千万不要写:
soup.find(“a”)
因为:
我们已经进入:
item里面了
获取链接
链接就在:
里面。
所以:
link = title.get(“href”)
注意:
很多新手都会写:
soup.get(“href”)
这是错误的
原因:
href
属于:
而不是:
soup 四、BeautifulSoup 最重要的三个知识
这是我学习过程中理解最深的一部分
① find()
返回:
Tag
例如:
title = item.find(“a”)
得到:
整个:
新闻标题
② .text
作用:
获取文字
例如:
title.text
输出:
新闻标题 ③ get()
作用:
获取标签属性。
例如:
title.get(“href”)
输出:
https://…
所以:
我总结了一句话:
哪个标签拥有属性,就从哪个对象调用 .get()
例如:
<img src="">
应该:
img.get(“src”)
而不是:
soup.get(“src”) 五、保存数据
我把每条新闻保存成字典:
news = {
“title”:title.text.strip(),
“link”:link
}
然后:
保存到:
list里面
news_list.append(news)
这样方便后面统一导出
六、导出 Excel
这里使用:
openpyxl
创建工作簿:
Workbook()
然后:
循环写入:
标题:
链接:
最后:
wb.save(“xinhuanet_news.xlsx”)
导出成功
七、我踩过的坑
学习过程中,我遇到了很多问题。
例如:
① ResultSet 没有 find()
原因:
我把:
find_all()
得到的列表,
又继续:
.find()
实际上:
find_all()
返回的是:
ResultSet(列表)
而不是:
Tag ② href 获取错误
一开始写:
soup.get(“href”)
后来才理解真正拥有:
href
的是:
<a>
所以应该:
title.get(“href”) ③ find 和 find_all
后来我总结了一句话:
只有一个
↓
find()
多个
↓
find_all()
以后分析网页,
我都会先观察
到底有几个列表
八、项目总结
完成这个项目以后,我最大的收获不是代码。
而是:
学会了如何分析网页。
现在拿到任何一个网页,我都会先思考:
整个区域
↓
一条数据
↓
标题
↓
链接
↓
其他信息
而不是急着写代码
我觉得:
这是学习 Python 爬虫过程中最重要的一步
项目地址
GitHub:
https://github.com/hanD686/NewsSpider


