将网页抓取的结果存储到数据库中

2024-03-09

我已经使用 python 编写了一段用于网页抓取的代码。该代码使用 selenium 从亚马逊提取 Macbook 的数据。现在我想将这些值存储在 Excel 或 MySql 中。特定产品行中有各种 html/css 类和一个包含产品所有参数的父类。准确地说,代码是:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
import xlwt 
from xlwt import Workbook 
option = webdriver.ChromeOptions()
option.add_argument("--incognito")
browser = webdriver.Chrome(executable_path='/home/mukesh/Desktop/backup/Programminghub/whatsapp_python_scripts/chromedriver_linux64/chromedriver', chrome_options=option)
# go to website of interest
browser.get("https://www.amazon.in/s/ref=nb_sb_noss_2?url=search-alias%3Daps&field-keywords=macbook")
# wait up to 10 seconds for page to load
timeout = 10
try:
    WebDriverWait(browser, timeout).until(EC.visibility_of_element_located((By.XPATH, "//img[@class='s-access-image cfMarker']")))
except TimeoutException:
    print("Timed out waiting for page to load")
    browser.quit()

titles_element = browser.find_elements_by_xpath("//div[@class='s-item-container']")
titles = []
for x in titles_element:
    value=x.text
    value=value.encode('ascii', 'ignore')
    titles.append(value)
print(titles)

现在我得到的输出是高度非结构化的,并且包含一些仅在某些产品上存在的参数。例如,参数:“最大分辨率”或“CPU 型号制造”仅出现在某些笔记本电脑上,而不是所有笔记本电脑上。我不需要这样的参数。我只想要这些参数:产品名称(行标题)、价格所有笔记本电脑上都有的操作系​​统、CPU 型号系列、计算机内存大小和显示屏大小。我无法拆分这些子列表中的标题列表。我也尝试了一种愚蠢的方法,我可以通过访问每个参数的各个类来分割产品,但它与正确的值不匹配。其他一些笔记本电脑的价格显示在其他一些加上赞助广告导致的问题。 网站链接:我只想要这些参数在我的列表或 Excel 或 Mysql 数据库中:产品名称(行标题)、价格、操作系统、CPU 型号系列、计算机内存大小和显示大小(6 列)


好吧,据我所知,你这里有两个不同的问题:

  1. 获取每个项目所需的所有详细信息并将其放入数据结构中。
  2. 使用 DB 或 Excel 文件(例如 CSV)保存该数据。

因此,假设您对产品感兴趣的是它的名称和价格(只是为了解释),我们将创建一个名为 Product 的简单类:

class Product(object):
    def __init__(self, name, price):
        self.name = name
        self.price = price

然后,对于您找到的每件商品,我们将获取它的价格和名称,并创建一个产品实例:

titles_element = browser.find_elements_by_xpath("//div[@class='s-item-container']")
products = []
for x in titles_element:
    try:
        name = x.find_element_by_class_name("s-access-title").text
        price = x.find_element_by_class_name("s-price").text
        products.append(Product(name, price))
    except WebDriverException:
        pass

当然,您可以使用正确的 CSS/Xpath 选择器甚至正则表达式来获取您感兴趣的任何其他数据。

之后,您将拥有所需的数据,并且使用 DB、JSON、CSV 或您想要的任何其他类型的数据存储来保存会更容易,让我们看一下将该数据保存到 CSV 文件例子:

import csv

def save_products_to_csv_file(product_list, file_name):
    with open(file_name, 'wb') as csvfile:
        fieldnames = ['name', 'price']
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
        writer.writeheader()

        for product in products:
            writer.writerow({'name': product.name, 'price': product.price})

这是使用 SQLAlchemy 将数据存储到 SQLite DB 的另一个示例:

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy import Column, String

Base = declarative_base()


# Creating a DB model class that reprsents our Product object.
class Product(Base):
    __tablename__ = 'products'

    # Here we define columns for the product
    id = Column(Integer, primary_key=True)
    name = Column(String)
    price = Column(String)


engine = create_engine('sqlite:///sqlalchemy_example.db')
Base.metadata.create_all(engine)


