【问题标题】:Storing the results of Web Scraping into Database将 Web Scraping 的结果存储到数据库中
【发布时间】:2019-03-05 10:27:03
【问题描述】:

我已经编写了一个使用 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 型号系列,计算机内存大小和显示大小,所有笔记本电脑上都有。我无法在这些子列表中拆分标题列表。我也尝试了一种愚蠢的方法,我可以通过访问每个参数的各个类来拆分产品,但是它与正确的值不匹配。其他一些笔记本电脑的价格显示在其他一些加赞助的广告中,导致其中出现问题。 网站链接:Amazon Macbook Scraping 我只希望这些参数在我的列表或 excel 或 Mysql 数据库中:产品名称(行标题)、价格、操作系统、Cpu 型号系列、计算机内存大小和显示大小(6 列)

【问题讨论】:

    标签: python selenium selenium-webdriver web-scraping web-crawler


    【解决方案1】:

    嗯,在我看来,你有两个不同的问题:

    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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-21
      • 2017-09-08
      • 2016-11-13
      • 2013-10-27
      • 2012-06-12
      • 1970-01-01
      • 1970-01-01
      • 2019-12-29
      相关资源
      最近更新 更多