Scrapy爬虫技巧分享

laical · 2020-07-08 17:38:19 · 1671 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2020-07-08 17:38:19 的主题,其中的信息可能已经有所发展或是发生改变。

Scrapy爬虫是用Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛。 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非常之方便。 Scrapy 使用了 Twisted'twɪstɪd异步网络框架来处理网络通讯,可以加快我们的下载速度,不用自己去实现异步框架,并且包含了各种中间件接口,可以灵活的完成各种需求。 Scrapy是一个高级的Python爬虫框架,它不仅包含了爬虫的特性,还可以方便的将爬虫数据保存到csv、json等文件中。它能我们更好的完成爬虫任务,自己写Python爬虫程序好比孤军奋战,而使用了Scrapy就好比手底下有了千军万马 • Scrapy Engine(Scrapy核心) 负责数据流在各个组件之间的流。 • Spiders(爬虫)发出Requests请求,经由Scrapy Engine(Scrapy核心) 交给Scheduler(调度器),Downloader(下载器)Scheduler(调度器) 获得Requests请求,然后根据Requests请求,从网络下载数据。 • Downloader(下载器)的Responses响应再传递给Spiders进行分析。根据需求提取出Items,交给Item Pipeline进行下载。Spiders和Item Pipeline是需要用户根据响应的需求进行编写的。 • 除此之外,还有两个中间件,Downloaders Mddlewares和Spider Middlewares,这两个中间件为用户提供方面,通过插入自定义代码扩展Scrapy的功能,例如去重等。 在正式开始爬虫编写之前,有几种小技巧,可以方便我们操纵和调试爬虫。 一、建立main.py文件,直接在Pycharm下进行调试 很多时候我们在使用Scrapy爬虫框架的时候,如果想运行Scrapy爬虫项目的话,一般都会想着去命令行中直接执行命令“scrapy crawl crawler_name”,其中crawler_name指的是爬虫的名字,在一开始创建Scrapy爬虫模板的时候就指定了的,而且在该爬虫项目中具有唯一性。但是每次跑到命令行下去执行,看交互的结果,有时候并不是很清晰,所以这里介绍一种方法,可以帮助大家提高开发效率,尤其是调试的时候更是显得方便。 在与爬虫项目的scrapy.cfg文件同级目录下建立一个main.py文件,用于控制整个爬虫项目的执行。 在该文件夹中写入的代码见下图。其中execute函数是内嵌在scrapy中的,调用这个函数可以直接调用该Scrapy工程项目的爬虫脚本,这个函数的执行需要在爬虫项目的父目录下进行。而第7行代码的意思就是获取当前py文件的父目录,省去我们直接复制路径的精力和时间,同时也方便我们将该项目放到其他的平台上去运行,不会报路径的错误。execute函数里边的参数其实就是将Scrapy爬虫执行命令拆分,然后分别以一个字符的方式放到了一个数组中。 之后我们直接运行这个main.py文件便可以调用Scrapy爬虫程序了。 二、设置网站robots.txt规则为False 一般的,我们在运用Scrapy框架抓取数据之前,需要提前到settings.py文件中,将“ROBOTSTXT_OBEY = True”改为ROBOTSTXT_OBEY = False。 在未改动之后settings.py文件中默认爬虫是遵守网站的robots.txt规则的,如下图所示。 如果遵守robots.txt规则的话,那么爬取的结果会自动过滤掉很多我们想要的目标信息,因此有必要将该参数设置为False,如下图所示。 设置好robots.txt规则之后,我们便可以抓到更多网页的信息。 关于Scrapy爬虫项目运行和调试的部分小技巧有很多,希望小伙伴们可以多多利用起来,让其为自己的项目服务,可以事半功倍。同时Scrapy爬虫需要配合亿牛云高质量的爬虫代理IP 才能更加长期稳定采集相关数据。

  performance && performance.mark && performance.mark("start-js-render");


  var MaxErrorReportLimit = 100;
  // 简单的将错误采集上报到 /api/logs/error
  window.onerror = function(message, source, lineno, colno, error) {
    // 同一个页面最多上报100次错误,防止某个循环错误页面一直打开,不断的报错
    if (MaxErrorReportLimit-- < 0) return;
    try {
      var msg = {
        message: message,
        source: source,
        lineno: lineno,
        colno: colno,
        stack: error && error.stack,
        traceId: window.appData && window.appData.traceId,
        href: window.location.href,
      };
      msg = JSON.stringify(msg);
      // 用于 macaca E2E 自动化测试
      window.__macaca_latest_error = msg;
      var req = new XMLHttpRequest();
      req.open('post', '/api/logs/error', true);
      req.setRequestHeader('Content-Type', 'application/json');
      req.send(msg);
      // yuyanMonitor 记录错误堆栈
      if (window.yuyanMonitor) {
        yuyanMonitor.logError(error, {
          code: 1,
          msg: message,
        });
      }
    } catch (err) {
      console.log('report error', err);
    }
  };
  // 监听 window.onload 是否执行,用于组件中执行 onload 后续事件
  window.addEventListener('load', function() {
    try {
      // 移动端开启
      var isMobile = navigator.userAgent.toLowerCase().match(/iphone|ipad|android|micromessenger/i);
      if (isMobile) {
        var rootNode = document.querySelector('#ReactApp');
        if (rootNode && !rootNode.innerHTML) {
          // ready 3s 后节点内容为空,展示友好报错
          setTimeout(function() {
            // 插入节点前再次检查是否白屏
            if (!rootNode.innerHTML) {
              var html = '<div>';
              html += '<h3 style="margin-top: 45%;text-align: center;">页面打不开?快来找开发 GG 帮忙</h3>';
              if (window.appData && window.appData.traceId) {
                html += '<p style="padding: 10px 30px;">反馈信息: ' + window.appData.traceId + '</p>';
              }
              html += '<p style="padding: 10px 30px;">截图或复制反馈信息到: <a target="_blank" href="https://www.yuque.com/yuque/topics/new">https://www.yuque.com/yuque/topics</a></p>'
              html += '</div>';
              rootNode.innerHTML = html;
            }
          }, 3000);
        }
      }
    } catch (e) {
      console.log(e);
    }
  }, false);
  if ('serviceWorker' in navigator) {
    if (!/[?&]enable_sw=false/.test(location.search) && window.appData && window.appData.settings.enable_serviceworker) {
      window.addEventListener('load', function() {
        navigator.serviceWorker.register('/serviceworker.js');
      });
    } else {
      navigator.serviceWorker.getRegistrations().then(function(registrations) {
        registrations.forEach(sw => sw.unregister());
      });
    }
  }






  window.routerBase = '/';
  window.resourceBaseUrl = 'https://gw.alipayobjects.com/os/chair-script/skylark/';


  window.__webpack_public_path__ = '/os/chair-script/skylark/';

1 / 5

  !function(t,e,a,r,c){t.TracertCmdCache=t.TracertCmdCache||[],t[c]=window[c]||
    {_isRenderInit:!0,call:function(){t.TracertCmdCache.push(arguments)},
    start:function(t){this.call('start',t)}},t[c].l=new Date;
    var n=e.createElement(a),s=e.getElementsByTagName(a)[0];
    n.async=!0,n.src=r,s.parentNode.insertBefore(n,s)}
  (window,document,'script','https://ur.alipay.com/tracert_a385.js','Tracert');


  Tracert.start({
    spmAPos: 'a385',
    spmBPos: 'b4693',

    role_id: '1313142',
    mdata: {


      group_id: appData.group.id,


      book_id: appData.book.id,


      doc_id: appData.doc.id,


    },
  });

站长统计





  window.yuyanMonitor = new YuyanMonitor({
    _appId: '589c123e2b89c03d127000da',

    env: '外网',


    userId: 'laical',
  });

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1671 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传