爬取失信人名单

  1. 实现步骤

    • 创建爬虫项目
    • 根据需求定义数据模型
    • 实现爬虫
    • 保存爬取的数据
    • 实现随机user-agent和代理ip下载器中间件,解决ip反爬
  2. 实现爬虫的具体步骤

  3. 保存失信名单信息

    1. 创建数据库,创建表

    2. 在settings中配置数据库信息

      • host、port、db、user、password
    3. 实现管道类

      1. 在open_spider中,建立数据库连接,获取cursor

        • def open_spider(self, spider):
              """不用做判断,因为三只爬虫的爬取结果全部放到同一个数据库里边"""
              # 创建数据库连接
              self.connection = pymysql.connect(host=MYSQL_HOST, port=MYSQL_PORT, db=MYSQL_DB,
                                                user=MYSQL_USER, password=MYSQL_PASSWORD)
              # 获取游标
              self.cursor = self.connection.cursor()
          
      2. 在close_spider中,关闭cursor,关闭数据库连接

        • def close_spider(self, spider):
              # 关闭游标
              self.cursor.close()
              # 关闭连接
              self.connection.close()
          
      3. 在process_item中,如果数据不存在,保存数据

        • def process_item(self, item, spider):
              # 存储过程,最重要是判断数据是否已经存在
              # 判断数据是否已经存在
              if item['age'] == 0:
                  select_count_sql = "select count(1) from dishonest where name='{}' and area='{}'".format(item['name'],
                                                                                                           item['area'])
              else:
                  select_count_sql = "select count(1) from dishonest where card_num='{}'".format(item['card_num'])
          
              # 执行查询
              self.cursor.execute(select_count_sql)
              count = self.cursor.fetchone()[0]    # 游标会获取的结果是列表形式
          
              # 根据查询结果,决定是否插入数据
              if count == 0:
                  keys, values = zip(*dict(item).items())
                  insert_sql = 'insert into dishonest ({}) values ({})'.format(
                      ','.join(keys),
                      ','.join(['%s']*len(values))
                  )
                  self.cursor.execute(insert_sql,values)
                  self.connection.commit()
                  spider.logger.info('插入数据')
              else:
                  spider.logger.info('数据重复')
          
    4. 在settings.py中开启管道

  4. 实现随机User-Agent下载器中间件

    1. 准备User-Agent列表

    2. 定义RandomUserAgent类

    3. 实现process_request方法,设置随机的User_Agent

      class RandomUserAgent(object):
      
          def process_request(self, request, spider):
              request.headers['User-Agent'] = random.choice(USER_AGENTS)
              return None
      
  5. 实现代理ip下载器中间件

    1. 定义ProxyMiddleware类

      class RandomUserAgent(object):
      
          def process_request(self, request, spider):
              request.headers['User-Agent'] = random.choice(USER_AGENTS)
              return None
      
    2. 实现proecss_request方法,设置代理ip

      class ProxyMiddleware(object):
      
          def process_request(self, request, spider):
              # 设置代理ip
              # 1. 获取请求的协议头
              protocol = request.url.split('://')[0]
              # 2. 构建代理ip请求的url,从代理池获取随机的代理ip
              proxy_url = 'http://localhost:16888/random?protocol={}'.format(protocol)
              # 3. 发送请求,获取代理ip
              response = requests.get(proxy_url)
              # 4. 把代理ip设置给request.meta['proxy']
              request.meta['proxy'] = response.content.decode()
              return None
      
    • pycharm的全局搜索---双击shift

      # settings文件中设置下载器中间件
      DOWNLOADER_MIDDLEWARES = {
         'dishonest.middlewares.RandomUserAgent': 543,
         'dishonest.middlewares.ProxyMiddleware': 500,
      }
      注意:
      # from scrapy.downloadermiddlewares.httpproxy import HttpProxyMiddleware
      ProxyMiddleware的数据需要注意,要小于750.  
      # 750的来历:
      全局搜索HTTPPROXY_ENABLED,其所在文件中有
      'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 750,
      
  6. 设置重试次数

    # 设置重试次数
    RETRY_TIMES = 5  # 加上初始化那一次,共6次
    
  7. settings文件中设置日志级别

    # 配置日志等级
    LOG_LEVEL = 'INFO'
    
原文地址:https://www.cnblogs.com/hui-code/p/12030353.html