xml地图|网站地图|网站标签 [设为首页] [加入收藏]
phantomJS的动态网站全站爬取,高阶函数
分类:编程

 

一、注释

详细内容请参考廖雪峰官网,此处只是一些摘抄,心得与练习的coding。

由于需要在公司的内网进行神经网络建模试验(),为了更方便的在内网环境下快速的查阅资料,构建深度学习模型,我决定使用爬虫来对深度学习框架keras的使用手册进行爬取。

用 # 在句首标注的文本

  1. Python内建的filter()函数用于过滤序列。

    map()类似(可参考 Python 高阶函数 -- map/reduce),filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。

    例如,在一个list中,删掉偶数,只保留奇数,可以这么写:

    def is_odd(n):
        return n % 2 == 1
    
    list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
    # 结果: [1, 5, 9, 15]
    

     

  2. 用filter求素数

    计算素数的一个方法是埃氏筛法,它的算法理解起来非常简单:

    首先,列出从2开始的所有自然数,构造一个序列:

    2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...

    取序列的第一个数2,它一定是素数,然后用2把序列的2的倍数筛掉:

    3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...

    取新序列的第一个数3,它一定是素数,然后用3把序列的3的倍数筛掉:

    5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...

    取新序列的第一个数5,然后用5把序列的5的倍数筛掉:

    7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...

    不断筛下去,就可以得到所有的素数。

    用Python来实现这个算法,可以先构造一个从3开始的奇数序列:

    def _odd_iter():
        n = 1
        while True:
            n = n + 2
            yield n
    

    注意这是一个生成器,并且是一个无限序列。(关于生成器,请参考廖雪峰的另一篇文章)

    然后定义一个筛选函数:

    def _not_divisible(n):
        return lambda x: x % n > 0
    

    最后,定义一个生成器,不断返回下一个素数:

    def primes():
        yield 2
        it = _odd_iter() # 初始序列
        while True:
            n = next(it) # 返回序列的第一个数
            yield n
            it = filter(_not_divisible(n), it) # 构造新序列
    

    这个生成器先返回第一个素数2,然后,利用filter()不断产生筛选后的新的序列。

    由于primes()也是一个无限序列,所以调用时需要设置一个退出循环的条件:

    # 打印1000以内的素数:
    for n in primes():
        if n < 1000:
            print(n)
        else:
            break
    

    注意到Iterator是惰性计算的序列,所以我们可以用Python表示“全体自然数”,“全体素数”这样的序列,而代码非常简洁。

  3. 练习
    回数是指从左向右读和从右向左读都是一样的数,例如12321909。请利用filter()筛选出回数:

    # -*- coding: utf-8 -*-
    def is_palindrome(n):
        s = str(n)
        count = 0
        length = len(s)
        half = int(length/2) #eg. 1234321 ->half num:3
        flag = True
        while count< half:
            if s[count] == s[length-count-1] :
                count +=1
                continue
            else:
                flag=False
                break
        return flag
    

keras中文文档的地址是 ,是基于英文原版使用手册,由国内众多学者进行翻译所得,方便大家在学习和工作中快速的进行查阅。

二、数字

    # 测试:
    output = filter(is_palindrome, range(1, 1000))
    print('1~1000:', list(output))
    if list(filter(is_palindrome, range(1, 200))) == [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33,
                                                      44, 55, 66, 77, 88, 99, 101, 111, 121,
                                                      131, 141, 151, 161, 171, 181, 191]:
        print('测试成功!')
    else:
        print('测试失败!')

 

 

  • 整数,不区分long和int
  •         (1)进制:0b,0o,0x 分别代表二进制,八进制,十六进制
  •         (2)Bool(布尔值): True(真) False(假)
  • 浮点数(floating-point):如3.14,-0.45,1.23e6
  • 复数(complex):如1+2j,其中1为实部,2j为虚部

在编写爬虫之前,我们需要对网站的源码进行分析,以确定抓取策略。

三、字符串

首先,网页分为左右两个部分,并且网站的大部分有效地址基本上都是集中在页面左侧的索引中,以<li class="toctree-l1 "></li>标签进行包围。

  • 由单(' ')、双引号(" ")引起来的字符序列
  • 单/双三引号(''' '''或""" """),可以跨行,在其中也可以自由使用单、双引号

图片 1

四、转义序列

根据网站的这个特征,我们可以不使用传统的 URL管理器+网页下载器+解析器 的传统递归爬取模式,化繁为简,一次性的获取索引中所有的待爬取url。

  • 一些字母前加""以表示不能显示的ASCII字符
  • 如 t r n
  • 前缀r/R ,取消转义,即把字符串里的转义字符当作普通字符

