Python selenuim实战

简介: 使用Selenium爬取苏宁易购商品信息,步骤包括打开网页、翻页、获取信息并保存至本地JSON文件。核心功能有滚动页面加载更多商品(模拟鼠标滚动)和抓取每页数据(提取标题和价格)。主程序通过循环实现自动翻页,直到无下一页按钮,最终将所有数据整合到一个JSON文件中。完整代码展示了所需导入的模块、滚动页面及获取数据的函数,以及主程序逻辑。

selenuim实战

这个案例是爬取苏宁易购的商品信息,需要知道xpath标签的位置和如何实现翻页以及最终的数据保存到本地。

首先说流程

  1. 打开网页
  2. 翻页
  3. 获取信息并保存
  4. 重复2

本节案例中涉及了几个技术难点:第一,如何下拉滚动条下载商品,第二,如何实现翻页,也就是抓取下一页的内容,第三,如何判断数据已经抓取完毕,即终止页。下面我们逐步讲解。

当然!让我一步步来解释以上代码的作用和细节:

导入必要的模块

from selenium import webdriver
from selenium.webdriver.common.by import By
import json
import time
from selenium.webdriver.edge.options import Options

这里导入了Selenium库中需要的模块,包括webdriver用于驱动浏览器,By用于定位元素,json用于处理JSON格式数据,time用于进行时间相关操作,Options用于配置浏览器选项。

实现滚动页面函数

def scrollToDown():
    for i in range(1, 100):
        time.sleep(0.7)
        driver.execute_script(f"window.scrollTo(0, {i*500})")
        y = driver.execute_script("return window.scrollY")
        if y > 11000:
            break

这个函数名为scrollToDown,它的作用是模拟鼠标滚动页面,使页面不断向下滚动以加载更多的商品信息。循环中的execute_script方法用于在浏览器中执行JavaScript代码,实现滚动效果,并通过判断页面滚动的位置来确定何时停止滚动。

实现获取数据函数

def getData():
    prices = driver.find_elements(By.XPATH, "//div[@class='price-box']")
    titles = driver.find_elements(By.XPATH, "//div[@class='title-selling-point']")
    items = []
    for title, price in zip(titles, prices):
        item = {
   
            "title": title.text,
            "price": price.text
        }
        items.append(item)
    with open("1.json", "a", encoding="utf-8") as f:
        for item in items:
            json.dump(item, f, ensure_ascii=False)
            f.write(",\n")

这个函数名为getData,它的作用是从当前页面中提取商品标题和价格信息,并将其保存为JSON格式的文件。通过find_elements方法找到对应的元素,然后将数据组装成字典形式,最后以JSON格式写入文件。

  1. 主程序
if __name__ == '__main__':
    options = Options()
    url = "https://list.suning.com/0-179001-0.html?safp=d488778a.46601.searchMain.4&safc=cate.0.0&safpn=10006"
    driver = webdriver.Edge()
    driver.get(url)
    with open("suning.json", "a", encoding="utf-8") as f:
        f.write("[\n")
    while True:
        scrollToDown()
        getData()
        time.sleep(1)
        try:
            next_page_button = driver.find_element(By.XPATH, "//a[@id='nextPage']")
            if next_page_button.is_displayed():
                next_page_button.click()
            else:
                break
        except:
            break
    with open("1.json", "a", encoding="utf-8") as f:
        f.write("\n]")
    driver.quit()

主程序首先设置了浏览器选项并指定了要爬取的网址,然后打开了浏览器并开始爬取数据。while循环不断地滚动页面、获取数据,并尝试点击下一页按钮进行翻页,直到没有下一页按钮为止。最后关闭浏览器并保存数据。

完整代码

from selenium import webdriver
from selenium.webdriver.common.by import By
import json
import time
from selenium.webdriver.edge.options import Options

def scrollToDown():
    for i in range(1, 100):
        time.sleep(0.7)
        driver.execute_script(f"window.scrollTo(0, {i*500})")
        y = driver.execute_script("return window.scrollY")
        if y > 11000:
            break

