python爬虫小案例——汽车之家

本篇文章是使用bs4中的BeautifulSoup和requests解析网页和获取数据👑🌟

文章目录

  • 🌟前言
  • 一、🍉bs4中的BeautifulSoup
  • 二、🍉bs4的语法
  • 三、🍉内容实践
      • 1. 确定想要爬取的内容
      • 2. 分析网页
      • 3. 获取数据分析
  • 🌟总结


🌟前言

为了更深入的学习爬虫,今天来了解下bs4的使用和实践,当然解析网页不止只有bs4的BeautifulSoup可以做到,还有xpath语法和正则表达式。本期是初步的了解BeautifulSoup模块的使用,欢迎初学者学习本期内容。
在这里插入图片描述


一、🍉bs4中的BeautifulSoup

BeautifulSoup库是Python编程语言中的一款第三方库,主要用于解析HTML和XML文档。这个库能够将复杂的HTML或XML数据转换为树形结构(即DOM树),让开发者能够以更简单的方式来遍历、搜索和操作这些结构化的数据。

bs4的四种解析方式

解析器使用方法优势劣势
python标准库soup = BeautifulSoup(htmlt, ‘html.parser’)python内置标准库;执行速度适中python2.x或者python3.2x前的版本中文文档容错能力差
lxml HTML解析器soup = BeautifulSoup(html, ‘lxml’)速度快;文档容错能力强需要安装c语言库
lxml XML解析器soup = BeautifulSoup(html, ‘xml’)速度快;唯一支持XML的解析器需要安装c语言库
html5libsoup = BeautifulSoup(html, ‘html5lib’)最好的容错性;以浏览器的方式解析文档;生成HTML5格式的文档;不依赖外部扩展库速度慢

二、🍉bs4的语法

  1. 获取全部的单个标签:
soup.find_all('标签')
  1. 获取拥有指定属性的标签:
soup.find_all('标签',属性的键值对)
soup.find_all('标签',attrs={键值对1,键值对2})

注意:attrs是存储的是字典,里面可以包含html的多个属性

  1. 获取多个指定属性的标签:
soup.find_all('标签',属性的键值对1,属性的键值对2)

如果在获取时,出现python关键字与属性冲突时,在获取的时候添加一个下划线 ' _ ' ,例如:

soup.find_all('div',class_='position')
  1. 获取标签属性值:

先锁定标签

alist=soup.find_all('a')
  • 方法1:
    通过下标方式提取
for a in alist:href=a['href']print(href)
  • 方法2:
    利用attrs参数提取
for a in alist:href=a.attrs['href']print(href)
  1. 获取标签内的文本信息:
    使用string方法
# 获取html的所有div标签,从第二个开始
divs=soup.find_all('div')[1:]
# 利用循环输出每个标签
for div in divs:# 只提取标签下的字符串a=div.find_all('a')[0].string# 提取整个div下的字符串
divs=soup.find_all('div')[1:]
for div in divs:infos=list(div.stripped_strings)  # stripped_strings方法是删除列表中的制表符,例如: "\n,\t"等

三、🍉内容实践

爬取的网页链接:https://www.autohome.com.cn/news/1/#liststart

1. 确定想要爬取的内容

在此以爬取:前五页的(标题、更新时间和页面部分显示的详细内容)

2. 分析网页

首页内容,这里要注意的是这个网页链接,可以从第一页到第三页的链接对比

在这里插入图片描述

仔细查看后,只有这个/news/后的数字发生了变化,所以我们只要做一个循环数字的方式更改内容就可以

https://www.autohome.com.cn/news/1/#liststart
https://www.autohome.com.cn/news/2/#liststart
https://www.autohome.com.cn/news/3/#liststart

内容实施:

urls = []         # 定义一个列表存放每页的链接
for i in range(1, 6):url = f"https://www.autohome.com.cn/news/{i}/#liststart"urls.append(url)
# print(urls)

3. 获取数据分析

  1. 观察html标签内容

在这里插入图片描述

  1. 获取网页的标签信息,发现这些标签都在div标签中的ul标签里面

在这里插入图片描述

  1. 对比标签,发现每个内容都是使用的相同标签

在这里插入图片描述
在这里插入图片描述

  1. 代码
# 导包
from bs4 import BeautifulSoup
import requests# 设置请求头
url = 'https://www.autohome.com.cn/news/'
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 Edg/123.0.0.0"
}# 利用循环读取前5分页
urls = []         # 定义一个列表存放每页的链接
for i in range(1, 6):url = f"https://www.autohome.com.cn/news/{i}/#liststart"urls.append(url)
# print(urls)# 定义两个列表 news存放字典数据
news = []for url in urls:# 利用try……except语句获取每页,如果某页读取不了,则继续读取下一页try:response = requests.get(url, headers=headers)content = response.content.decode('gbk')  # 在网页上查看编码格式# print(content)# 实例化BeautifulSoup对象soup = BeautifulSoup(content, 'html.parser')# print(soup)# divs=soup.find_all('div',class_="article-pic")uls = soup.find_all('ul', class_="article")for ul in uls:# 获取标题title = list(ul.find_all('h3'))# 获取更新日期times = list(ul.find_all('span', class_="fn-left"))# 获取内容profiles = list(ul.find_all('p'))# print(times,title,profiles)# 提取标签内的字符串和使用zip打包在一起for title, times, profiles in zip(title, times, profiles):title = title.stringtimes = times.stringprofiles = profiles.string# 将数据存放在字典中car_news = {"title": title,"times": times,"profiles": profiles,}news.append(car_news)except:continueprint(news)
  1. 输出结果