其次,该页面的url不同于我们平时所浏览的.html或.jsp文件,通过浏览器的查看元素操作,可以知道该url所对应的是一个事件。应该是类似于一个action指令,服务器根据这个传入参数,来动态的返回页面。

五、缩进

图片 2

  • C语言通过花括号{}体现代码的逻辑结构,Python则通过缩进体现
  • Python默认4个空格为一个缩进

为了正确的获取动态页面的内容,我们设计使用基于selenium+phantomJS的python语言爬虫来完成全站爬取任务。

六、续行

selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等[1]。

  • 在行尾使用
  • 如果使用各种括号,那么括号内为整体,内部跨行不用

phantomJS是一个基于 WebKit(WebKit是一个开源的浏览器引擎,Chrome,Safari就是用的这个浏览器引擎) 的服务器端 JavaScript API,python可以使用selenium执行javascript,selenium可以让浏览器自动加载页面,获取需要的数据。

七、标识符

关于selenium与phantomJS的用法在网上有很多讲解,本文不再赘述,仅针对该全站爬取任务进行阐述。

  • 标识符是程序员自己规定的具有特定含义的词,比如类名称,属性名称,变量名等
  • Python中,标识符由字母、数字、下划线组成,不能是数字开头
  • 不能是Python关键字
  • Python标识符区分大小写
  • 谨慎使用_开头作为标识符,以下划线开头的标识符是有特殊意义的

动态页面与静态页面的分析

八、常量&变量

不同于单个网页的下载,全站爬取的难点在于如何在爬取之后保存网页之间的正确调用关系(即点击超链接能够正确的进行页面跳转)。在目标网站 keras中文文档中,服务器通过传递进来的action,使用servlet进行应答,返回对应的页面(笔者web开发的功底不牢固,只能描述大概流程,服务器运行具体细节难以描述清楚  =。=#  )。而将这些动态页面的信息以静态方式进行存储后,只有把它们放在正确的相对路径下,才能够在流量器中正常使用,因此在下载页面的时候,需要完成以下两个工作: 

  • 常量:一旦赋值就不能再改变值的标识符
    • Python中无法定义常量,约定全大写的标识符代表一个常量
    • 字面常量:一个单独的量,如12,‘abc',’1.23e6‘
  • 变量:赋值后可改变值的标识符

工作1.获取页面所在的相对路径,并且给页面命名。通过对页面的源代码进行浏览,我们可以发现,每个页面的url就是它以/latest/为根目录的相对路径。

九、Python的语言类型

图片 3

Python是动态强类型语言。

图1 网站主页面上的序贯模型url (相对路径)

静态编译语言 动态编译语言
事先声明变量类型,类型不能再改变 不用事先声明变量类型,随时可赋值为其他类型
编译时判断类型 编译时不知是何类型,难以判断
如C#、java 如Python、Ruby、Perl

图片 4

 

图2 序贯模型页面的真实url (绝对路径)

强类型语言 弱类型语言

变量的使用要严格符合定义,都必须先定义后使用。

不同类型之间操作,必须先强制类型转换为同一类型。如java、.NET、C++。

数据类型可以被忽略,一个变量可以赋不同数据类型的值。

不同类型之间可操作,自动隐式转换。如VB、PHP。

根据这个特征,我们可以设计相对的函数,来获取所有待爬取页面的真实url。此外,为了能够对页面进行正确的保存,需要给文件进行命名,这里将所有页面名称定位info.html。例如,序贯模型的页面在本地就存储在  ./latest/getting_started/sequential_model/info.html 文件中。

十、运算符

工作2.将页面存储到本地时,将其中的超链接地址改为目标静态页面的相对路径。例如,对于主页 ,它的序贯模型索引的url如下:

  • 算术运算符:+ - * / % **  自然除:/  整除: //
  • 位运算符:& | ~ ^ << >>

图片 5

 

而对于我们所爬取下来的静态主页 ./latest/info.html 来说,它的序贯模型索引的url如下:

图片 6

我们需要精确的指向该页面在本地目录中所保存的地址。

本文由澳门新葡亰手机版发布于编程,转载请注明出处:phantomJS的动态网站全站爬取,高阶函数

上一篇:numpy的axis的理解和检验 下一篇:私有属性是不是不应该有,基础题目一
猜你喜欢
热门排行
精彩图文