Session = sessionmaker(bind=engine)
session = Session()

titles_element = browser.find_elements_by_xpath("//div[@class='s-item-container']")
for x in titles_element:
    try:
        name = x.find_element_by_class_name("s-access-title").text
        price = x.find_element_by_class_name("s-price").text
        new_product = Product(name=name, price=price)
        session.add(new_product)
    except WebDriverException:
        pass

session.commit()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将网页抓取的结果存储到数据库中 的相关文章

  • 如何使用 lstm 执行多类多输出分类

    I have multiclass multioutput classification see https scikit learn org stable modules multiclass html https scikit lear
  • 如何向数据添加填充以使其可以接受 pycrypto 库中的 AES256 加密算法

    有人可以告诉我如何向数据添加填充 使其可以接受 pycrypto 库 Python 中的 AES256 加密算法 提前非常感谢 看着文档 http www dlitz net software pycrypto doc 看来要由图书馆用户自
  • Plotly - 不同颜色的表面

    我正在尝试在 Plotly for Python 中绘制多个曲面 每个曲面具有不同的颜色 具体来说 表面显示了在相空间中不同点采取行动的预测奖励函数 由于我在每个点都有多个可能的操作 因此每个点都是不同的表面 我想对每个表面进行独特的着色
  • 在python中浏览ftp目录

    我正在尝试使用 ftplib 使用 Python 3 从 ftp 服务器下载多个文件夹 我有一个文件夹名称列表 它们都位于文件夹 root 中 问题是我不知道如何浏览它们 当我使用cwd我可以进入更深的目录 但是如何再次起来呢 我正在尝试得
  • 如何在 pySpark 数据框中添加行 ID [重复]

    这个问题在这里已经有答案了 我有一个 csv 文件 我在 pyspark 中将其转换为 DataFrame df 经过一番改造后 我想在 df 中添加一列 这应该是简单的行 ID 从 0 或 1 开始到 N 我将 df 转换为 rdd 并使
  • 如何在 Google App Engine 中为模型定义唯一属性?

    我需要一些独特的属性 我怎样才能实现这个目标 有没有类似的东西unique True 我正在使用适用于 Python 的 Google App Engine Google 提供了执行此操作的函数 http code google com a
  • 如何消除 matplotlib 轴的相对偏移

    当我尝试对具有足够大数字的范围进行绘图时 我得到一个所有刻度都有相对偏移的轴 例如 plot 1000 1001 1002 1 2 3 我在横坐标轴上得到这些刻度 0 0 0 5 1 0 1 5 2 0 1e3 问题是如何删除 1e3并得到
  • python请求:重试直到收到有效响应

    我想知道是否存在重试请求一定次数的常见模式 可能由于服务器错误或网络不良而失败 我想出了这个 并且我愿意在那里找到更好的实现 cnt 0 while cnt lt 3 try response requests get uri if res
  • 如何读取 sql 查询到 pandas dataframe / python / django

    我在下面使用这个views py获取应用程序 from django db import connection def test request cursor connection cursor sql SELECT x n from ta
  • 如何在Python模拟中调用模拟方法

    我想创建一个模拟方法来调用被模拟的底层方法 我正在想象类似以下的内容 但我找不到任何有关模拟对象的文档 该对象包含对被模拟对象的引用 我将其表示为 wrapped method foo below from mock import patc
  • 在 PyQt 中使用 Windows 7 任务栏功能

    我正在寻找有关将一些新的 Windows 7 任务栏功能集成到我的 PyQt 应用程序中的信息 具体来说 如果已经存在使用新进度指示器的可能性 see here http www petri co il wp content uploads
  • 仅打印字符串中的元音

    我是Python新手 我正在尝试打印字符串中的所有元音 因此 如果有人输入 嘿 一切都好吗 所有元音都需要打印 但我不知道怎么做 所以这不是计算元音 而是打印元音 现在我已经得到了这个 sentence input Enter your s
  • Django 中同一个模型的多个多对多关系

    给定以下具有两个多对多关系的模型 class Child models Model name models CharField max length 80 class Foo models Model bar models ManyToMa
  • 带参数的 Python 列表过滤

    python中有没有一种方法可以在列表上调用过滤器 其中过滤函数在调用期间绑定了许多参数 例如有没有办法做这样的事情 gt gt def foo a b c return a lt b and b lt c gt gt myList 1 2
  • 如何使用 Python 3 在 OpenCV 3 上正确加载 cv2.KeyPoint 和描述符?

    有一天 我不得不恢复一个使用 OpenCV 3 和 Python 2 7 的旧项目 在此代码中 要加载 cv2 KeyPoint 我执行以下操作 import numpy as np import cPickle import cv2 ke
  • 是否有比 .apply() 更慢或更受控制的替代方案?

    所以这似乎是一个奇怪的问题 但我有一只熊猫DataFrame其中包含地址 我想对其进行地理编码 以便获得纬度和经度 我有可以使用的代码 apply 感谢这个非常有帮助的线程 使用 geopy pandas 的新列坐标 https stack
  • 使用 PyCharm 分析 Django

    即使在开发环境中 我的应用程序也相当慢 所以我想找出是什么导致它变慢 以便我可以尝试修复它 我了解调试工具栏 根据它的报告 数据库查询和下载的源都不是问题 所以它一定是业务逻辑 但是 我无法使用 Django 服务器运行 PyCharm 分
  • Mac 上的 PythonXY?

    如何在 Mac OS X Lion 上安装 Python 我开始了 它应该能够通过 macports 但无论如何我找不到 mac ports 网站上所述的端口 pythonXY 我对 MAC 和 pythonXY 都不太了解 但在 pyth
  • 从 s3 获取 ogg 轨道的长度而不下载整个文件

    如何在不下载整个文件的情况下获取 ogg 文件的播放长度 我知道这是可能的 因为 HTML5 标签和 VLC 都可以在加载 URL 后立即显示整个播放长度 而无需下载整个文件 有标题或我可以阅读的内容吗 也许甚至是比特率 我可以将其除以文件
  • 每次 apache 重新启动时,flask-login 会话都会被破坏

    我正在使用烧瓶登录https github com maxcountryman flask login https github com maxcountryman flask login和领域记住登录用户 http packages py

