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()
目录
相关文章
|
9天前
|
监控 前端开发 API
实战指南:使用Python Flask与WebSocket实现高效的前后端分离实时系统
【7月更文挑战第18天】构建实时Web应用,如聊天室,可借助Python的Flask和WebSocket。安装Flask及Flask-SocketIO库,创建Flask应用,处理WebSocket事件。前端模板通过Socket.IO库连接服务器,发送和接收消息。运行应用,实现实时通信。此示例展现了Flask结合WebSocket实现前后端实时交互的能力。
|
1天前
|
SQL 安全 数据库
Python Web开发者必学:SQL注入、XSS、CSRF攻击与防御实战演练!
【7月更文挑战第26天】在 Python Web 开发中, 安全性至关重要。本文聚焦 SQL 注入、XSS 和 CSRF 这三大安全威胁,提供实战防御策略。SQL 注入可通过参数化查询和 ORM 框架来防范;XSS 则需 HTML 转义用户输入与实施 CSP;CSRF 防御依赖 CSRF 令牌和双重提交 Cookie。掌握这些技巧,能有效加固 Web 应用的安全防线。安全是持续的过程,需贯穿开发始终。
6 1
Python Web开发者必学:SQL注入、XSS、CSRF攻击与防御实战演练!
|
4天前
|
前端开发 API 数据库
告别繁琐,拥抱简洁!Python RESTful API 设计实战,让 API 调用如丝般顺滑!
【7月更文挑战第23天】在Python的Flask框架下构建RESTful API,为在线商店管理商品、订单及用户信息。以商品管理为例,设计简洁API端点,如GET `/products`获取商品列表,POST `/products`添加商品,PUT和DELETE则分别用于更新和删除商品。使用SQLAlchemy ORM与SQLite数据库交互,确保数据一致性。实战中还应加入数据验证、错误处理和权限控制,使API既高效又安全,便于前端或其他服务无缝对接。
28 9
|
4天前
|
算法 搜索推荐 开发者
别再让复杂度拖你后腿!Python 算法设计与分析实战,教你如何精准评估与优化!
【7月更文挑战第23天】在Python编程中,掌握算法复杂度—时间与空间消耗,是提升程序效能的关键。算法如冒泡排序($O(n^2)$时间/$O(1)$空间),或使用Python内置函数找最大值($O(n)$时间),需精确诊断与优化。数据结构如哈希表可将查找从$O(n)$降至$O(1)$。运用`timeit`模块评估性能,深入理解数据结构和算法,使Python代码更高效。持续实践与学习,精通复杂度管理。
23 9
|
3天前
|
机器学习/深度学习 数据可视化 数据挖掘
从菜鸟到高手,一图胜千言!Python数据分析与机器学习中的数据可视化实战秘籍!
【7月更文挑战第24天】在数据科学中,数据可视化是探索与沟通的关键。从Matplotlib的基础绘图到Seaborn的统计图形,再到Plotly的交互式图表,这些工具助你成为数据叙事大师。示例代码涵盖正弦波图、小费散点图及鸢尾花分布图,展现从简单到复杂的可视化之旅。掌握这些技巧,你就能更有效地解析和呈现数据故事。
|
5天前
|
数据可视化 数据挖掘 Linux
震撼发布!Python数据分析师必学,Matplotlib与Seaborn数据可视化实战全攻略!
【7月更文挑战第22天】数据科学中,Matplotlib和Seaborn是Python的可视化主力。Matplotlib用于基础图表,如示例中的折线图;Seaborn则强化统计图形,如分布图。两者结合能创建复杂的可视化,如显示趋势与分布的同一图表。通过学习和运用这些工具,数据分析师能提升效率,更好地讲述数据故事。
18 2
|
12天前
|
数据库 开发者 Python
实战指南:用Python协程与异步函数优化高性能Web应用
【7月更文挑战第15天】Python的协程与异步函数优化Web性能,通过非阻塞I/O提升并发处理能力。使用aiohttp库构建异步服务器,示例代码展示如何处理GET请求。异步处理减少资源消耗,提高响应速度和吞吐量,适用于高并发场景。掌握这项技术对提升Web应用性能至关重要。
37 10
|
11天前
|
并行计算 监控 数据处理
构建高效Python应用:并发与异步编程的实战秘籍,IO与CPU密集型任务一网打尽!
【7月更文挑战第16天】Python并发异步提升性能:使用`asyncio`处理IO密集型任务,如网络请求,借助事件循环实现非阻塞;`multiprocessing`模块用于CPU密集型任务,绕过GIL进行并行计算。通过任务类型识别、任务分割、避免共享状态、利用现代库和性能调优,实现高效编程。示例代码展示异步HTTP请求和多进程数据处理。
26 8
|
6天前
|
算法 数据处理 索引
告别低效搜索!Python中Trie树与Suffix Tree的实战应用秘籍!
【7月更文挑战第21天】探索Python中的字符串搜索效率提升:使用Trie树与Suffix Tree。Trie树优化单词查询,插入和删除,示例展示其插入与搜索功能。Suffix Tree,复杂但强大,适用于快速查找、LCP查询。安装[pysuffixtree](https://pypi.org/project/pysuffixtree/)库后,演示查找子串及最长公共后缀。两者在字符串处理中发挥关键作用,提升数据处理效率。**