欢迎光临
我们一直在努力

一个Python小白的爬虫学习路线—002

从网页结构分析,到 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

赞(0)
未经允许不得转载:171主机测评 » 一个Python小白的爬虫学习路线—002
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址