我必须编写一个程序来搜索网站“LivingSocial”以获取其交易和促销的所有细节,并将其存储在MySQL数据库中。
网址:" http://www.livingsocial.com/cities/15-san-francisco"
到目前为止,我已经能够编写这段代码:
from lxml import html
import requests
import MySQLdb
# connect
db = MySQLdb.connect(host="localhost", user="root", passwd="",
db="scrapy")
x = db.cursor()
page = requests.get('https://www.livingsocial.com/cities/15-san-francisco')
tree = html.fromstring(page.content)
#This will create a list of buyers:
descrip = tree.xpath('//p[@class="description"]/text()')
loc = tree.xpath('//p[@class="location"]/text()')
try:
x.execute("""INSERT INTO scrapy VALUES (%s,%s)""",(descrip,loc))
db.commit()
except:
db.rollback()
db.close()
我使用xampp服务器创建了一个MySQL数据库 但是这段代码似乎没有按预期运行。请帮忙!
答案 0 :(得分:0)
第一个问题是您正在提取独立的描述和位置,这会导致问题,因为并非每笔交易都有位置。相反,您需要迭代所有“交易”,并为每笔交易获取描述和位置:
deals = [
{'description': deal.findtext('.//p[@class="description"]'),
'location': deal.findtext('.//p[@class="location"]')}
for deal in tree.xpath("//li[@dealid]")
]
此处deals
将成为词典列表。如果没有提供位置,它将是None
(然后在MySQL中将变为NULL)。
下一个问题是将deals
插入数据库。为此,我们将使用executemany()
:
x.executemany("""
INSERT INTO
scrapy
VALUES
(%(description)s, %(location)s)
""", deals)
db.commit()
作为旁注,您不应该使用bare except clause而是捕获更具体的例外。此外,您正在静默捕获错误并回滚,这会阻止您知道发生了什么,引发了什么错误。记录您的错误:
try:
# ...
except SomeMeaningfulException as e:
print(e) # TODO: properly log the exception
db.rollback()