Возникли проблемы с вставкой данных из beautifulsoup4 в базу данных sqlite3

#python #sqlite #beautifulsoup #python-requests

#python #sqlite #beautifulsoup #python-запросы

Вопрос:

Я не могу заставить свою базу данных sqlite3 заполняться какой-либо информацией, несмотря на то, что могу перенести всю информацию в файл .csv. Я довольно новичок в sqlite3, но последние несколько дней безуспешно пытался заставить это работать. Этот код взят у меня при просмотре видео на YouTube об использовании beautifulsoup4 для экспорта результатов в csv.

Это позволяет мне создавать нужные столбцы в sqlite3, но не заполняет их информацией, которую я выделил с помощью beautifulsoup4. Я не уверен, правильно ли я вызываю информацию в sqlite3. Я пробовал различные способы импорта данных, но ни один из них не был успешным.

     #Make a request to the ebay.com get a page
#collect data from each detail page
#collect all links to detail pages of each product
# write scraped data to a csv file

import requests
from bs4 import BeautifulSoup
import csv
import sqlite3


def get_page(url):
    response = requests.get(url)
    
    if not response.ok:
        print('Server Responded', response.status_code)
    else:
        soup = BeautifulSoup(response.text, 'lxml')

    return soup
    #print(response.ok)
    #print(response.status_code)


def get_detail_data(soup):
    #title
    try:
        title = soup.find('h1', id='itemTitle').get_text().replace('Details about', '').strip()   
    except:
        title = ''
    #price 
    try:
        price = soup.find('span', id='prcIsum').get_text()    
    except:
        price = ''
    #department    
    try:
        department = soup.find('span', itemprop="name").text.strip().split(' ')
    except:
        department = ''
    #seller   
    try:
        seller = soup.find('span', class_='mbg-nw').get_text()
    except:
        seller = ''
        
#Having difficulty pulling the "data" into my db
    data = {
        'title':title,
        'price': price,
        'department': department,
        'seller': seller
    }
    
    return data

def get_index_data(soup):

    try:
        links = soup.find_all('a', class_='s-item__link')

    except:
        links = []

    urls = [item.get('href') for item in links]
    return urls

#disabled csv function below
#def write_csv(data, url):

    #with open('output.csv', 'a') as csvfile:
      #  writer = csv.writer(csvfile)

      #  row = [data['title'], data['price'], data['seller'], data['department'], url]
       # writer.writerow(row)
        
def main():
    url = 'https://www.ebay.com/sch/i.html?_from=R40amp;_trksid=p2334524.m570.l1313amp;_nkw=colonel blade -coonamp;_sacat=0amp;LH_TitleDesc=0amp;_odkw=colonel blade'
    

    product = get_index_data(get_page(url))

    for link in product:
        data = get_detail_data(get_page(link))
        write_csv(data, link)

if __name__ == '__main__':
    main()
    
    #having difficulty importing beautifulsoup data into db
conn =sqlite3.connect("ultimate_ebay_scraper4.db")
c = conn.cursor()
c.execute('''drop table if exists ultimate_ebay_scraper4''')
c.execute('''CREATE TABLE ultimate_ebay_scraper4(title TEXT, price TEXT, seller TEXT, department TEXT, url TEXT)''')

conn.execute("""INSERT INTO ultimate_ebay_scraper4(title, price, seller, department, url)VALUES(data['title'], data['price'], data['seller'], data['department'], url)""")
conn.commit()
cursor.close()
connector.close()
 

Ответ №1:

Если я понимаю проблему, вы хотите ссылаться на свою переменную данных в запросе insert? Затем вы захотите параметризовать вызов execute

Обратитесь к примеру в документах

 execute("INSERT... VALUES(?, ...)",  (data['title'],... ))
 

Ответ №2:

Я вижу, что следующая строка имеет неправильный формат для чтения данных из вашего словаря:

 conn.execute("""INSERT INTO ultimate_ebay_scraper4(title, price, seller, department, url)VALUES(data['title'], data['price'], data['seller'], data['department'], url)""")
 

Попробуйте что-то вроде этого:

 cur.execute("insert into ultimate_ebay_scraper4(title, price, seller, department, url) values (?, ?,?,?,?)", (data['title'], data['price'],data['seller'],data['department'],url ))
 

Вам нужно будет протестировать, но я ожидаю, что вы получите строковый литерал словаря данных вместо самого значения.

Кроме того, я ожидаю, что переменная data выйдет из области видимости к тому времени, когда вы попытаетесь ее вставить. Создайте функцию с именем insert_data(…) и поместите ее в цикл следующим образом:

 for link in product:
        data = get_detail_data(get_page(link))
        write_csv(data, link)
        insert_data(data) # something like this