def getData():
    prices = driver.find_elements(By.XPATH, "//div[@class='price-box']")
    titles = driver.find_elements(By.XPATH, "//div[@class='title-selling-point']")
    items = []
    for title, price in zip(titles, prices):
        item = {
   
            "title": title.text,
            "price": price.text
        }
        items.append(item)
    with open("1.json", "a", encoding="utf-8") as f:
        for item in items:
            json.dump(item, f, ensure_ascii=False)
            f.write(",\n")

if __name__ == '__main__':
    options = Options()
    url = "https://list.suning.com/0-179001-0.html?safp=d488778a.46601.searchMain.4&safc=cate.0.0&safpn=10006"
    driver = webdriver.Edge()
    driver.get(url)
    with open("suning.json", "a", encoding="utf-8") as f:
        f.write("[\n")
    while True:
        scrollToDown()
        getData()
        time.sleep(1)
        try:
            next_page_button = driver.find_element(By.XPATH, "//a[@id='nextPage']")
            if next_page_button.is_displayed():
                next_page_button.click()
            else:
                break
        except:
            break
    with open("1.json", "a", encoding="utf-8") as f:
        f.write("\n]")
    driver.quit()
目录
相关文章
|
6天前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
41 6
|
6天前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
79 44
|
2天前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
8 1
|
2天前
|
缓存 测试技术 Apache
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
9 1
|
7天前
|
数据可视化 开发者 Python
Python GUI开发:Tkinter与PyQt的实战应用与对比分析
【10月更文挑战第26天】本文介绍了Python中两种常用的GUI工具包——Tkinter和PyQt。Tkinter内置于Python标准库,适合初学者快速上手,提供基本的GUI组件和方法。PyQt基于Qt库,功能强大且灵活,适用于创建复杂的GUI应用程序。通过实战示例和对比分析,帮助开发者选择合适的工具包以满足项目需求。
36 7
|
7天前
|
数据采集 Web App开发 前端开发
Python爬虫进阶:Selenium在动态网页抓取中的实战
【10月更文挑战第26天】动态网页抓取是网络爬虫的难点,因为数据通常通过JavaScript异步加载。Selenium通过模拟浏览器行为,可以加载和执行JavaScript,从而获取动态网页的完整内容。本文通过实战案例,介绍如何使用Selenium在Python中抓取动态网页。首先安装Selenium库和浏览器驱动,然后通过示例代码展示如何抓取英国国家美术馆的图片信息。
26 6
|
5天前
|
Linux 开发者 iOS开发
Python系统调用实战:如何在不同操作系统间游刃有余🐟
本文介绍了 Python 在跨平台开发中的强大能力,通过实际例子展示了如何使用 `os` 和 `pathlib` 模块处理文件系统操作,`subprocess` 模块执行外部命令,以及 `tkinter` 创建跨平台的图形用户界面。这些工具和模块帮助开发者轻松应对不同操作系统间的差异,专注于业务逻辑。
18 2
|
7天前
|
数据采集 前端开发 中间件
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第26天】Python是一种强大的编程语言,在数据抓取和网络爬虫领域应用广泛。Scrapy作为高效灵活的爬虫框架,为开发者提供了强大的工具集。本文通过实战案例,详细解析Scrapy框架的应用与技巧,并附上示例代码。文章介绍了Scrapy的基本概念、创建项目、编写简单爬虫、高级特性和技巧等内容。
27 4
|
7天前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
25 2
|
10天前
|
数据采集 机器学习/深度学习 人工智能
Python编程入门:从基础到实战
【10月更文挑战第24天】本文将带你进入Python的世界,从最基础的语法开始,逐步深入到实际的项目应用。我们将一起探索Python的强大功能和灵活性,无论你是编程新手还是有经验的开发者,都能在这篇文章中找到有价值的内容。让我们一起开启Python的奇妙之旅吧!