在这里插入图片描述

🌟总结

这里需要注意的是使用bs4语句获取的标签内容是bs4的类型,不是列表类型,所以使用了强制转换成列表【list()】.

拓展:
在Python爬虫中,即使代码看起来没有明显语法错误,爬取的数据仍然可能为空,这通常与以下因素有关:

  1. 目标网站结构改变
    如果爬虫是基于HTML结构编写的,而目标网站进行了改版或更新,原有的选择器(如XPath或CSS Selector)可能不再有效,导致找不到预期的数据。
  2. 动态加载内容
    网页上的数据可能是通过JavaScript动态加载的,直接爬取HTML源代码可能无法获取这些数据。此时需要分析网页加载逻辑,使用如Selenium、Pyppeteer等工具模拟浏览器行为,或者通过分析Ajax请求来间接获取数据。
  3. 反爬策略
    目标网站可能启用了反爬虫策略,比如Cookies验证、User-Agent限制、IP封锁、验证码、登录验证等。这时,需要针对这些策略进行相应的处理,比如设置更真实的User-Agent、使用代理IP池、处理验证码或模拟登录。
  4. 请求参数不正确
    请求头信息(headers)、cookies、POST数据等参数可能需要特殊配置才能获取数据,如果缺少必要参数或参数不正确,服务器可能不会返回有效数据。
  5. 网络问题
    即使代码看似没问题,网络连接不稳定或服务器端出现问题也可能导致无法获取数据。
  6. 解析逻辑错误
    数据解析环节可能出现问题,例如正则表达式匹配不正确,或者在解析HTML或JSON时引用了不存在的键或属性。
  7. API调用权限或频率限制
    若爬取的是API接口,可能存在调用频率限制、API密钥失效或没有必要的授权。
  8. 数据缓存问题
    如果爬虫有缓存机制并且缓存了错误的结果,新的爬取可能会直接读取缓存而非从服务器获取新数据。

要解决这个问题,可以从以下几个步骤入手:

  • 检查并确认请求网址是否正确且能够正常访问;
  • 使用开发者工具查看网页加载过程,确认数据是如何加载和呈现的;
  • 检查请求头和请求体是否符合目标网站的要求;
  • 检查解析代码逻辑,特别是提取数据的部分;
  • 检测网络状况以及是否有反爬措施,调整爬虫策略;
  • 对于动态加载内容,确保相应脚本能够正确执行或模拟;
  • 针对可能出现的API限制,合理安排请求间隔,遵循网站的使用协议。

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

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

相关文章

AI预测福彩3D➕体彩排3合并2024年4月21日预测结果

由于今天是周末,周末事情比较多,今天回来比较晚了,数据刚跑完,趁着离开奖还有一段时间,咱们还是把3D和排3的预测合并发布。好了,废话不多说,直接放结果吧~ 一.4月21日3D预测结果 …

探索C++的奇妙世界:学习之旅的点点滴滴

在这个信息技术飞速发展的时代,编程语言作为计算机与人类沟通的桥梁,其重要性不言而喻。在众多编程语言中,C以其高效、灵活和强大的特性,吸引了无数编程爱好者的目光。今天,我将与大家分享我学习C的历程和心得&#xf…

JAVA并发编程面试题

作者有话说:目前正在跟新一系列的java面试题,持续不断更新。需要找工作或者不需要找工作的猴子们,都可以关注一下。着急的可以评论区留留言,面试文档以及简历模板。看到了我会发 1. 说说进程和线程的区别 进程 当一个程序在计算机…

java-Spring-入门学习-第二天(单例模式和多例模式)

目录 Bean作用域 单例模式(默认可以不写) Spring下的 AutoWired 依赖注入 JaveEE下的 Resource 依赖注入 多例模式 Bean作用域 ​在Spring框架中,Bean是按照作用域来创建的,常见的作用域有两种:Singleton 和 Prototype。Singleton (单例…

Python编程与算法面试-编程面试的重点

在求职面试的过程中,编程能力也是面试官非常看重的一项能力。而对于编程这项能力主要的考察点也有三个维度: 初级:编程的基本功 编程的基本功主要考察的编程语言的基本语法,原理知识,以及一些在编程过程中的常见问题…

深入理解MD5:Message Digest Algorithm 5

title: 深入理解MD5:Message Digest Algorithm 5 date: 2024/4/21 18:10:18 updated: 2024/4/21 18:10:18 tags: MD5哈希函数密码学数据完整性碰撞攻击安全性替代算法 导论 MD5的背景和历史 MD5(Message Digest Algorithm 5)是一种广泛使用…

基于httpd和lvs的dr模式简单测试

lvs主机:192.168.50.154 httpd主机:192.168.50.157 192.168.50.156 (ip需要在同一网段) 虚拟ip:192.168.50.183 前提准备: lvs安装: yum install ipvsadm -y lsmod|grep ip_vs modprobe ip_vs …

一堆喷儿香喷儿香的工具网站-已经收藏-搜嗖工具箱!

文心一言 https://yiyan.baidu.com/ ​ ChatGpt横空出世的横空出世好像一把钥匙,开启了大模型时代,国内也有不错的产品,比如百度的文心一言,从3.5到4.0看得见的成长,现在的文心一言是我们工作中不可缺少的好帮手&am…

javaEE初阶——多线程(五)

T04BF 👋专栏: 算法|JAVA|MySQL|C语言 🫵 小比特 大梦想 此篇文章与大家分享关于多线程的文章第五篇关于 多线程代码案例二 阻塞队列 如果有不足的或者错误的请您指出! 目录 2.阻塞队列2.1常见队列2.2 生产者消费者模型有利于进行解耦合程序进行削峰填谷…

OEEL图表——进行直方图绘制histogram函数的使用

简介 本文将使用histogram函数来进行数据分析。 直方图是一种用于可视化数据分布的图表。它可以帮助我们理解数据的集中程度、偏移程度和分散程度。以下是直方图的一些主要作用: 1. 展示数据分布:直方图可以将数据按照不同区间进行分组,并以柱状图的形式呈现。通过观察直…

走近网络安全公司:F5探索应用安全至简之道

伴随企业加速数字化转型工作、扩展到新的基础设施环境并采用微服务架构,企业正在拥抱混合和多云基础设施所带来的灵活性。现在跨越四种环境部署应用的企业,其平均需要管理和保护的应用数据路径比应用仅限本地部署时多10倍,复杂性呈指数级增加…

【JAVA基础篇】泛型详解版

🔥作者主页:小林同学的学习笔录 🔥mysql专栏:小林同学的专栏 目录 1.泛型的认识 2.泛型类 3.泛型方法 4.泛型接口 5.特别强调 6.类型通配符 简单化知识点,让你彻底了解泛型 1.泛型的认识 Java泛型是一种在Java编程语言…

Ubuntu系统安装配置笔记

最近装了台Ubuntu系统用于日常工作,过程中搜索了很多资料或找ChatGPT解答疑问,已有的资料都比较详细了,因此这篇笔记主要是列举大纲和参考网站,并记录中间踩坑耗时较多的问题。 一,系统安装 1,镜像下载 …

2024数学建模时间汇总与竞赛攻略

目录 2024数学建模汇总(时间、报名费、获奖率、竞赛级别、是否可跨校) 中国高校大数据挑战赛 “华数杯”国际大学生数学建模竞赛 美国大学生数学建模竞赛(美赛) 数学中国(认证杯)数学建模网络挑战赛 …

盲盒一番赏小程序:打开未知的惊喜之旅

在快节奏的生活中,人们总是渴望寻找一份属于自己的小确幸。盲盒一番赏小程序,正是这样一个为你带来无尽惊喜与乐趣的平台。我们精心打造这一小程序,让每一次点击都成为一次全新的探索,让每一次选择都充满无限可能。 盲盒一番赏小…

dns高防和ip高防的区别是什么?

在面对日益增长的网络安全威胁时,DNS高防和IP高防作为防御策略发挥着重要的作用。虽然两者都旨在保护网络资源免受攻击,但它们在操作方式和防护重点上有着本质的不同。 DNS高防:保护域名解析服务DNS高防,全称是高防御的域名解析服…

JavaWeb--05Vue项目简介

Vue项目简介 1 创建vue项目2 Vue项目目录结构3 运行Vue项目3 Vue项目开发流程 1 创建vue项目 环境准备好了,接下来我们需要通过Vue-cli创建一个vue项目,然后再学习一下vue项目的目录结构。Vue-cli提供了如下2种方式创建vue项目: 命令行:直接…

应用编程之线程(二-同步篇)

线程的主要优势在于,资源的共享性,譬如通过全局变量来实现信息共享,不过这种便捷的共享是有代价的,那就是多个线程并发访问共享数据所导致的数据不一 致的问题。 一、为什么需要线程同步 线程同步是为了对共享资源的访问进行保护…

用Cmake编译程序时,链接到FFmpeg库

用Cmake编译程序时,链接到FFmpeg库 一、前言 可喜可贺,折腾了一晚上终于把这个勾八链接成功了,已经要吐了。看到下面控制台的输出,吾心甚慰呀😭 [100%] Linking CXX executable rknn_yolov5_demo [100%] Built targe…

SpringBoot 操作 Redis

导入对应版本的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency>修改配置文件中的信息 spring:redis:host: 127.0.0.1port: 8888注意: 我这里 xsh…