如何优化 Selenium 和 BeautifulSoup 的集成以提高数据抓取的效率?

Python_00133.png

摘要

在互联网时代,数据的价值日益凸显。对于电商网站如京东,其商品信息、用户评价等数据对于市场分析、产品定位等具有重要意义。然而,由于这些网站通常使用 JavaScript 动态生成内容,传统的爬虫技术难以直接获取到完整数据。本文将以爬取京东商品信息为例,探讨如何优化 Selenium 和 BeautifulSoup 的集成,以提高数据抓取的效率。

动态网页抓取的挑战

对于京东这样的电商平台,许多商品信息和用户评价是通过 JavaScript 动态加载的。传统的静态网页爬取方法无法获取到这些动态生成的内容。此外,电商平台通常具有复杂的反爬虫机制,如 IP 限制、请求频率限制等,进一步增加了数据抓取的难度。

Selenium 和 BeautifulSoup 的作用

Selenium 是一个自动化测试工具,能够模拟真实用户的浏览器行为,执行 JavaScript,获取动态生成的网页内容。BeautifulSoup 是一个用于解析 HTML 和 XML 文档的 Python 库,能够从复杂的 HTML 文档中提取数据。

示例代码

以下是一个爬取京东商品信息的示例代码,展示如何使用 Selenium 和 BeautifulSoup 集成进行数据抓取。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import timedef init_driver():options = Options()options.add_argument("--disable-images")  # 禁用图片加载options.add_argument("--disable-javascript")  # 禁用 JavaScriptdriver = webdriver.Chrome(executable_path='path/to/chromedriver', options=options)return driverdef get_page_source(driver, url):driver.get(url)time.sleep(2)  # 等待页面加载return driver.page_sourcedef parse_page(html):soup = BeautifulSoup(html, 'html.parser')items = soup.find_all('div', class_='gl-item')for item in items:title = item.find('div', class_='p-name').get_text(strip=True)price = item.find('div', class_='p-price').get_text(strip=True)print(f'Title: {title}, Price: {price}')def main():driver = init_driver()url = 'https://search.jd.com/Search?keyword=手机&enc=utf-8'html = get_page_source(driver, url)parse_page(html)driver.quit()if __name__ == '__main__':main()

优化策略

1. 减少页面加载时间

通过禁用图片和 JavaScript 加载,可以显著减少页面加载时间。这不仅加快了页面获取速度,也减少了数据传输量。

2. 使用显式等待

使用 Selenium 的显式等待 (WebDriverWait) 而不是硬编码的 time.sleep(),可以更有效地等待页面加载完成。

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECwait = WebDriverWait(driver, 10)
element = wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'gl-item')))

3. 并发执行

使用多线程或异步编程来并发执行多个爬虫任务,从而提高整体的抓取效率。

import threadingdef fetch_data(url):driver = init_driver()html = get_page_source(driver, url)parse_page(html)driver.quit()urls = ['https://search.jd.com/Search?keyword=手机&enc=utf-8', 'https://search.jd.com/Search?keyword=电视&enc=utf-8']
threads = [threading.Thread(target=fetch_data, args=(url,)) for url in urls]
for thread in threads:thread.start()
for thread in threads:thread.join()

4. 使用代理和随机化

使用代理 IP 和随机化请求头可以避免 IP 被封禁,同时模拟真实用户行为

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.proxy import Proxy, ProxyType# 代理服务器信息
proxyHost = "www.16yun.cn"
proxyPort = "5445"
proxyUser = "16QMSOML"
proxyPass = "280651"# 创建 Proxy 对象
proxy = Proxy({'proxyType': ProxyType.MANUAL,'ftpProxy': f"{proxyHost}:{proxyPort}",'sslProxy': f"{proxyHost}:{proxyPort}",'httpProxy': f"{proxyHost}:{proxyPort}",
})# 创建 ChromeOptions 对象
chrome_options = Options()
chrome_options.add_argument('--proxy-server=http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}')# 初始化 WebDriver
driver = webdriver.Chrome(executable_path='path/to/chromedriver', options=chrome_options, proxy=proxy)# 访问目标网页
driver.get("http://example.com")# 后续操作...

