Хранение результатов Web Scraping в базе данных - PullRequest
0 голосов
/ 29 сентября 2018

Я написал код для очистки веб-страниц с использованием 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)

Теперь вывод, который я получаю, очень неструктурирован и содержит некоторые параметры, которые присутствуют только в определенных продуктах.Например, параметр: «Максимальное разрешение» или «Изготовление модели процессора» присутствуют только на определенных ноутбуках и не на всех. Я не хочу таких параметров. Я хочу только эти параметры: Название продукта (название строки), ЦенаОперационная система, семейство моделей процессоров, объем памяти компьютера и размер дисплея, которые присутствуют на всех ноутбуках.Я не могу разделить список названий в этом подсписке.Я также попробовал глупый подход, в котором я смог разделить продукты, получив доступ к отдельным классам каждого параметра, но затем он не соответствовал правильным значениям.Цена некоторых других ноутбуков была показана на некоторых других рекламных объявлениях плюс, что вызвало проблемы в нем.Ссылка на сайт: Amazon Macbook Scraping Я просто хочу, чтобы эти параметры были либо в моем списке, либо в базе данных Excel или Mysql: название продукта (название строки), цена, операционная система, семейство моделей процессоров, объем памяти компьютера иразмер дисплея (6 столбцов)

1 Ответ

0 голосов
/ 30 сентября 2018

Что ж, у вас есть две разные проблемы, как я вижу:

  1. Извлечение всех необходимых деталей для каждого элемента и помещение их в структуру данных.
  2. Сохранение этогоданные с помощью БД или файла 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 или даже регулярные выражения.

После этого у вас будут нужные данные, и это будет намного прощечтобы сохранить с использованием БД, 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})

А вот еще один примерхранения ваших данных вБД SQLite с использованием SQLAlchemy:

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