• 2017.07.25 Python网络爬虫之其他模块


    1.re模块(正则表达式操作)

      re模块是文件处理中必不可少的模块,它主要用于字符串的查找,定位等等,在使用网络爬虫时,即使没有爬虫框架,re模块配合urllib2模块也可以完成简单的爬虫功能

    2.正则表达式:

    (1)字符:

    ** .:匹配任意除换行符 之外的字符,abc匹配abc

    **:转义字符,使后一个字符改变原来的意思,a.bc匹配a.bc

    **[...]:字符集(字符类),对应字符集中的任意字符,第一个字符是^则取反,a[bc]d匹配abd或acd

    (2)预定义字符集:

    **d:数字[0-9]

    **D:非数字[^d]

    **s:空白字符[空格   fv]

    **S:非空白字符[^s]

    **w:单词字符[a-zA-Z0-9]

    **W:非单词字符[^w]

    (3)数量词:

    **  *:匹配前一个字符0或无限次,a1*b匹配  ab,a1b,a11b  ...........

    **  +:匹配前一个字符1或无限次,a1+b匹配  a1b,a11b,............

    **  ?:匹配前一个字符0或1次,a1?b匹配  ab,a1b

    ** {m}:匹配前一个字符m次,a1{3}b匹配  a111b

    ** {m,n}:匹配前一个字符m至n次,a1{2,3}b匹配  a11b,a111b

    (4)边界匹配:

    **  ^:匹配字符串开头,如^abc匹配以abc开头的字符串

    **  $:匹配字符串结尾,如xyz$匹配以xyz结尾的字符串

    **  A:仅匹配字符串开头,如Aabc

    **  :仅匹配字符串结尾,如Xyz

    3.常用的几个re模块方法:

    (1)re.compile(pattern,flags=0):将字符串形式的正则表达式编译为Pattern对象

    (2)re.search(string[,pos[,endpos]]):从string的任意位置开始匹配

    (3)re.match(string[,pos[,endpos]]):从string的开头开始匹配

    (4)re.findall(string[,pos[,endpos]]):从string任意位置开始匹配,返回一个列表

    (5)re.finditer(string[,pos[,endpos]]):从string的任意位置开始匹配,返回一个迭代器,一般匹配findall就可以了,大数量的匹配还是使用finditer比较好

    示范代码:

    3.编写一个简单的网络爬虫simpleCrawlerNowMovie.py,金逸影城为例:

     因为是动态网页,所以一下代码并不能抓取到想要的数据,只对静态网页起作用,但是现如今静态网页能有多少呢?哎,关于动态网页数据抓取请看后边的博文

    # !/usr/bin/env python
    # -*- coding:utf-8 -*-

    import re
    import urllib2

    class TodayMoive(object):
    """获取金逸影院当日影视"""
    def __init__(self):
    self.url='http://www.jycinema.com/html/default/schedule.html'
    self.timeout=5
    self.fileName='./todayMovie.txt'
    """内部变量定义完毕"""
    self.getMovieInfo()

    def getMovieInfo(self):
    response=urllib2.urlopen(self.url,timeout=self.timeout)
    # movieList=re.findall('film-title.*',response.read())
    with open(self.fileName,'w') as fp:
    # for movie in movieList:
    # movie=self.subStr(movie)
    # print(movie.decode('utf-8'))
    fp.write(response.read())

    def subStr(self,st):
    st=st.replace('film-title">','')
    st=st.replace('</h3>','')
    return st

    if __name__ == '__main__':
    tm=TodayMoive()

    4.sys模块(系统参数获取):常用的方法只有两个:sys.argv(返回一个列表,包含了所有命令行参数)和sys.exit(退出程序)

    编写testSys.py代码测试:

    # !/usr/bin/env python
    # -*- coding:utf-8 -*-

    import sys

    class ShowSysModule(object):
    """这个类用于展示python标准库中的sys模块"""
    def __init__(self):
    print(u"sys模块常用的功能就是获取程序的参数")
    self.getArg()
    print(u"其次就是获取当前的系统平台")
    self.getOs()

    def getArg(self):
    print(u"开始获取参数的个数")
    print(u"当前参数有%d个" %len(sys.argv))
    print(u"这些参数分别是%s" %sys.argv)

    def getOs(self):
    print(u"sys.platform返回值对应的平台")
    print('System Platform')
    print('Linux linux2')
    print('Windows Win32')
    print('Cygwin cygwin')
    print('Mac OS X darwin')
    print('OS/2 os2')
    print('OS/2 EMX os2emx')
    print('RiscOS riscos')
    print('AtheOS atheos')
    print(' ')
    print(u'当前系统为%s' %sys.platform)

    if __name__ == '__main__':
    ssm=ShowSysModule()

    执行结果如下:

    5.time模块(获取时间信息):这个模块用最多的地方就是计时器,常用的方法有:

    time.time():返回当前的时间戳

    time.localtime([secs]):默认将当前时间戳转换为当前时区的struct_time

    time.sleep(secs):计时器

    Time.strftime(format[,t]):把一个struct_time转换为格式化的时间字符串,这个函数支持的格式符号如下:

    %a:本地(local)简化星期名称

    %A:本地完整星期名称

    %b:本地简化月份名称

    %B:本地完整月份名称

    %c:本地相应的日期和时间表示

    %d:一个月的第几天(01-31)

    %H:一天中的第几个小时(00-23)

    %I:第几个小时(01-12)

    %j:一年中的第几天(001-366)

    %m:月份(01-12)

    %M:分钟数(00-59)

    %p:本地am或者pm的响应符

    %S:秒(01-61)

    %U:一年中的星期数

    %w:一个星期中的第几天(0-6)

    %W:和%U基本相同,不同的是%W以星期一为一个星期的开始

    %x:本地相应日期

    %X:本地相应时间

    %y:简化的年份(00-99)

    %Y:完整的年份

    %Z:时区的名字(如果不存在为空字符)

    %%:‘%’字符

    简单的测试一个这几个方法:

    6.编写一个简单的程序testTime.py,实验time模块:

    # !/usr/bin/env python
    # -*- coding:utf-8 -*-

    import time
    from myLog import MyLog
    """这里的myLog是自建的模块,处于该文件的同一目录下"""

    class TestTime(object):
    def __init__(self):
    self.log=MyLog()
    self.testTime()
    self.testLocaltime()
    self.testSleep()
    self.testStrftime()

    def testTime(self):
    self.log.info(u"开始测试time.time()函数")
    print(u'当前时间戳为:time。time()=%f' %time.time())
    print(u'这里返回的是一个浮点型的数值,它是从1970纪元后经过的浮点秒数')
    print(' ')

    def testLocaltime(self):
    self.log.info(u'开始测试time.localtime()函数')
    print(u'当前本地时间为:time.localtime()=%s' %time.localtime())
    print(u'这里返回的是一个struct_time结构的元组')
    print(' ')

    def testSleep(self):
    self.log.info(u'开始测试time.sleep()函数')
    print(u'这是个计时器:time.sleep(5)')
    print(u'闭上眼睛数上5秒就可以了')
    time.sleep(5)
    print(' ')
    def testStrftime(self):
    self.log.info(u'开始测试time.strftime()函数')
    print(u'这个函数返回的是一个格式化的时间')
    print(u'time.strftime("%%Y-%%m-%%d %%X",time.localtime())=%s' %time.strftime("%Y-%m-%d %X",time.localtime()))

    print(' ')

    if __name__ == '__main__':
    tt=TestTime()


    必须在终端执行,结果如下:

    
    
  • 相关阅读:
    【移动自动化】【三】控件定位
    【移动自动化】【二】Appium
    【自动化测试:笔记一】adb命令
    mysql api
    计算经纬度的正方形边界
    转 高效的多维空间点索引算法 — Geohash 和 Google S2
    转 为什么geometry+GIST 比 geohash+BTREE更适合空间搜索
    转 HBase GC日志
    转 HBase最佳实践-CMS GC调优
    转:HBase最佳实践-内存规划
  • 原文地址:https://www.cnblogs.com/hqutcy/p/7232481.html
Copyright © 2020-2023  润新知