5. 错误处理和重试机制

添加错误处理和重试机制,确保在遇到异常时能够自动重试。

import requests
from requests.exceptions import RequestExceptiondef fetch_data_with_retry(url, max_retries=3):for i in range(max_retries):try:response = requests.get(url)response.raise_for_status()return response.textexcept RequestException as e:print(f'Request failed: {e}, Retrying...')time.sleep(1)  # 等待重试return None

文章所使用的代理由亿牛云提供,有需要小伙伴可以关注了解下:https://v.16yun.cn/accounts/phone_register/?sale_user=ZM_seven7

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

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

相关文章

【Unity实战】yield return null还是WaitForEndOfFrame

当在Unity中编写协程(尤其是协程套无限循环)时,常常会用到yield关键字来控制协程的执行流程避免程序假死。以下是常见做法: yield return null 当使用yield return null时,协程会在下一帧继续执行。这意味着协程将暂…

SSM超市管理系统-计算机毕业设计源码12393

目 录 摘要 Abstract 1 绪论 1.1研究的背景和意义 1.2研究内容 1.3论文结构与章节安排 2 开发技术介绍 2.1 SSM框架 2.2 MySQL数据库 3 超市管理系统系统分析 3.1 可行性分析 3.2 系统流程分析 3.2.1 数据流程 3.3.2 业务流程 3.3 系统功能分析 3.3.1 功能性…

机器学习 | 回归算法原理——最速下降法(梯度下降法)

Hi,大家好,我是半亩花海。接着上次的最小二乘法继续更新《白话机器学习的数学》这本书的学习笔记,在此分享最速下降法(梯度下降法)这一回归算法原理。本章的回归算法原理基于《基于广告费预测点击量》项目,…

使用 AntV G2 绘制折线图

本文由ScriptEcho平台提供技术支持 项目地址:传送门 使用 AntV G2 绘制折线图 应用场景介绍 AntV G2 是一款基于 Vue 的数据可视化框架,可用于创建交互式图表。本代码展示了如何使用 AntV G2 绘制折线图,以可视化时间序列数据。 代码基本…

数据结构——队列(java实现)及相应的oj题

文章目录 前言队列队列的概念队列的实现队列的链表实现实现的方法与属性内部类实现节点入队列出队列获取队头元素但不删除判空获取队列元素个数 队列的数组实现循环队列方法属性实现:构造方法向循环队列插入一个元素,成功插入则为真。从循环队列中删除一…

Axivion Suite 7.8现已发布

现已实现100%覆盖MISRA规则,并加入了高级功能来提高代码分析能力。 我们很高兴地宣布Axivion Suite 7.8发布。全新版本的Axivion Suite对编译器、配置、分析、仪表板 (WebUI)和IDE插件的架构验证和静态代码分析功能均进行了升级。 100%覆盖所有可测试的MISRA规则 …

昇思25天学习打卡营第15天|K近邻算法实现红酒聚类

这个实验是关于如何使用MindSpore框架在红酒数据集上实现K近邻(KNN)算法来进行聚类分析的。KNN是一种简单但非常有效的机器学习算法,它通过计算样本之间的距离来决定其分类KNN算法的核心思想是,一个样本的类别可以通过它与训练集中…

Pytorch使用教学1-Tensor的创建

0 导读 在我们不知道什么是深度学习计算框架时,我们可以把PyTorch看做是Python的第三方库,在PyTorch中定义了适用于深度学习的张量Tensor,以及张量的各类计算。就相当于NumPy中定义的Array和对应的科学计算方法,正是这些基本数据…

【Nacos安装】

这里写目录标题 Nacos安装jar包启动Docker单体Docker集群 Nacos相关配置日志配置 Nacos安装 jar包启动 下载jar包 在官方下载链接,根据需求选择相应的版本下载。 解压 tar -zxvf nacos-server-2.4.0.1.tar.gz或者解压到指定目录 tar -zxvf nacos-server-2.4.0…

