Web使用python进行报废

时间:2016-07-02 12:04:10

标签: python mysql web-scraping

我必须编写一个程序来搜索网站“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数据库 但是这段代码似乎没有按预期运行。请帮忙!

1 个答案:

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