使用 python 和 sqlite 进行网页抓取。如何有效存储抓取的数据?

Posted

技术标签:

【中文标题】使用 python 和 sqlite 进行网页抓取。如何有效存储抓取的数据?【英文标题】:Web scraping with python and sqlite. How to store scraped data effectively? 【发布时间】:2013-04-17 14:49:48 【问题描述】:

我想定期(例如每小时)抓取一些特定网页。这是我想用python做的。抓取的结果应该插入到 SQLite 表中。新信息将被抓取,但“旧”信息也会再次被抓取,因为 python 脚本将每小时运行一次。

更准确地说,我想抓取一个运动结果页面,随着比赛的进行,越来越多的比赛结果会发布在同一页面上。因此,对于每次新的抓取,我只需要在 SQLite 表中输入新结果,因为旧的结果已经在一小时前(甚至更早)被抓取(并插入到表中)。

当第二次被刮掉时,我也不想插入两次相同的结果。所以应该有一些机制来检查一个结果是否已经被刮掉了。这可以在 SQL 级别完成吗?因此,我抓取整个页面,为每个结果创建一个 INSERT 语句,但只有那些 INSERT 语句成功执行,而这些语句以前不存在于数据库中。我正在考虑类似UNIQUE 关键字之类的东西。

或者我是否对性能考虑太多,应该通过每次在开始抓取之前执行DROP TABLE 来解决这个问题,然后再次从头开始抓取所有内容?我不会谈论太多的数据。一场锦标赛只有大约 100 条记录(= 比赛),一年大约有 50 场锦标赛。

基本上我只是对某种最佳实践方法感兴趣。

【问题讨论】:

【参考方案1】:

您想要做的是 upsert(如果不存在则更新或插入)。 在这里查看如何在 sqlite 中执行此操作:SQLite UPSERT - ON DUPLICATE KEY UPDATE

【讨论】:

【参考方案2】:

您似乎想插入不存在的数据?也许是这样的:

    检查条目是否存在 如果没有,请插入数据 如果更新了条目? (是否要更新)

您可以发出 2 个单独的 sql 语句 SELECT 然后 INSERT/UPDATE

或者你可以设置唯一的,我相信 sqllite 会提高 IntegrityError

try:
  # your insert here
  pass
except sqlite.IntegrityError:
  # data is duplicate insert
  pass

【讨论】:

以上是关于使用 python 和 sqlite 进行网页抓取。如何有效存储抓取的数据?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python 进行网页抓取

使用 Python 进行网页抓取

使用 Selenium Python 进行网页抓取 [Twitter + Instagram]

我没有得到所有的结果。使用 Selenium 和 Python 进行网页抓取

使用 Selenium 和 Python 进行用户输入的网页抓取动态网站

请教网页里的特定数据怎么抓取?