[可视化抓取]portia2.0尝鲜体验以及自动化畅想[1]

缘起

最近一直在思考如何更改智能化抓取的事情,每当来了一个新的task,都要自己手动分析,手动写xpath ,然后写正则,各种测试,各种部署,其实说来,这些事情的重复度很高,那我们能不能把一些重复性的动作抽象出来,做成一个独立的单元呢?在参考佷多类似的自动化的工具之后,猜想了如下的动作是可以抽象出来的

  • 开始页的格式化
    比如http://www.cnblogs.com/#1 http://www.cnblogs.com/#2 这种页面都是规则的,直接生成这些待跑的页面,然后放入,然后有一个上下页面的逻辑联系

  • xpath提取的鼠标化和输入化
    这一点显的相当重要,可以说如果能解决这个问题,就可以提高很高的生产效率,我们大部分的时间都花在写xpath,调试这个上面了,所以能通过点点点解决写代码的时间,就会很方便(这样可能会有一个问题,浏览器拿出来的xpath和你正常的xpath不一样,所以还得区分渲染前后渲染后的)

  • 数据清洗的常规化
    比如提取数字,字母,或者特定的内容,如果把这些内容也方便能过鼠标点击出来,也会给清洗方便很多(可以考虑这些都做成插件)

  • 是否启用JS
    渲染问题

  • 数据pipeline的流向
    输入到各种数据库里面,不过,这个数据考虑输入到中间件里面。由中间件负责输送到不同类似的目的地里面

安装

关于安装,我个人推荐使用docker ,不建议使用官方的最新镜像,有一些问题一直没有解决,我在尝试了另外一个版本之后直接使用如下命令

特定的版本下我试过是没有问题的,推荐大家就用这个版本,这样这个服务就已经开启了

使用

新建project

打开本地浏览器http://127.0.0.1:9001/,打开之后就可以看到主界面了
portia_1
首先创建一个项目,这点应该和scrapy start project一样,然后进入到里面,输入你想爬的网址

新建spider

假设输入的是一个相册https://www.douban.com/photos/album/79005353/,然后进入可编辑的界面,点击New Spider
blog2

进入面板

blog3

  • Project
  • Spider
  • Start_pages
  • Link Crawling
  • Sample Pages

以上的几个属性在我们熟悉了scrapy之后就了解是什么东西了,除了最后一个,sample pages,我们看一下的解释

简而言之就是一个数据模板,当爬虫爬取这些页面的时候就可以按照你的模板来提取你要的数据,所以先要制作这样的模板,才能进行数据的进一步操作

操作模板

blog4
这个时候进入到数据侦测状态,新建一个item,现在开始黑魔法阶段

选择工具

选中+ 这个工具,点击你想要的元素,比如我选择了图片,评论,回应三个字段
blog5

另外,字段类型已经提供好了相应的数据清洗,比如我只要text ,或者只要number,选中之后右的数据栏就会相应的变化(不得不说,简化了相当多的操作啊)
blog6

黑魔法-同类选择

这些元素选择完成之后,现在进入黑魔法阶段,点击-右边的列表选项
blog7

我们根据当前的字段颜色再次选中列表中的其它元素

blog8

是不是相当的神奇,这样就可以将同节点下的相同元素都筛选出来,右边的结果也可以以json显示

blog9

总结

本次主要从

  • 安装
  • 使用
  • 想法

这几个角度来分析了问题,下期我将从实用,功能,拓展的角度来分析如何用到生产线上,如果我的文章对大家有帮助的话,请不要吝惜您的赞或者打赏,谢谢 :)

点赞
  • Rick

    请问下一期什么时候出?也在考虑自动化爬虫,对Portia的拓展改写没什么思路。期待大神的下一期内容。

    • bruce

      自动化还在构建中,敬请期待,最近略忙。

  • 酷酷的腾

    求下一期的portia扩展,我搭建好了后点击 [SPIDER] 旁边的运行按钮,运行不起来,还有IP代理 等功能不知道弄,求大神早日更新

  • 酷酷的腾

    为什么我安装你一模一样的操作,显示的结果返回的页面状态是403

    • bruce

      不会吧,如果是docker 安全就排除了环境的问题,你看是不是某些网面没有办法渲染?

    • 杨光

      403 我也遇到了,你要在setting中加入UA

  • 我想飞

    你好,我有个微信公众号:学点编程吧,希望能够转载你的这篇文章,得到你的授权,谢谢!
    这篇文章写得很好!

    • bruce

      好的,保留出处和作者就可以了。

  • 杨光

    你好,在Portia的说明中写到:docker run -v ~/portia_projects:/app/data/projects:rw -p 9001:9001 scrapinghub/portia

    但我在docker中运行时是不成功的。我不理解的是~/portia_projects:/app/data/projects:rw 代表什么。portia_projects是否要自己创建。本地是否要clone Portia的项目。(docker中的images是scrapinghub/portia latest)
    还有的文章中是这样写的:docker run -i -t --rm -v PROJECTS_FOLDER:/app/data/projects:rw -p 9001:9001 scrapinghub/portia
    但是我同样不能运行。 :surprised:

    原谅我只是个小白

    • bruce

      -v 是将本地的目录挂载进入docker目录 ,如果你只是玩玩,也可以不挂载,rw 是的意思是read and write ,可以读写目录权限。首先你要拿到docker 的镜像才能成功,因为docker镜像被墙的关系,你可以考虑国内镜像加速,然后在拉镜像就会很快。

      • 杨光

        你好,打扰了。还有两个问题
        一:/Users/brucedone/Data/portia:/app/slyd/data 这句话是什么意思呢,Users/brucedone/Data/portia应该是本地挂载的目录,但/app/slyd/data 难道是Docker 容器中的目录么? 我并没有找到有这个文件夹只有在/app/slyd/下只有 README.md bin requirements.txt setup.py slybot slyd slyd.egg-info twisted 这几个文件

        二:我想在Django中返回Portia(或者Scrapy)爬到的数据,可是怎么返回呢。在Portia中保存为Portia或者Portia项目 然后在本地运行?

        我的工作是Android开发,Python是我业余爱好 刚刚学没多久

        • bruce

          1。以: 符号做为分割,前面的是本地的目录 ,后面的是容器里面的目录 ,所以这话的意思就是如上我回答的,将本地的文件夹和容器目录连接起来。关于portia各种文件夹的应用,你可以参考他的官方文档
          2。你需要修改portia的数据存储方式,改起来的很多坑,然后将数据存入数据库里面

          • 杨光

            非常感谢又一次收到了你的解答。
            经过你的帮助和我的执拗终于弄懂了一些。

            是否可以加个微信 或者QQ 或者进入你的技术群里。留言的方式效率太低了
            微信:qq932762456
            qq见上

          • Rick

            您好,我在slybot/setting 里边添加了MySQLpipeline ,自己写了MySQLpipeline.py放在setting同级目录,但是爬虫启动的时候并不会生效。date/project里边的setting添加了pipeline与数据库的地址等信息,也不起作用。是我遗漏了什么吗?希望能得到您的回复。

  • Pingback: [可视化抓取]portia2.0尝鲜体验以及自动化畅想-数据输出以及原理分析 - 大鱼的鱼塘()