可狱可囚的爬虫系列课程 08:新闻数据爬取实战

前言

本篇文章中我带大家针对前面所学 Requests 和 BeautifulSoup4 进行一个实操检验。
相信大家平时或多或少都有看新闻的习惯,那么我们今天所要爬取的网站便是新闻类型的:中国新闻网,我们先来使用爬虫爬取一些具有明显规则或规律的信息,在中国新闻网这个网站中,有一个即时新闻精选的板块,就是我们今天的目标,这是链接:https://www.chinanews.com/scroll-news/news1.html,爬取内容如图所示,我们要爬取每一条新闻的新闻类型、新闻标题、跳转链接、发布时间。
image.png

一、网页源代码的获取

接下来我直接应用 Requests 库,先将此网页的源代码请求下来。
注意:通过结果的打印,我们发现存在乱码问题,随即添加了纠正乱码的代码。

import requestsURL = 'https://www.chinanews.com/scroll-news/news1.html'
Headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36'
}
response = requests.get(url=URL, headers=Headers)
response.encoding = 'utf-8'
html_source = response.text if response.status_code == 200 else '状态码异常'
print(html_source)

image.png

二、源代码的解析

利用 BeautifulSoup4 库,针对请求到的源代码进行解析。

from bs4 import BeautifulSoupsoup = BeautifulSoup(html_source, 'html.parser')

三、开发者工具的使用

为什么要使用开发者工具?

相信大家已经仔细看过了 PyCharm 中打印的网页源代码,是不是感觉非常的杂乱,没有办法直观的找寻到网页结构,那么我们在写爬虫时,就需要参考开发者工具给的一些建议。请大家在需要爬取信息的页面打开开发者工具并查看 Elements 标签页。
image.png
在 Elements 标签页,大家也能够看到网页对应的源代码,并且我们在此处能更加直观的看清楚网页标签间的层级结构,更便于后续 CSS 选择器的编写。

检查元素

接下来我们要使用到开发者工具的另一个工具“检查元素”,它在 Elements 标签页左边,外形是一个方框加一个鼠标,使用这个工具我们可以比较精准的定位元素在源代码中的位置及所属层级结构,请看如下动图:
检查元素.gif
在这个动图中,给大家展示的步骤是,先点击“检查元素”这个按钮,然后在网页上移动鼠标便可以看到源代码位置也在同步定位,如果要找某块内容的位置可以直接在此内容上点击鼠标左键一键定位。

四、新闻信息获取

第一步:查看目标新闻的存在形式

经过寻找发现,目标新闻都属于如图所示位置 ul 标签下的一个个 li 标签,每一个 li 标签是一条完整的新闻。
image.png

第二步:逐级递进,层层缩减

我们在爬取数据时应遵循:从大范围逐级递减到小范围的原则循序渐进。所以我们先获取到所有目标新闻 li 标签,在开发者工具中根据层级结构书写 CSS 选择器。

li_list = soup.select('body > div.w1280.mt20 > div.content-left > div.content_list > ul > li')
print(li_list)

image.png

第三步:准确性判断&数据剔除

在第二步的基础上,判断获取出的所有 li 标签是否完全正确,如若存在错误数据,保证第二步书写 CSS 选择器正确无误条件下,进行错误数据的剔除。本爬虫通过判断,发现部分 li 标签并不存在目标新闻,通过检查,发现如图问题所在,每隔 10 条新闻便会出现一个分割横线,我们通过判断将其剔除。
image.png

for li in li_list:if str(li) != '<li class="nocontent"></li>':

第四步:准确信息提取

我们继续延续第三步的代码,在分支结构的基础上直接获取具体信息。同时我们发现获取的跳转链接不完整,我们将其一并不全。经过最终对比,爬取到的新闻与网页中的新闻无异。

for li in li_list:if str(li) != '<li class="nocontent"></li>':news_type = li.select_one('li > .dd_lm > a').textnews_title = li.select_one('li > .dd_bt > a').textnews_link = 'https://www.chinanews.com' + li.select_one('li > .dd_bt > a').attrs['href']news_time = li.select_one('li > .dd_time').textprint(news_type, news_title, news_link, news_time)

image.png

五、完整源代码