TikTok达人合作中的消费者行为研究:精准营销新趋势

随着全球社交媒体技术的飞速发展,TikTok作为短视频领域的佼佼者,其独特的达人带货模式不仅成为驱动消费市场发展的新力量,还深刻改变了消费者的购买行为。本文Nox聚星将和大家探讨TikTok达人合作过程中消费者的行为模式和偏好变化。 一、消费…

SkyWalking入门搭建【apache-skywalking-apm-10.0.0】

Java学习文档 视频讲解 文章目录 一、准备二、服务启动2-1、Nacos启动2-2、SkyWalking服务端启动2-3、SkyWalking控制台启动2-4、自定义服务接入 SkyWalking 三、常用监控3-1、服务请求通过率3-2、服务请求拓扑图3-3、链路 四、日志配置五、性能剖析六、数据持久化6-1、MySQL持…

企业怎么才能用上大语言模型?

题图|视觉中国 以ChatGPT为起点,大语言模型(LLM)用全面的技术创新,以及在用户和产业中的应用落地,再次掀起了一个AI新浪潮。 与它的前辈们相比,大语言模型因为打通了语言这一人类沟通中介&…

关联查询(xml)

多对多:数据库中需要有中间表,在两个实体类中都加入对方的List集合,在写查询语句时写三张表

MySQL第一阶段:多表查询、事务

继续我的MySQL之旅,继续上篇的DDL、DML、DQL、以及一些约束,该到了多表查询和事务的学习总结,以及相关的案例实现,为未来的复习以及深入的理解做好知识储备。 目录 多表查询 连接查询 内连接 外连接 子查询 事务 事务简介…

RTK高精度定位终端的功能跟用途

RTK高精度定位终端是一种集成了高精度定位技术的手持或便携式设备,其功能和用途广泛且重要。以下是RTK高精度定位终端的主要功能和用途: 一、功能 高精度定位: RTK技术通过接收卫星信号和地面基站的差分修正数据,实现厘米级甚至…

开源安全信息和事件管理(SIEM)平台OSSIM

简介 OSSIM,开源安全信息和事件管理(SIEM)产品,提供了经过验证的核心SIEM功能,包括事件收集、标准化和关联。 OSSIM作为一个开源平台,具有灵活性和可定制性高的优点,允许用户根据自己的特定需…

Java Linux操作系统

1、操作系统是协助用户调度硬件工作,充当用户和计算机硬件之间的桥梁 2、Linux内核 提供了linux系统的主要功能 3、发行版Centos:内核应用程序 4、快照:保存虚拟机的状态,当虚拟机出现问题的时候,可以恢复原始的状态…

华为强制恢复出厂设置后如何恢复数据?数据重生的2个方法介绍

华为作为全球知名的手机品牌,其产品在市场上广受欢迎。然而,有时由于各种原因,我们可能需要强制恢复出厂设置,这往往意味着数据的丢失。那么,如何在华为强制恢复出厂设置后,让数据“重生”呢?本…

Postman测试工具详细解读

目录 一、Postman的基本概念二、Postman的主要功能1. 请求构建2. 响应查看3. 断言与自动化测试4. 环境与变量5. 集合与文档化6. 与团队实时协作 三、Postman在API测试中的重要性1. 提高测试效率2. 保障API的稳定性3. 促进团队协作4. 生成文档与交流工具 四、Postman的使用技巧1…

Ubuntu24.04 deb文件 安装 MySQL8.4

Ubuntu24.04 deb文件 安装 MySQL8.4 ubuntu24.04 deb文件安装 MySQL8 升级系统 sudo apt update sudo apt -y dist-upgrade 安装常用工具 sudo apt -y install vim net-tools wget gcc make cmake lrzsz安装依赖 sudo apt -y install libmecab2 libjson-perl libaio1t64下载…