存储知乎数据


  • Scrapy -> Shell 中配置 User-Agent

scrapy shell -s USER_AGENT="Browser AGENT"  URL

  • 分析URL

源URL
https://www.zhihu.com/api/v4/answers/640764591/rewarders?include=data%5B*%5D.answer_count%2Carticles_count%2Cfollower_count%2Cis_blocking%2Cis_blocked%2Cis_following%2Cis_followed&offset=0&limit=10
  • offset = 0

偏移量 = 从哪条开始

  • limit = 10

限制 = 加载多少条 数据

分析网站URL请求的结构,是非常重要的。它会让我们清楚应该发送什么样的请求

  • 设计数据表结构
    question


    answer

  • 重构 pipeline

    假如一个 item 对应一个 pipeline,后续上百个或者更多的 item,岂不是需要发起上百次 db 连接,现在需要做的就是一个 pipeline / cursor,处理所有的 item。实际上在真正的开发中,有可能不同的 spider 或一个 spider 爬取的数据,我们需要存储到不同的 db 当中,这个时候可以根据不同的 db 建立 pipeline。

    • 实现一个 pipeline 处理多个 item

      在每个 item 中,定义 insert sql 语句,与需要 insert 的 tuple field,作为实例方法,返回出去

      def get_insert_sql(self):
      """
      定义 insert_sql 语句,以及参数
      """
      insert_sql = '''
        insert into zhihu_question(zhihu_id, topics, url, title, content, answer_num, 
        comments_num, watch_user_num, click_num, crawl_time)
        VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
      '''
      
      params = (
        self.get('zhihu_id', 0), self.get('topics', ''), self.get('url', ''), self.get('title', ''),
        self.get('content', ''), self.get('answer_num', 0), self.get('comments_num', 0),
        self.get('watch_user_num', 0), self.get('click_num', 0), self.get('crawl_time', '1970-01-01')
      )
      return insert_sql, params

      重构 Twisted 类 -> do_insert 方法

      def do_insert(self, cursor, item):
          """
          cursor(游标)参数,是 Twisted.adbapi 模块,自动注入的
          入库逻辑代码
          根据不同的 item , 构建不同的 sql 语句,并插入到 db 中
          """
          # 不推荐的用法, 通用性不强
          # if item.__class__.__name__ == 'JobBoleArticleItem':
      
          # 调用实例化对象 item 中的方法,获取 insert sql 语句,与 tuple field
          insert_sql, params = item.get_insert_sql()
          # 传入 sql 语句,以及对应的参数
          cursor.execute(insert_sql, tuple(params))
          return item

Author: Ming Hui
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source Ming Hui !
 Previous
session 与 cookie 的区别 session 与 cookie 的区别
Cookie 浏览器本地存储方式,存储键值对的格式 简介为什么有cookie的存在,http协议是一种无状态的协议,服务器接收到浏览器的请求后,服务器直接返回内容给浏览器。不管是谁发起的请求 ​ Cookie存储本地,存在隐患。随
2020-08-09 Ming Hui
Next 
Scrapy 暂停与重启 Scrapy 暂停与重启
实现方法如下方法一:进入 Terminal 输入以下命令scrapy crawl spider -s JOBDIR=job_info/001 方法二:配置 settings 组件JOBDIR='job_info/001' 方法三:在 Spi
2020-08-09