import requests
from bs4 import BeautifulSoupURL = 'https://www.chinanews.com/scroll-news/news1.html'
Headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36'
}
response = requests.get(url=URL, headers=Headers)
response.encoding = 'utf-8'
html_source = response.text if response.status_code == 200 else '状态码异常'
# print(html_source)soup = BeautifulSoup(html_source, 'html.parser')li_list = soup.select('body > div.w1280.mt20 > div.content-left > div.content_list > ul > li')
# print(li_list)for li in li_list:if str(li) != '<li class="nocontent"></li>':news_type = li.select_one('li > .dd_lm > a').textnews_title = li.select_one('li > .dd_bt > a').textnews_link = 'https://www.chinanews.com' + li.select_one('li > .dd_bt > a').attrs['href']news_time = li.select_one('li > .dd_time').textprint(news_type, news_title, news_link, news_time)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/596816.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系列六、RestTemplate

一、RestTemplate 1.1、概述 RestTemplate是一种便捷的访问RestFul服务的模板类&#xff0c;是Spring提供的用于访问Rest服务的客户端模板工具集&#xff0c;它提供了多种便捷访问远程HTTP服务的方法。 1.2、API https://docs.spring.io/spring-framework/docs/5.2.2.RELEASE…

【MFC】计算机图形学实验:熟悉开发环境及工具(代码)

实验内容&#xff1a; 【MFC】计算机图形学实验1&#xff1a;熟悉开发环境及工具_绘制多义线mfc-CSDN博客 画笔和字体只给出两处代码&#xff1a; //创建刷子&#xff0c;设置填充色为黑色 CBrush NewBrush; NewBrush.CreateSolidBrush(RGB(0, 0, 0)); pDC->SelectObjec…

Spring动态定时任务异常Cron expression must consist of 6 fields

spring-context-5.3.24版本源码实例化CronTrigger 时判断了cron表达式长度必须是6&#xff0c;spring 4.x中已经不支持7个参数的cronin表达式了 解决方案&#xff1a; &#xff08;1&#xff09;使用别的定时框架 &#xff08;2&#xff09;如果涉及很多业务代码&#xff0c…

Apache Commons BCEL与Java字节码操作

第1章&#xff1a;Apache Commons BCEL简介 大家好&#xff0c;我是小黑&#xff0c;咱们今天来聊聊Apache Commons BCEL&#xff08;Byte Code Engineering Library&#xff09;。你可能会问&#xff0c;BCEL是什么鬼&#xff1f;别急&#xff0c;小黑这就给你娓娓道来。BCEL…

Window10 下同时安装 JDK8 和 JDK11

1、下载两个版本的JDK 从Oracle 官网下载两个版本的 JDK 文件到本地&#xff0c;官网下载地址&#xff1a;JDK 下载 | ORACLE 2、部署环境变量 为方便切换 JDK 版本&#xff0c;这里分别新建&#xff1a;JAVA_HOME、JAVA11_HOME 和 JAVA8_HOME 变量&#xff0c;配置内容如下…

【unity】基于Obi的绳长动态修改(ObiRopeCursor)

文章目录 一、在运行时改变绳子长度:ObiRopeCursor1.1 Cursor Mu&#xff08;光标μ&#xff09;1.2 Source Mu&#xff08;源μ&#xff09;1.3 Direction&#xff08;方向&#xff09; 一、在运行时改变绳子长度:ObiRopeCursor Obi提供了一个非常通用的组件来在运行时修改绳…

Vue2.Hello World

步骤&#xff1a; 准备容器引包&#xff08;开发版本/生产版本&#xff09;创建实例new Vue()添加配置项 el指定挂载点data提供数据 准备容器 就是新建一个div标签 引包 vue2版本中文文档&#xff1a;https://v2.cn.vuejs.org/v2/guide/ 尝试 Vue.js 最简单的方法是使用 …

JS运行机制、Event Loop

1、JS运行机制 JS最大的特点就是单线程&#xff0c;所以他同一时间只能做一件事情。使单线程不阻塞&#xff0c;就是事件循环。 在JS当中分为两种任务&#xff1a; 同步任务&#xff1a;立即执行的任务&#xff0c;一般放在主线程中&#xff08;主执行栈&#xff09;。异步任…

Avalonia学习(十七)-CEF

今天开始继续Avalonia练习。 本节&#xff1a;CefNet 1.引入 CefNet.Avalonia.Eleven 2.项目引入 Program中加入 using Avalonia; using Avalonia.ReactiveUI; using Avalonia.Threading; using CefNet; using System; using System.IO; using System.Linq; using System…

webStorm打开终端Cannot open Local Terminal Failed to start [powershell.exe] in

