2017.07.25 Python网络爬虫之其他模块

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

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

2.正则表达式:

(1)字符:

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

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

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

 

(2)预定义字符集:

**\d:数字[0-9]

**\D:非数字[^\d]

**\s:空白字符[空格   \t\r\n\f\v]

**\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

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

 

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\t\t\tPlatform')
print('Linux\t\t\tlinux2')
print('Windows\t\tWin32')
print('Cygwin\t\tcygwin')
print('Mac OS X\t\tdarwin')
print('OS/2\t\t\tos2')
print('OS/2 EMX\t\tos2emx')
print('RiscOS\t\t\triscos')
print('AtheOS\t\t\tatheos')
print('\n')
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('\n')

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

def testSleep(self):
self.log.info(u'开始测试time.sleep()函数')
print(u'这是个计时器:time.sleep(5)')
print(u'闭上眼睛数上5秒就可以了')
time.sleep(5)
print('\n')
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('\n')

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


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

 


posted @ 2017-07-28 09:32  小春熙子  阅读(602)  评论(0编辑  收藏  举报