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

news2024/9/22 21:28:41

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 time

def init_driver():
    options = Options()
    options.add_argument("--disable-images")  # 禁用图片加载
    options.add_argument("--disable-javascript")  # 禁用 JavaScript
    driver = webdriver.Chrome(executable_path='path/to/chromedriver', options=options)
    return driver

def get_page_source(driver, url):
    driver.get(url)
    time.sleep(2)  # 等待页面加载
    return driver.page_source

def 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 EC

wait = WebDriverWait(driver, 10)
element = wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'gl-item')))

3. 并发执行

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

import threading

def 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 RequestException

def 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.text
        except 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.coloradmin.cn/o/1946783.html

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

相关文章

Vue 实现电子签名并生成签名图片

目录 前言项目结构代码实现 安装依赖创建签名画布组件生成签名图片 总结相关阅读 1. 前言 电子签名在现代Web应用中越来越普遍,例如合同签署、确认表单等。本文将介绍如何使用Vue.js实现一个简单的电子签名功能,并将签名生成图片。 2. 项目结构 项…

基于 LlamaIndex 构建自己的 RAG 知识库

创建虚拟环境用于运行 运行 InternLM 的基础环境,命名为 llamaindex conda create -n llamaindex python3.10 查看存在的环境 conda env list 激活刚刚创建的环境 conda activate llamaindex 安装基本库pytorch,torchvision ,torchaudio,pytorch-cuda 并指定通道&…

动态代理更改Java方法的返回参数(可用于优化feign调用后R对象的统一处理)

动态代理更改Java方法的返回参数(可用于优化feign调用后R对象的统一处理) 需求原始解决方案优化后方案1.首先创建AfterInterface.java2.创建InvocationHandler处理代理方法3. 调用 实际运行场景拓展 需求 某些场景,调用别人的方法&#xff0…

手机空号过滤批量查询的意义及方法

手机空号过滤批量查询是现代营销和通信管理中常用的技术手段,旨在通过批量处理手机号码,筛选出活跃号码和空号等无效号码,以提高营销效率和减少不必要的通信成本。以下是关于手机空号过滤批量查询的详细解答: 一、手机空号过滤批…

3dsMax 设置近平面削减,靠近模型之后看不到模型,看很小的模型放大看不到

3dsMax 设置近平面削减,靠近模型之后看不到模型,看很小的模型放大看不 问题展示 解决办法_1 把这两个东西最上面的拖拽到最上面,最下面的拖拽到最下面。 解决办法_2 勾选视口裁剪 把这两个东西最上面的拖拽到最上面,最下面的…

华为ensp中ISIS原理与配置(超详细)

isis原理与配置 8-20字节; 地址组成:area id,system id,set三部分组成; system id占6个字节;sel占一个,剩下的为area id区域号; system id 唯一, 一般将router id 配…

opengl 写一个3D立方体——计算机图形学编程 第4章 管理3D图形数据 笔记

计算机图形学编程(使用OpenGL和C) 第4章 管理3D图形数据 笔记 数据处理 想要绘制一个对象,它的顶点数据需要发送给顶点着色器。通常会把顶点数据在C端放入 一个缓冲区,并把这个缓冲区和着色器中声明的顶点属性相关联。 初始化立…

Python中高效处理大数据的几种方法

随着数据量的爆炸性增长,如何在Python中高效地处理大数据成为了许多开发者和数据科学家的关注焦点。Python以其简洁的语法和丰富的库支持,在数据处理领域占据了重要地位。本文将介绍几种在Python中高效处理大数据的常用方法。 目录 1. 使用Pandas进行数…

基于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 操…

为RTEMS Raspberrypi4 BSP添加SPI支持

为RTEMS Raspberrypi4 BSP添加SPI支持 主要参考了dev/bsps/shared/dev/spi/cadence-spi.c RTEMS 使用了基于linux的SPI框架,SPI总线驱动已经在内核中实现。在这个项目中我需要实习的是 RPI4的SPI主机控制器驱动 SPI在RTEMS中的实现如图: 首先需要将S…