今天webStorm打开终端显示 Cannot open Local Terminal Failed to start [powershell.exe] in D:\allproject\boosterStation 有关详细信息&#xff0c;请查看 IDE 日志(帮助 | 在 Explorer 中显示日志)。 解决方案&#xff1a; 打开设置&#xff08;如下图&#xff09;&a…

OEE如何为制造企业实施ISO50001提供支持

ISO50001是一项旨在帮助企业建立和实施能源管理体系的国际标准&#xff0c;以提高能源效率、降低能源消耗和减少环境影响。而设备OEE&#xff08;设备综合效率&#xff09;作为一个关键的生产效率指标&#xff0c;可以为企业实施ISO50001提供重要的支持。本文将介绍ISO50001能源…

C语言快速入门——高级特性

C语言高级特性 C语言高级特性函数创建和使用函数全局变量和局部变量函数参数和返回递归调用 指针什么是指针指针与数组多级指针指针数组与数组指针指针函数与函数指针 结构体、联合体和枚举创建和使用结构体结构体数组和指针联合体枚举typedef关键字 预处理文件包含系统库介绍宏…

Mysql事务transaction简介

文章目录 什么是事务针对Mysql隔离级别读未提交读提交可重复读串行化 mysql中的数据结构索引数据结构mysql中的锁种类**共享锁和独占锁**表锁、行锁(记录锁、间隙锁、临键锁) spring中的事务事务特性 什么是事务 事务是一个不可分割的数据库操作序列&#xff0c;也是数据库并发…

RT-DETR算法优化改进:提出一种新的Shape IoU,更加关注边界框本身的形状和尺度,对小目标检测也很友好 | 2023.12.29收录

💡💡💡本文改进:一种新的Shape IoU方法,该方法可以通过关注边界框本身的形状和尺度来计算损失,解决边界盒的形状和规模等固有属性对边界盒回归的影响。 💡💡💡对小目标检测涨点明显,在VisDrone2019、PASCAL VOC均有涨点 RT-DETR魔术师专栏介绍: https://blo…

element中Table表格控件实现单选功能、多选功能、两种分页方式

目录 1、Table表格控件实现单选功能2、Table控件和Pagination控件实现多选和两种分页方式方法一&#xff1a;使用slice方法方法二&#xff1a;多次调用接口 1、Table表格控件实现单选功能 <template><div><!-- highlight-current-row 是否要高亮当前行 -->…

【Python机器学习】k近邻——k近邻分类

k-NN算法最简单的版本是只考虑一个最近邻&#xff0c;也就是想要预测的数据点最近的训练数据点&#xff0c;预测结果就是这个训练数据点的已知输出。 除了仅考虑最近邻&#xff0c;还可以考虑任意&#xff08;k个&#xff09;邻居&#xff0c;这也是k近邻算法名字的由来。在考…

1*2*3+3*4*5+...+99*100*101python,1加到100的程序算法python

大家好&#xff0c;本文将围绕python中123一直加到100程序怎么写展开说明&#xff0c;计算123456...100的值python是一个很多人都想弄明白的事情&#xff0c;想搞清楚计算1-23-45 … -100的值python需要先了解以下几个事情。 今天下午上python课的时候&#xff0c;老师留了一个…

佳能G3800彩色喷墨多功能一体打印机报5B00错误代码处理方法

5B00错误代码的含义 5B00错误代码是指佳能G3800打印机的“废墨仓已满”。这个废墨仓是打印机内部的一个部件&#xff0c;主要用于收集打印过程中产生的废墨。当废墨仓已满时&#xff0c;打印机就会报5B00错误代码。 佳能G3800彩色喷墨多功能一体打印机报5B00错误代码处理办法 …

大数据 MapReduce是什么?

在Hadoop问世之前&#xff0c;其实已经有了分布式计算&#xff0c;只是那个时候的分布式计算都是专用的系统&#xff0c;只能专门处理某一类计算&#xff0c;比如进行大规模数据的排序。 很显然&#xff0c;这样的系统无法复用到其他的大数据计算场景&#xff0c;每一种应用都…

大数据技术与应用开发赛项笔记

各种启动命令 修改mysql数据库编码&#xff1a;alter database shtd_result CHARACTER SET utf8; hadoop : start-all.sh hive服务&#xff1a; hive --service metastore hive 客户端 &#xff1a;hive dolphinscheduler服务&#xff1a;./bin/dolphinscheduler-daemon.sh sta…