#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