网络爬虫之简单链接抓取

继续用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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章