将网络搜集的结果存储到数据库中

时间:2018-09-29 19:52:05

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

我已经编写了使用python进行网络抓取的代码。该代码使用硒从亚马逊提取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列)

1 个答案:

答案 0 :(得分: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数据库中的示例:

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