zoukankan      html  css  js  c++  java
  • 数据抓取的艺术(一)

    原文地址:http://blog.chinaunix.net/uid-22414998-id-3692113.html?page=3

    数据抓取是一门艺术,和其他软件不同,世界上不存在完美的、一致的、通用的抓取工具。为了不同的目的,需要定制不同的代码。不过,我们不必Start from Scratch,已经有许多的基本工具、基本方法和基础框架可供使用。不同的工具、不同的方法、不同的框架的特点也不同。了解这些工具、方法和框架是首要任务,接下来就需要明白它们的差异都在哪里、什么情境该用什么东东,最后才是析出规则、编写代码、运行程序来抓取数据。所以说,其实数据抓取的学习路线,不但很长而且很杂。

        为了一个特定的目的,我需要爬取Google的搜索数,和其他情况不同:人家是特定关键词,一页一页地爬结果;我的是N多关键词,一次一个地搜索,只需要返回的搜索条数。事实上,一共有153个关键词,但每个关键词都需要和所有关键词握手组配成一对待检词组。于是,大家可以试想一下,一个153行、153列的大表格,每一个空白都等着填,这就将是153*153=23409次,也就是约23409/2=11704次,经测试每爬取一个共词页面的结果并存入Excel,需要花费4秒的时间。这意味着,以单人单线程的方式需要11704*4/3600=13个小时,才能跑完。

        这些内容我还会在后续博文中详述,现在先介绍上述目的情境下我使用的技术框架及其安装配置过程。

    一、技术架构
        [Python2.7 + Pip + Selenium + Phantomjs]
        Selenium+Phantomjs,最初这对兄弟不是一家的,后来发现二者志趣相投、互有好感,于是结拜为兄弟,住进了Selenium家里。(这种说法有待商榷)
        看看介绍:
        Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE、Mozilla Firefox、Chrome等。
        Phantom JS是一个服务器端的 JavaScript API 的 WebKit。其支持各种Web标准: DOM 处理, CSS 选择器, JSON, Canvas, 和 SVG。

    二、环境搭建
       (1)安装Python从略,我用的版本是2.7.4(WinXP和Win7的32位平台)。
       (2)由于发现Pip比easy_install优秀,我便使用我已经安装的easy_install来安装pip。

    1. easy_install pip

        如图所示:


       (3)安装Phantomjs。
       到Phantomjs的官方网站http://phantomjs.org/download.html,下载“Download phantomjs-1.9.0-windows.zip (7.1 MB) ”。随后打开这个压缩包,将phantomjs.exe这一个文件解压到系统路径所能找到的地方,由于之前我已经将“C:Python27Scripts”目录添加入PATH之中,所以我就直接解压到这个目录。如图所示:


         至此,就已经在Win的环境下配置好了环境。

       三、测试
        随意新建一个文件,并加入如下代码:

    1. from selenium import webdriver
    2. driver = webdriver.PhantomJS()
    3. driver.get('www.baidu.com')
    4. data = driver.find_element_by_id('cp').text
    5. print data

        Check Out,看看是不是这个结果:


        其实,我一直不喜欢弹出来的DOS黑框,觉得这东东太影响视觉而且可能更耗时,但是在我看了官方DOC后:

       我发现,是不能直接藏匿DOS弹框的。So,只好这般啦。
       
        OK,it's time to "Enjoy yourself"......

  • 相关阅读:
    C++——string转char[]
    Ackerman的非递归算法(未解决)
    单链表——递归求最大整数、节点个数、平均值
    队列——以数组Q[m]存放循环队列元素,设置一个标志tag,以tag=0和tag=1来区别在头指针和尾指针相等时,队列为空或满
    队列——假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意:不设头指针), * 试编写相应的置空队列、判断队列是否为空、入队和出队等算法。
    栈——判断回文
    栈——表达式求值
    栈——匹配()[]
    栈——十进制转八进制
    动态获取导航栏
  • 原文地址:https://www.cnblogs.com/liinux/p/5494182.html
Copyright © 2011-2022 走看看