如何优化 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.xdnf.cn/news/1488031.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

新智慧:企元数智呈现全新新零售合规分销系统免费送

新智慧!企元数智近期发布了令人振奋的消息:他们推出了全新的新零售合规分销系统,并且免费向企业赠送!这一举措旨在帮助更多企业轻松实现数字化转型,提高管理效率,实现持续增长。 企元数智的新零售合规分销系…

HTML学习笔记[Web开发]

HTML学习 本文为学习笔记,参考w3c,菜鸟,Mozilla,尚硅谷等文章编写。 文章目录 HTML 简介HTML文档的后缀名HTML版本 HTML 编辑器HTML 标签 (HTML Tag)HTML 提示:使用小写标签HTML 标签简写及全称 HTML 元素HTML元素组成…

Mysql-索引视图

目录 1.视图 1.1什么是视图 1.2为什么需要视图 1.3视图的作用和优点 1.4创建视图 1.5更新视图 1.6视图使用规则 1.7修改视图 1.8删除视图 2.索引 2.1什么是索引 2.2索引特点 2.3索引分类 2.4索引优缺点 2.5创建索引 2.6查看索引 2.7删除索引 1.视图 1.1什么是…

魔数是什么?class字节码文件魔数又是什么?

1:魔数是什么? 魔数,用来标记一个文件是哪种文件类型的,在个文件开头的几个字节(具体几个字节不确定,一般是2个字节或者是4个字节),比如pdf文件的魔数就是%PDF,如下使用sublime打开…

jmeter-beanshell学习-try处理异常

有时候代码执行过程中,出现一些不能处理的情况,就会报错,还影响之后的代码执行,就需要跳过异常。 报错了,还影响了下面的打印。beanshell用try和catch处理异常,加上一个try。 try {// 可能会抛出异常的代码…

Redis 7.x 系列【26】集群模式动态扩容、动态缩容

有道无术,术尚可求,有术无道,止于术。 本系列Redis 版本 7.2.5 源码地址:https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 动态扩容1.1 安装、启动1.2 加入新节点1.3 分配哈希槽1.4 加入从节点 2. 缩容2.1 删…

【Vue3】watch 监视 ref 定义的数据

【Vue3】watch 监视 ref 定义的数据 背景简介开发环境开发步骤及源码参数说明 背景 随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术出身的人总是很难放下一些执念,遂将这些知识整理成文,以纪念曾经努…

基于STM32的逻辑分析仪

文章目录 一、逻辑分析仪体验1、使用示例1.1 逻辑分析仪1.2 开源软件PulseView 2、核心技术2.1 技术方案2.2 信号采集与存储2.3 数据上传 3、使用逻辑分析仪4、 SourceInsight 使用技巧4.1新建工程4.2 设置工程名及工程数据目录4.3 指定源码目录4.4 添加源码4.5 同步文件4.6 操…

string使用及模拟

前言 相信看过我博客的小伙伴都已经C的接触已经很久了,也没那么多废话。stl库直接走起,最开始、最简单的就是string。string就相当于是把C语言中的字符串“char[]”给升了级,像是顺序表一样多了记录长度和容量的大小,还加了很多的…

大模型面试:LLM+向量库的文档对话系统

面试题 1.1 为什么大模型需要外挂(向量)知识库?如何将外部知识注入大模型,最直接的方法:利用外部知识对大模型进行微调 回答 大模型需要外挂(向量)知识库的原因: 知识更新频率:大模型在训练时使用的知识是静态的&am…

免杀笔记 -->API的整理Shellcode加密(过DeFender)

最近更新频率明显下降我懒,那么今天就来记录一下我们的一些常用的API的整理以及ShellCode的加密。 1.WinAPI整理 问我为什么要整理? 就是用起来的时候要左翻右翻 :: 烦死了 1.VirtualAlloc VirtualAlloc(NULL,sizeof(buf),MEM_…

人工智能和计算机视觉领域国际学术会议submission

文章目录 1. AAAI 20252. CVPR 20253. ICCV 20254. IJCAI 20255. ICRA 20256. NeurIPS 20257. ACL 20258. ICLR 2025 1. AAAI 2025 人工智能促进协会(AAAI)是一个成立于1979年的非营利性科学组织,专注于深化对智能行为和思维机制的科学理解&…

通过 WSL 2 在Windows 上挂载 Linux 磁盘

原文查看 曾为了传输或者共享不同系统的文件频繁地在 Windows 和 Linux 系统之间切换,效率过低,所以尝试通过 WSL 2 在Windows 上挂载 Linux 磁盘。 先决条件 需要在Windows 10 2004 及更高版本(Build 19041 及更高版本)或 Win…

排查一次线程泄漏

背景:最近经常发生K8S健康检查到应用的心跳接口超时不通,然后发生了重启,第一时间进入pod内部使用任何jvm命令都会导致java进程重启(也包括arthas工具使用不了),dump不下来,事故现场没法保留&am…

SpringBoot集成Sharding-JDBC实现分库分表

本文已收录于专栏 《中间件合集》 目录 版本介绍背景介绍拆分方式集成并测试1.引入依赖2.创建库和表3.pom文件配置3.编写测试类Entity层Mapper接口MapperXML文件测试类 4.运行结果 自定义分片规则定义分片类编写pom文件 总结提升 版本介绍 SpringBoot的版本是: 2.3.…

电子期刊制作攻略:从零开始,轻松入门

​随着互联网的快速发展,电子期刊已经逐渐成为人们获取信息和娱乐的重要途径。越来越多的人开始关注并投身于电子期刊的制作行业。那么,如何从零开始,轻松入门电子期刊制作呢? 1.首先点击FLBOOK在线制作制作电子杂志平台 2.点击开…

【odoo17】后端py方法触发右上角提示组件

概要 在前面文章中,有介绍过前端触发的通知服务。 【odoo】右上角的提示(通知服务) 此文章则介绍后端触发方法。 内容 直接上代码:但是前提一定是按钮触发!!!!! def bu…

无法解析插件 org.apache.maven.plugins:maven-war-plugin:3.2.3(已解决)

文章目录 1、问题出现的背景2、解决方法 1、问题出现的背景 最开始我想把springboot项目转为javaweb项目,然后我点击下面这个插件 就转为javaweb项目了,但是我后悔了,想要还原成springboot项目,点开项目结构关于web的都移除了&am…

HarmonyOS Next 省市区级联(三级联动)筛选框

效果图 完整代码 实例对象 export class ProvinceBean {id?: stringpid?: stringisSelect?: booleandeep?: objectextName?: stringchildren?: ProvinceBean[] }级联代码 import { MMKV } from tencent/mmkv/src/main/ets/utils/MMKV import { ProvinceBean } from ..…

【Git】merge合并分支

两个分支未修改同一个文件的同一处位置: Git自动合并 两个分支修改了同一个文件的同一处位置:产生冲突 例: 在master分支修改了main同时,feat分支也修改了相同的文件 合并的时候就会产生冲突 解决方法: Step1- 手工修改冲突文件,合并冲突内容…