zoukankan      html  css  js  c++  java
  • 爬取失信人名单

    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'
      
  • 相关阅读:
    ArcGIS Server 服务迁移、恢复
    发布(高程数据)服务,Service Editor界面无LERC格式选项
    汇总10.4版本ArcGIS Server与ArcMap 安装+SDE+注册数据源(非破解)
    ArcGIS Server 缓存服务增加新比例尺缓存
    ArcMap 标注、注记、图形文本
    ArcGIS Server 缓存服务切图范围
    Oracle 安装 INS-30131错误。
    JAVA经典算法40题(供面试所用)
    Java 之HashMap.values()方法误用
    Java中如何把两个数组合并为一个
  • 原文地址:https://www.cnblogs.com/hui-code/p/12030353.html
Copyright © 2011-2022 走看看