随机推荐

  • Prometheus 按标签子字符串分组

    我正在尝试解决在 Prometheus 中按指标进行查询求和和分组的问题 其中分配给指标值的标签对于我的求和和分组要求是唯一的 我有 ElasticSearch 索引的度量采样大小 其中索引名称标记在度量上 索引的命名如下 并放置在标签 i
  • 模板类的重载运算符<< [重复]

    这个问题在这里已经有答案了 我正在尝试实现一种返回流的二叉树方法 我想使用方法返回的流在屏幕中显示树或将树保存在文件中 这两个方法都属于二叉树类 声明 void streamIND ostream const BinaryTree
  • 当我使用“STORED AS AVRO”子句创建 Hive 表时,Avro 架构存储在哪里?

    至少有两种不同的方法来创建由 Avro 数据支持的 Hive 表 基于 Avro 模式创建表 在本例中 存储在 hdfs 中 创建表 users from avro schema 行格式 SERDE org apache hadoop hi
  • std::map 迭代器如何工作?

    C STL 类 std map 使用二叉树实现 O log n 查找 但对于树来说 迭代器如何工作并不是立即显而易见的 运算符在树结构中实际上意味着什么 虽然 下一个元素 的概念在数组中有明显的实现 但对我来说 它在树中并不那么明显 如何实
  • 如何使用 Python 3.7 和 Anaconda 运行 Spyder

    我已经在 Windows 10 计算机上安装了 Anaconda 该计算机附带了 Spyder 和 Python 3 6 但我希望升级到 Python 3 7 使用 Python 3 7 创建 Anaconda 环境很容易 只需使用 con
  • C# 多线程设计示例

    我对 C Net 比较陌生 我正在开发一个需要多线程的桌面应用程序 我想出了下面的模式作为基础 我想知道是否有人可以指出如何在编码 线程安全和高效方面做得更好 希望这有一定道理 public abstract class ThreadMan
  • 如何在 .NET 中使用 Firebase Admin SDK?

    我有一个用 VB Net 编写的 Windows 桌面应用程序 我的服务器需要与 Firebase 连接以将更新发送到该应用程序 Firebase 实时数据库 现在 我可以使用服务帐户中的 数据库机密 来执行此操作 但由于此功能已弃用 我想
  • 检测 Brainfuck 程序中的无限循环

    我写了一个简单的脑残 http en wikipedia org wiki BrainfuckMATLAB 脚本语言的解释器 它被输入随机的 bf 程序来执行 作为遗传算法项目的一部分 我面临的问题是 程序在相当多的情况下会出现无限循环 因
  • 寻找一种更有效的方法来过滤掉 Perl 哈希值

    我的目标是从原始堆栈的记录是not in the 好钥匙 list 我如何以最有效的方式实现这一目标 我目前正在编写的代码感觉很拖沓 我愿意接受建议 请注意 这些值可能会变得非常大 这是我的数据 Main data container my
  • 在 Scala 中顺序组合任意数量的 future

    我是 scala 新手 我尝试在 scala 2 10RC3 中组合多个 Future 这Futures应该按顺序执行 在文件中斯卡拉SIP14 http docs scala lang org sips pending futures p
  • Google Document AI API OCR 响应中的空页面数组

    我目前正在使用 Google Document AI API 通过 OCR 从 PDF 中提取文本 但是 我注意到 OCR 响应中的页面数组始终为空 即使 OCR 操作成功完成并且我能够从文档中检索文本 这是我正在使用的代码的简化版本 fr
  • Mercurial 樱桃采摘更改提交

    比如说 我对代码做了很多更改 并且只需要提交其中的一些更改 Mercurial 有没有办法做到这一点 我知道darcs有这样一个功能 I know hg transplant可以在分支之间执行此操作 但我需要类似的东西来在当前分支中提交代码
  • jQuery Ajax 调用 - 成功时设置变量值[重复]

    这个问题在这里已经有答案了 我正在编写一个应用程序 用于修改服务器中缓存对象的数据 这些修改是通过 ajax 调用执行的 该调用基本上更新该对象的属性 当用户完成工作时 我有一个基本的 保存更改 按钮 允许他们保存数据并刷新缓存的对象 为了
  • Indy HTTP:读取 403 响应内容

    我在使用 Indy HTTP 在 Delphi 中 和 Google Contacts API 时遇到问题 请参阅下页 客户端登录响应 部分 http code google com apis accounts docs AuthForIn
  • 尝试运行 Selenium Webdriver (WebdriverJS) 的示例测试时出现错误

    我正在尝试在文件中运行示例测试google search test js位于 node modules selenium webdriver example 我正在使用 WebdriverJS 并且只安装了selenium webdrive
  • 使用 java 解析器删除 XML 节点

    在下面的示例 XML 中 如果 E 13 如何使用 java 解析器删除整个 B 节点
  • 在 NSLayoutManager 中使用boundingRectForGlyphRange计算字边界时如何消除前导空格

    我正在 iOS 上将多行字符串分解为单词边界 我的解决方案以 NSLayoutManager 的boundingRectForGlyphRange 方法为中心 它几乎可以工作 只是每个单词的矩形向右偏移了几个像素 换句话说 NSLayout
  • 单用户的 Git 工作流程

    我是一家开发少量桌面应用程序和网站的单身商店 几个月前我开始使用 GIT 进行版本控制 我对它相当满意 但我的使用非常笨拙 我想知道单个用户的工作流程应该是什么 现在 我的每个项目文件夹中都有一个 git 文件夹 我每隔一段时间就提交一次更
  • React 中没有构造函数的初始化状态

    import React Component from react class Counter extends Component state value 0 increment gt this setState prevState gt
  • 将网页抓取的结果存储到数据库中

    我已经使用 python 编写了一段用于网页抓取的代码 该代码使用 selenium 从亚马逊提取 Macbook 的数据 现在我想将这些值存储在 Excel 或 MySql 中 特定产品行中有各种 html css 类和一个包含产品所有参