您的位置:首页 > 理论基础 > 计算机网络

网络爬虫之简单链接抓取

2014-10-19 21:45 169 查看
继续用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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: