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

news/2024/5/5 12:11:27

本篇文章是使用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.mrgr.cn/p/41844675

相关文章

三、CPU基础-缓存

计算机中缓存一般分为两个部分 1.内存 2.CPU Cache 一、CPU Cache分级 CPU Cache 通常分为大小不等的三级缓存,分别是 L1 Cache、L2 Cache 和 L3 Cache。 L1 Cache 和 L2 Cache 都是每个 CPU 核心独有的(通常会分为「数据缓存」和「指令缓存」&#…

QA测试开发工程师面试题满分问答20: 软件的安全性应从哪几个方面去测试?

软件的安全性测试应从多个方面进行,并确保覆盖以下关键方面: 当回答问题时,可以根据自己的经验和知识,从上述要点中选择适合的方面进行详细说明。强调测试的综合性、全面性和持续性,并强调测试的重要性以及如何与开发团…

政安晨:【Keras机器学习示例演绎】(七)—— 利用 NeRF 进行 3D 体积渲染

目录 简介 设置 下载并加载数据 NeRF 模型 训练 可视化训练步骤 推理 渲染三维场景 可视化视频 结论 政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战 希望政安晨的博客能够对您有所裨益&#xff0…

01-服务与服务间的通信

这里是极简版,仅用作记录 概述 前端和后端可以使用axios等进行http请求 服务和服务之间也是可以进行http请求的spring封装的RestTemplate可以进行请求 用法 使用bean注解进行依赖注入 在需要的地方,自动注入RestTemplate进行服务和服务之间的通信 注…

制造数字化“管理套路”

在当今竞争激烈的市场环境中,制造企业始终关心三个核心问题:生产效率、产品质量、成本控制,所以许多企业渴望加强对生产过程的管理控制。 生产过程是一个相对复杂的过程,涉及到多个环节和因素。从原材料的采购到产品的设计、生产…

Nginx莫名奇妙返回了404

描述 nginx作为反向代理,代理python的服务,但是通过代理访问服务的时候,报了404的错误。 难受的是客户现场没有查看日志的权限,只有查看配置文件的权限,我们检测了几遍配置文件也没有找到问题,哎~ 问题引…

idea中打印日志不会乱码,但是部署到外部tomcat中乱码了。

问题:如图Tomcat乱码,而且启动时的系统日志不会乱码,webapp中的打印日志才乱码。 idea中的情况如下:正常中文展示。 问题分析:网上分析的原因是Tomcat配置的字符集和web应用的字符集不匹配,网上集中的解决…

233 基于matlab的多通道非负矩阵分解(MNMF)算法

基于matlab的多通道非负矩阵分解(MNMF)算法。其能够寻找到一个非负矩阵W和一个非负矩阵H,满足条件VW*H,从而将一个非负的矩阵分解为左右两个非负矩阵的乘积。使用EM准则对混合信号进行分解。程序已调通,可直接运行。 233 多通道非…

SpringBoot+Vue开发记录(四)

说明: 本篇文章的主要内容是软件架构以及项目的前端Vue创建 一、软件架构 我道听途说的,听说这个东西很关键很重要什么的。 软件架构(software architecture)是一个系统的草图,是一系列相关的抽象模式,用于指导大型软…

汇智知了堂晨会聚焦:NAS应用如何赋能网络安全实战

在近期汇智知了堂网络安全75班的晨会上,一场关于NAS应用的深入分享完美展开。学员们以饱满的热情投入到这场安全讨论中,共同探索网络安全的新天地。 此次分享会聚焦于NAS的应用,旨在帮助学员们更好地了解NAS的定义与功能,掌握其在…

05节-51单片机-模块化编程

1.两种编程方式的对比 传统方式编程: 所有的函数均放在main.c里,若使用的模块比较多,则一个文件内会有很多的代码,不利于代码的组织和管理,而且很影响编程者的思路 模块化编程: 把各个模块的代码放在不同的…

【微服务】spring读取配置文件多种方式深入详解

目录 一、前言 二、java配置文件介绍 2.1 java配置文件产生原因 2.2 项目使用配置文件好处 2.3 springboot项目配置文件的必要性 2.4 微服务架构下配置文件使用场景 三、java读取配置文件常用方法 3.1 使用Properties类读取配置文件 3.1.1 使用getResourceAsStream读取…

STM32 USB虚拟串口

电路原理图 usb部分 晶振部分 usb与单片机连接 配置信息 sys配置信息 rcc配置信息 usb配置信息 虚拟串口配置信息 时钟配置信息 项目配置信息 代码 包含文件 主函数代码 实验效果 修改接收波特率依然可以正常接收,也就是说单片机可以自动适应上位机的波特率设置。…

Linux 深入理解Linux文件系统与日志分析

在Linux系统中,文件名和文件数据是分开存储的 文件数据包含 元信息(即不包含文件名的文件属性) 和 实际数据 文件元信息存储在 inode(索引节点)里, 文件实际数据存储在 block(块)里; 文件名存储在目录块里 查看文件的元信息 stat 文件名 [ro…

HDFS详解(Hadoop)

Hadoop 分布式文件系统(Hadoop Distributed File System,HDFS)是 Apache Hadoop 生态系统的核心组件之一,它是设计用于存储大规模数据集并运行在廉价硬件上的分布式文件系统。 1. 分布式存储: HDFS 将文件分割成若干块…

【AI开发:音频】二、GPT-SoVITS使用方法和过程中出现的问题(GPU版)

1.FileNotFoundError: [Errno 2] No such file or directory: logs/guanshenxxx/2-name2text-0.txt 这个问题中包含了两个: 第一个:No module named pyopenjtalk 我的电脑出现的就是这个 解决:pip install pyopenjtalk 第二个&#xff1a…

Elasticsearch进阶篇(三):ik分词器的使用与项目应用

ik分词器的使用 一、下载并安装1.1 已有作者编译后的包文件1.2 只有源代码的版本1.3 安装ik分词插件 二、ik分词器的模式2.1 ik_smart演示2.2 ik_max_word演示2.3 standard演示 三、ik分词器在项目中的使用四、ik配置文件4.1 配置文件的说明4.2 自定义词库 五、参考链接 一、下…

MIMO-UNet复现,DeepRFT复现及总结

最近复现了去模糊网络MIMO-UNet及变体DeepRFT,并以此文做一个总结: 复现MIMO-UNet部分: 1.通过上一篇博文,我们已经知道了MIMO-UNet网络的大致组成结构 2.通过源网络的main.py文件,我们可以知道该网络间隔100轮保存一…

AI助力科研创新与效率双提升:ChatGPT深度科研应用、数据分析及机器学习、AI绘图与高效论文撰写

2022年11月30日,可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT3.5,将人工智能的发展推向了一个新的高度。2023年4月,更强版本的ChatGPT4.0上线,文本、语音、图像等多模态交互方式使其在…

Windows 安装 A UDP/TCP Assistant 网络调试助手

Windows 安装 A UDP/TCP Assistant 网络调试助手 0. 引言1. 下载地址2. 安装和使用 0. 引言 需要调试一个实时在线聊天程序,安装一个UDP/TCP Assistant 网络调试助手,方便调试。 1. 下载地址 https://github.com/busyluo/NetAssistant/releases 2. 安…