继续用word编辑以后截图~
# -*- coding: utf-8 -*-
import re #导入正则表达式re 模块
import urllib2
import string #导入string模块
def saveUrl(urlSeed):
#函数作用:
#利用参数中的url网址,得到url对于的网页,然后抓取网页内容,获取网页之中的所有超链接及其对应的链接名字,保存在文本文件中。
website=urllib2.Request(urlSeed); #向网站请求访问
if (not website): #如果访问失败,那么说明网页有问题,跳出程序(下面的return),不执行下面的代码
return;
webpage=urllib2.urlopen(website).read(); #打开网站(urlopen)并读取数据(read)这里把urlopen()和read()两个方法合在一起使用了。
pattern=re.compile(r"<a href=\".*?\".*?>.*?<\/a>"); #构建正则表达式
result=pattern.findall(webpage); #正则表达式匹配网页
for subweb in result: #result是一个列表[就像matlab中的矩阵]
#print subweb; #打印网页,此处把它注释掉了
pattern2=re.compile(r"http.*?\""); #构造正则表达式2,获取网址
pattern3=re.compile(r">.*?<"); #正则表达式3,获取网址名字
weburl=pattern2.findall(subweb); #正则表达式2匹配
webname=pattern3.findall(subweb); #正则表达式3匹配
if len(weburl)>0 and len(webname)>0: #如果匹配的结果非空,即有结果,这里需要网址和名字都有结果,否则认为数据不符合
for name in webname: #因为名字里面有可能有多个结果,其中包括正确的”>名字<“,不正确的“><”,
if len(name)>2: #因为错误的“><”长度为2,正确的“>网页名字<”长度必须大于2,所以以此为特征过滤错误的
forCheck=name[name.index('>')+1:name.index('<')];#利用切片方式去除名字头尾的‘>’和‘<’;可以用print name; 看是什么样子的。
pattern=re.compile('[%s]' % string.punctuation) #构造正则表达式检测名字里面是否包含标点符号,
if not pattern.findall(forCheck): #如果不存在,认为是合格数据
print forCheck+':'+weburl[0][0:len(weburl[0])-1];#打印合格的数据,格式为: 网站名字+:号+地址;
fpWrite=open("./web.txt",'a'); #以追加的方式打开文本文件,如果不存在,则创建
dataWrite= forCheck+':'+weburl[0][0:len(weburl[0])-1]+'\r\n';#构建即将写入的数据格式(跟打印的格式一样)
fpWrite.write(dataWrite); #把数据写入文件
fpWrite.close(); #关闭文件
def run(urlSeed):
#函数作用,根据给定的urlSeed,获取第一批超链接,写入文本文件;
#然后,以第一批网址为基础,依次抽取每一行的地址作为新的url,获取另一批新的url,以此反复循环,直到用户按下终止键(ctrl+z),停止程序。
saveUrl(urlSeed);#调用上面的函数;获取第一批的网址
fpRead=open("./web.txt",'r');#打开第一批的文本文件,
while(1): #死循环
try:
dataRead=fpRead.readline();#从打开的文件中读取一行
pattern=re.compile(r"http.*");#构造正则表达式
newUrl=pattern.findall(dataRead);#利用正则表达式从读入的行中获取网址
saveUrl(newUrl[0]);#将新的网址作为参数,获取新的一批网址
except KeyboardInterrupt: #如果检测到键盘中断异常,说明用户按下了Ctrl+Z
fpRead.close(); #关闭读写文件
print "\n爬虫执行完成!\n" #打印退出结果
return; #退出程序
except Exception,e: #如果是其他异常,不理它们
continue; #跳过异常,继续运行
fpRead.close(); #关闭文件
#下面是程序的入口,程序调用run函数开始运行,传入种子url(这里以淘宝为例)。
run("http://www.taobao.com");
pdf版内容及对应代码位置:http://download.csdn.net/detail/duishengchen/8057129