用 scrapy 框架中的 Spider 模版来写爬虫,爬网页过程中将数据插入到数据库里,为了能在正常结束和异常中断的情况下都能关闭数据库游标和数据库连接,我在 start_requests 方法中用了 try 和 finally 语句,在 try 中返回 Request 对象,在 finally 中关闭游标和数据库连接。程序的大致结构如下,其中一些操作用汉字来描述了。
实际运行时,执行到 parse()中的将 item 值插入数据库时报错,提示游标未打开。
发现是因为在执行 yield Request()语句时,会先运行 finally 中的语句,然后才执行 parse()方法,从而使得游标在 finally 中先被关闭,进而报错。
恳请大家指点,大家在用 Spider 模板写爬虫时,为了确保在正常和异常状态下都能关闭游标和数据库连接,这些关闭的操作都是放在哪里实现的呢?
感谢!
class MySpider(Spider):
连接数据库的语句
打开游标的语句
def start_requests(self):
driver.get(url)
try:
yield Request(url=url, callback=self.parse)
finally:
关闭游标的语句
关闭数据库连接的语句
def parse(self, response):
解析页面元素并赋值给 item 字典对象
将 item 的值插入到数据库中
yield item
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.