25.x86游戏实战-理解发包流程

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 工具下载: 链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

江科大/江协科技 STM32学习笔记P9-11

文章目录 OLED1、OLED硬件main.c EXTI外部中断1、中断系统2、中断执行流程图3、STM32中断4、中断地址的作用5、EXTI6、EXTI基本结构7、AFIO复用IO口8、EXTI框图或门和与门 9、旋转编码器介绍10、硬件电路 OLED 1、OLED硬件 SCL和SDA是I2C的通信引脚,需要接在单片机…

java包装类型缓存简单探究-Integer为例

文章目录 包装类型缓存自动装箱与valueOf感悟结语 包装类型缓存 包装类型缓存是什么 本文以常用的Integer包装类为例做一个探索,感兴趣可以用类似方法查看其他包装类。 我们都知道它会缓存 -128到127之间的整数Integer对象。 结论大伙都知道。那么我们今天就来探究…

【Android】安卓四大组件之广播知识总结

文章目录 动态注册使用BroadcastReceiver监听Intent广播注册Broadcast Receiver 静态注册自定义广播标准广播发送广播定义广播接收器注册广播接收器 有序广播修改发送方法定义第二个广播接收器注册广播接收器广播截断 使用本地广播实践-强制下线使用ActivityCollector管理所有活…

ubuntu那些ppa源在哪

Ubuntu中的 PPA 终极指南 - UBUNTU粉丝之家 什么是PPA PPA 代表个人包存档。 PPA 允许应用程序开发人员和 Linux 用户创建自己的存储库来分发软件。 使用 PPA,您可以轻松获取较新的软件版本或官方 Ubuntu 存储库无法提供的软件。 为什么使用PPA? 正如…

【JavaEE】Spring Boot 自动装配原理(源码分析)

一. 前言 我们在写Spring Boot的程序代码的时候, 可以注入很多我们没有定义过的Bean.例如: Autowired private ApplicationContext applicationContext; Autowired public DataSourceTransactionManager transactionManager; Autowired public AutowireCapableBeanFactory …

软件开发者消除edge浏览器下载时“此应用不安全”的拦截方法

当Microsoft Edge浏览器显示“此应用不安全”或者“已阻止此不安全的下载”这类警告时,通常是因为Windows Defender SmartScreen或者其他安全功能认为下载的文件可能存在安全风险。对于软件开发者来说,大概率是由于软件没有进行数字签名,导致…

Visual Studio 2022新建 cmake 工程测试 tensorRT 自带样例 sampleOnnxMNIST

1. 新建 cmake 工程 vs2022_cmake_sampleOnnxMNIST_test( 如何新建 cmake 工程,请参考博客:Visual Studio 2022新建 cmake 工程测试 opencv helloworld ) 2. 删除默认生成的 vs2022_cmake_sampleOnnxMNIST_test.h 头文件 3. 修改默认生成的 vs2022_cma…

【屏显MCU】多媒体接口总结

本文主要介绍【屏显MCU】的基本概念,用于开发过程中的理解 以下是图层叠加示例 【屏显MCU】多媒体接口总结 0. 个人简介 && 授权须知1. 三大引擎1.1 【显示引擎】Display Engine1.1.1 【UI】 图层的概念1.1.2 【Video】 图层的概念1.1.3 图层的 Blending 的…

一键解锁:科研服务器性能匹配秘籍,选择性能精准匹配科研任务和计算需求的服务器

一键解锁:科研服务器性能匹配秘籍 HPC科研工作站服务器集群细分领域迷途小书童 专注于HPC科研服务器细分领域kyfwq001 🎯在当今科技飞速发展的时代,科研工作对计算资源的需求日益增长😜。选择性能精准匹配科研任务和计算需求的服…