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

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

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

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

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

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

【问题讨论】:

    标签: python sqlite web-scraping


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-10-21
        • 1970-01-01
        • 2020-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多