Beispiel #1
0
 def __init__(self,
              Name,
              queue,
              list,
              result,
              Flcok,
              inittime=0.00001,
              downloadway='./',
              configfile='D:\\bbs\\conf.txt',
              maxnum=10000):
     threading.Thread.__init__(self, name=Name)
     self.queue = queue
     self.result = result
     self.Flcok = Flcok
     self.inittime = inittime
     self.mainway = downloadway
     self.configfile = configfile
     self.num = 0  #已下载的网页个数
     self.maxnum = maxnum
     self.way = downloadway + self.getName() + '\\'
     self.list = list
     self.urltest = Urltest()  #链接的相关操作对象
     #加入了主  home_url
     #
     self.home_list = [
         'http://www.cau.edu.cn',
         #'http://202.205.80.215',
         'http://org.wusetu.cn/hsz',
         #'http://202.205.91.91/hsz'
         #五色土开始
         #'http://wusetu.cn/logok.htm',
         'http://online.wusetu.cn',  #社区论坛 无需要登录
         #'http://home.wusetu.cn',  #个人空间,需要登录 价值不大
         #'http://flash.wusetu.cn', #福来乐娱乐游戏 不许要登录
         #'http://vod.cau.edu.cn', #机网中心 影视剧场
         #'http://music.cau.edu.cn',#音乐
         #'http://v.cau.edu.cn',#校内在线 电影 校内浏览器
         #未爬PT
     ]
     self.ip_list = {
         #'http://202.205.80.215':'http://www.cau.edu.cn',
         'http://202.205.91.91': 'http://org.wusetu.cn'
     }
     self.inqueue = queue  #处理完后的URL的去处  有效queue
Beispiel #2
0
    def find(self, num):
        #查找的时候,很小心的哦
        #查找时 默认查找带url而非ip  如果为ip开头  则自动将ip转为对应url
        #对不能解析的文件进行过滤:
        #如果末尾有.存在,且不为cn com org等  去除
        urltest = Urltest()
        if not urltest.test(num):
            return True

        l = len(self)
        first = 0
        end = l - 1
        mid = 0
        if l == 0:
            self.insert(0, num)
            #print 'input ',num
            return False
        while first < end:
            mid = (first + end) / 2
            if num > self[mid]:
                first = mid + 1
            elif num < self[mid]:
                end = mid - 1
            else:
                break
        if first == end:
            if self[first] > num:
                self.insert(first, num)
                #print 'input ',num
                return False
            elif self[first] < num:
                self.insert(first + 1, num)
                #print 'input ',num
                return False
            else:
                return True

        elif first > end:
            self.insert(first, num)
            #print 'input ',num
            return False
        else:
            return True
Beispiel #3
0
    def find(self, num):
        # 查找的时候,很小心的哦
        # 查找时 默认查找带url而非ip  如果为ip开头  则自动将ip转为对应url
        # 对不能解析的文件进行过滤:
        # 如果末尾有.存在,且不为cn com org等  去除
        urltest = Urltest()
        if not urltest.test(num):
            return True

        l = len(self)
        first = 0
        end = l - 1
        mid = 0
        if l == 0:
            self.insert(0, num)
            # print 'input ',num
            return False
        while first < end:
            mid = (first + end) / 2
            if num > self[mid]:
                first = mid + 1
            elif num < self[mid]:
                end = mid - 1
            else:
                break
        if first == end:
            if self[first] > num:
                self.insert(first, num)
                # print 'input ',num
                return False
            elif self[first] < num:
                self.insert(first + 1, num)
                # print 'input ',num
                return False
            else:
                return True

        elif first > end:
            self.insert(first, num)
            # print 'input ',num
            return False
        else:
            return True
Beispiel #4
0
    def trans_d(self,tem_url,rawurls):
        '将收获的url转化为 相对于局部主地址的绝对地址 并将其加入到inqueue中'
        urltest=Urltest() #对url的相关处理

        while True:
            if len(rawurls)>0:
                item=rawurls.pop()
                urlte=item
            else:
                break
            if (item == None)or(len(item)<3):   
                break  
            if item[0:4] == '\r\n':   
                item = item[4:]   
            if item[-1] == '/':   
                item = item[:-1]   
            #ipurl
            #change url to direct url
            #already direct url
            if len(item) >= len('http://') and item[0:7] == 'http://':
                for homepage in self.home_list: 
                    #change wheather it is a subpage
                    length=len(homepage)
                    if len(item) >= length and item[0:length] == homepage:   
                        if self.list.find(item) == False:   
                            self.inqueue.put(item)   
                        break
                continue #return to while
            if item[0:5] == '/java' or item[0:4] == 'java':   
                pass
            else:
            #相对地址开始 tem_url为局部home_url
                #相对地址 #更新: 对于../进行退格处理
                if item[0:3]=='../':
                    item=self.urltest.absUrl(tem_url,item)
                elif item[0] != '/':   
                    item = '/' + item   
                    item = tem_url+ item   #使用局部home_url代替了homeurl
                elif item[:2]=='./':
                    item=tem_url+item[2:]
                #item=urltest.absDirUrl(item) #绝对地址再次进行处理
                if self.list.find(item) == False:   
                    self.inqueue.put(item) 
            #记录链接情况
            self.Flcok.acquire()  
            confile = open('../store/urltest.txt', 'a')  
            confile.write( tem_url+' '+urlte+ ' ' + item+ '\n')  
            confile.close()  
            self.Flcok.release()  
Beispiel #5
0
 def __init__(
     self,
     Name,
     queue,
     list,
     result,
     Flcok,
     inittime=0.00001,
     downloadway="./",
     configfile="D:\\bbs\\conf.txt",
     maxnum=10000,
 ):
     threading.Thread.__init__(self, name=Name)
     self.queue = queue
     self.result = result
     self.Flcok = Flcok
     self.inittime = inittime
     self.mainway = downloadway
     self.configfile = configfile
     self.num = 0  # 已下载的网页个数
     self.maxnum = maxnum
     self.way = downloadway + self.getName() + "\\"
     self.list = list
     self.urltest = Urltest()  # 链接的相关操作对象
     # 加入了主  home_url
     #
     self.home_list = [
         "http://www.cau.edu.cn",
         #'http://202.205.80.215',
         "http://org.wusetu.cn/hsz",
         #'http://202.205.91.91/hsz'
         # 五色土开始
         #'http://wusetu.cn/logok.htm',
         "http://online.wusetu.cn",  # 社区论坛 无需要登录
         #'http://home.wusetu.cn',  #个人空间,需要登录 价值不大
         #'http://flash.wusetu.cn', #福来乐娱乐游戏 不许要登录
         #'http://vod.cau.edu.cn', #机网中心 影视剧场
         #'http://music.cau.edu.cn',#音乐
         #'http://v.cau.edu.cn',#校内在线 电影 校内浏览器
         # 未爬PT
     ]
     self.ip_list = {
         #'http://202.205.80.215':'http://www.cau.edu.cn',
         "http://202.205.91.91": "http://org.wusetu.cn"
     }
     self.inqueue = queue  # 处理完后的URL的去处  有效queue
Beispiel #6
0
class reptile(threading.Thread):
    #configfile: 是配置文件,存放网页的URL和下载下后的路径
    #maxnum:     每个爬虫有个最大下载量,当下载了这么多网页后,爬虫dead
    #需要解决一个问题:
    #校内许多的网站都是使用ip进行交互,需要解决url和ip的差异
    #工作方式:
    #   主程序给定一个队列,各个爬虫开始在此队列中进行查找,队列自动判断ip及域名的差异,采用ip和域名双判断

    #需要定义一个黑名单,对一些站点不要

    def __init__(self,
                 Name,
                 queue,
                 list,
                 result,
                 Flcok,
                 inittime=0.00001,
                 downloadway='./',
                 configfile='D:\\bbs\\conf.txt',
                 maxnum=10000):
        threading.Thread.__init__(self, name=Name)
        self.queue = queue
        self.result = result
        self.Flcok = Flcok
        self.inittime = inittime
        self.mainway = downloadway
        self.configfile = configfile
        self.num = 0  #已下载的网页个数
        self.maxnum = maxnum
        self.way = downloadway + self.getName() + '\\'
        self.list = list
        self.urltest = Urltest()  #链接的相关操作对象
        #加入了主  home_url
        #
        self.home_list = [
            'http://www.cau.edu.cn',
            #'http://202.205.80.215',
            'http://org.wusetu.cn/hsz',
            #'http://202.205.91.91/hsz'
            #五色土开始
            #'http://wusetu.cn/logok.htm',
            'http://online.wusetu.cn',  #社区论坛 无需要登录
            #'http://home.wusetu.cn',  #个人空间,需要登录 价值不大
            #'http://flash.wusetu.cn', #福来乐娱乐游戏 不许要登录
            #'http://vod.cau.edu.cn', #机网中心 影视剧场
            #'http://music.cau.edu.cn',#音乐
            #'http://v.cau.edu.cn',#校内在线 电影 校内浏览器
            #未爬PT
        ]
        self.ip_list = {
            #'http://202.205.80.215':'http://www.cau.edu.cn',
            'http://202.205.91.91': 'http://org.wusetu.cn'
        }
        self.inqueue = queue  #处理完后的URL的去处  有效queue

    def run(self):
        opener = urllib2.build_opener()  #创建一个开启器

        #通过urllib2.open的timeout 加入定时功能 对断链的等待时间

        while True:
            print 'queue size:', self.queue.qsize()
            if self.queue.qsize() == 0:
                print 'to break the while'
                break
            print 'start to get a queue'
            url = self.queue.get()  #从队列中取一个URL
            #print url
            if url == None:  #当取得一个None后表示爬虫结束工作,用于外部方便控制爬虫的生命期
                break
            print 'now:', self.name, url
            #parser = Basegeturls()          #创建一个网页分析器
            request = urllib2.Request(url)  #网页请求
            request.add_header('Accept-encoding',
                               'gzip')  #下载的方式是gzip压缩后的网页,gzip是大多数服务器支持的一种格式

            #临时的url表 储存未经过处理的url 向下交给 trans_d 转化为局部home_url的url
            tem_url = []
            try:  #这样可以减轻网络压力
                page = opener.open(request, timeout=2)  #发送请求报文
                if page.code == 200:  #当请求成功
                    predata = page.read()  #下载gzip格式的网页
                    pdata = StringIO.StringIO(predata)  #下面6行是实现解压缩
                    gzipper = gzip.GzipFile(fileobj=pdata)
                    try:
                        data = gzipper.read()
                    except (IOError):
                        print 'unused gzip'
                        data = predata  #当有的服务器不支持gzip格式,那么下载的就是网页本身
                    try:
                        #parser.feed(data)#分析网页
                        print 'began to parse the html'
                        if len(data) < 300:
                            continue
                        html = htmlctrl(data)
                    except:
                        print 'I am here'  #有的网页分析不了,如整个网页就是一个图片
                    for item in html.gUrl():
                        if item.find('#') < 0:
                            #self.result.put(item)#分析后的URL放入队列中 不嫩听解析的url(文件)似乎也放不进去
                            tem_url.append(item)  #将未处理的url加入到临时容器中

                    self.num += 1
                    self.way = '../store/html/' + self.getName() + str(
                        self.num)
                    #为了保证html后来的扩充性 重新决定保存为html源码
                    '''c=collector(data) 
                    #---------保存文件
                    #将使用   保存为document代替
                    file = open(self.way, 'w')  
                    file.write(c.xml().toxml()) #没有判断下载网页是否为空  到具体解析到时候再进行判断 
                    file.close()  '''
                    file = open(self.way, 'w')  #保存为短地址 如 s012
                    file.write(data)
                    file.close()

                    #此处需要加入collector 提取相关信息

                    #加入 总体 url表
                    self.Flcok.acquire()
                    confile = open('../store/config.txt', 'a')
                    confile.write(self.getName() + str(self.num) + ' ' + url +
                                  '\n')
                    confile.close()
                    self.Flcok.release()
                page.close()
                if self.num >= self.maxnum:  #达到最大量后退出
                    break
            except:
                print 'end error'

            #开始将新的raw_url 进行处理
            #包括 转化为 绝对地址  与局部home_url进行链接
            temHomeUrl = self.tem_home(url)
            self.trans_d(temHomeUrl, tem_url)
            if self.num > self.maxnum:
                for i in self.list:
                    print i
                break
                return True

    def trans_d(self, tem_url, rawurls):
        '将收获的url转化为 相对于局部主地址的绝对地址 并将其加入到inqueue中'
        urltest = Urltest()  #对url的相关处理

        while True:
            if len(rawurls) > 0:
                item = rawurls.pop()
            else:
                break
            if (item == None) or (len(item) < 3):
                break
            if item[0:4] == '\r\n':
                item = item[4:]
            if item[-1] == '/':
                item = item[:-1]
            #ipurl
            #change url to direct url
            #already direct url
            if len(item) >= len('http://') and item[0:7] == 'http://':
                for homepage in self.home_list:
                    #change wheather it is a subpage
                    length = len(homepage)
                    if len(item) >= length and item[0:length] == homepage:
                        if self.list.find(item) == False:
                            self.inqueue.put(item)
                        break
                continue  #return to while
            if item[0:5] == '/java' or item[0:4] == 'java':
                pass
            else:
                #相对地址开始 tem_url为局部home_url
                #相对地址 #更新: 对于../进行退格处理
                if item[0:3] == '../':
                    item = self.urltest.absUrl(tem_url, item)
                elif item[0] != '/':
                    item = '/' + item
                    item = tem_url + item  #使用局部home_url代替了homeurl
                elif item[:2] == './':
                    item = tem_url + item[2:]
                #item=urltest.absDirUrl(item) #绝对地址再次进行处理
                if self.list.find(item) == False:
                    self.inqueue.put(item)

    def __backFind(self, home, s):
        thome = home[::-1]
        i = thome.find(s)
        if i > -1:
            return len(home) - i - 1
        else:
            return False

    def tem_home(self, url):
        #the situations:
        #hsz/index.php   can.edu.cn  cn/hsz   cn/hsz/
        #the most import thing is the last . and / pos
        askpos = self.__backFind(url, '?')
        if askpos:  #if ? exists
            url = url[:askpos]
        right_end = ['cn', 'com', 'org']
        pos1 = self.__backFind(url, '/')  # pos of last /
        pos2 = self.__backFind(url, '.')  # pos of last .
        length = len(url)  #length of url
        #start to judge
        if pos1 and pos2:
            if pos1 > pos2:
                #cn/hsz cn/hsz/
                print 'length is', length
                print 'pos1 is ', pos1
                if pos1 == length - 1:
                    return url[:-1]
                return url
            #cau.edu.cn   hsz.php
            end = url[pos2 + 1:]
            print 'ping: cau.edu.cn\n the end is:', end
            for i in right_end:
                if end == i:  #like: cau.edu.cn
                    return url
            #like cau.edu.cn/index.php
            pos2 = self.__backFind(url[:pos2], '/')
            return url[:pos2]
Beispiel #7
0
class reptile(threading.Thread):
    # configfile: 是配置文件,存放网页的URL和下载下后的路径
    # maxnum:     每个爬虫有个最大下载量,当下载了这么多网页后,爬虫dead
    # 需要解决一个问题:
    # 校内许多的网站都是使用ip进行交互,需要解决url和ip的差异
    # 工作方式:
    #   主程序给定一个队列,各个爬虫开始在此队列中进行查找,队列自动判断ip及域名的差异,采用ip和域名双判断

    # 需要定义一个黑名单,对一些站点不要

    def __init__(
        self,
        Name,
        queue,
        list,
        result,
        Flcok,
        inittime=0.00001,
        downloadway="./",
        configfile="D:\\bbs\\conf.txt",
        maxnum=10000,
    ):
        threading.Thread.__init__(self, name=Name)
        self.queue = queue
        self.result = result
        self.Flcok = Flcok
        self.inittime = inittime
        self.mainway = downloadway
        self.configfile = configfile
        self.num = 0  # 已下载的网页个数
        self.maxnum = maxnum
        self.way = downloadway + self.getName() + "\\"
        self.list = list
        self.urltest = Urltest()  # 链接的相关操作对象
        # 加入了主  home_url
        #
        self.home_list = [
            "http://www.cau.edu.cn",
            #'http://202.205.80.215',
            "http://org.wusetu.cn/hsz",
            #'http://202.205.91.91/hsz'
            # 五色土开始
            #'http://wusetu.cn/logok.htm',
            "http://online.wusetu.cn",  # 社区论坛 无需要登录
            #'http://home.wusetu.cn',  #个人空间,需要登录 价值不大
            #'http://flash.wusetu.cn', #福来乐娱乐游戏 不许要登录
            #'http://vod.cau.edu.cn', #机网中心 影视剧场
            #'http://music.cau.edu.cn',#音乐
            #'http://v.cau.edu.cn',#校内在线 电影 校内浏览器
            # 未爬PT
        ]
        self.ip_list = {
            #'http://202.205.80.215':'http://www.cau.edu.cn',
            "http://202.205.91.91": "http://org.wusetu.cn"
        }
        self.inqueue = queue  # 处理完后的URL的去处  有效queue

    def run(self):
        opener = urllib2.build_opener()  # 创建一个开启器

        # 通过urllib2.open的timeout 加入定时功能 对断链的等待时间

        while True:
            print "queue size:", self.queue.qsize()
            if self.queue.qsize() == 0:
                print "to break the while"
                break
            print "start to get a queue"
            url = self.queue.get()  # 从队列中取一个URL
            # print url
            if url == None:  # 当取得一个None后表示爬虫结束工作,用于外部方便控制爬虫的生命期
                break
            print "now:", self.name, url
            # parser = Basegeturls()          #创建一个网页分析器
            request = urllib2.Request(url)  # 网页请求
            request.add_header("Accept-encoding", "gzip")  # 下载的方式是gzip压缩后的网页,gzip是大多数服务器支持的一种格式

            # 临时的url表 储存未经过处理的url 向下交给 trans_d 转化为局部home_url的url
            tem_url = []
            try:  # 这样可以减轻网络压力
                page = opener.open(request, timeout=2)  # 发送请求报文
                if page.code == 200:  # 当请求成功
                    predata = page.read()  # 下载gzip格式的网页
                    pdata = StringIO.StringIO(predata)  # 下面6行是实现解压缩
                    gzipper = gzip.GzipFile(fileobj=pdata)
                    try:
                        data = gzipper.read()
                    except (IOError):
                        print "unused gzip"
                        data = predata  # 当有的服务器不支持gzip格式,那么下载的就是网页本身
                    try:
                        # parser.feed(data)#分析网页
                        print "began to parse the html"
                        if len(data) < 300:
                            continue
                        html = htmlctrl(data)
                    except:
                        print "I am here"  # 有的网页分析不了,如整个网页就是一个图片
                    for item in html.gUrl():
                        if item.find("#") < 0:
                            # self.result.put(item)#分析后的URL放入队列中 不嫩听解析的url(文件)似乎也放不进去
                            tem_url.append(item)  # 将未处理的url加入到临时容器中

                    self.num += 1
                    self.way = "../store/html/" + self.getName() + str(self.num)
                    # 为了保证html后来的扩充性 重新决定保存为html源码
                    """c=collector(data) 
                    #---------保存文件
                    #将使用   保存为document代替
                    file = open(self.way, 'w')  
                    file.write(c.xml().toxml()) #没有判断下载网页是否为空  到具体解析到时候再进行判断 
                    file.close()  """
                    file = open(self.way, "w")  # 保存为短地址 如 s012
                    file.write(data)
                    file.close()

                    # 此处需要加入collector 提取相关信息

                    # 加入 总体 url表
                    self.Flcok.acquire()
                    confile = open("../store/config.txt", "a")
                    confile.write(self.getName() + str(self.num) + " " + url + "\n")
                    confile.close()
                    self.Flcok.release()
                page.close()
                if self.num >= self.maxnum:  # 达到最大量后退出
                    break
            except:
                print "end error"

            # 开始将新的raw_url 进行处理
            # 包括 转化为 绝对地址  与局部home_url进行链接
            temHomeUrl = self.tem_home(url)
            self.trans_d(temHomeUrl, tem_url)
            if self.num > self.maxnum:
                for i in self.list:
                    print i
                break
                return True

    def trans_d(self, tem_url, rawurls):
        "将收获的url转化为 相对于局部主地址的绝对地址 并将其加入到inqueue中"
        urltest = Urltest()  # 对url的相关处理

        while True:
            if len(rawurls) > 0:
                item = rawurls.pop()
                urlte = item
            else:
                break
            if (item == None) or (len(item) < 3):
                break
            if item[0:4] == "\r\n":
                item = item[4:]
            if item[-1] == "/":
                item = item[:-1]
            # ipurl
            # change url to direct url
            # already direct url
            if len(item) >= len("http://") and item[0:7] == "http://":
                for homepage in self.home_list:
                    # change wheather it is a subpage
                    length = len(homepage)
                    if len(item) >= length and item[0:length] == homepage:
                        if self.list.find(item) == False:
                            self.inqueue.put(item)
                        break
                continue  # return to while
            if item[0:5] == "/java" or item[0:4] == "java":
                pass
            else:
                # 相对地址开始 tem_url为局部home_url
                # 相对地址 #更新: 对于../进行退格处理
                if item[0:3] == "../":
                    item = self.urltest.absUrl(tem_url, item)
                elif item[0] != "/":
                    item = "/" + item
                    item = tem_url + item  # 使用局部home_url代替了homeurl
                elif item[:2] == "./":
                    item = tem_url + item[2:]
                # item=urltest.absDirUrl(item) #绝对地址再次进行处理
                if self.list.find(item) == False:
                    self.inqueue.put(item)
            # 记录链接情况
            self.Flcok.acquire()
            confile = open("../store/urltest.txt", "a")
            confile.write(tem_url + " " + urlte + " " + item + "\n")
            confile.close()
            self.Flcok.release()

    def __backFind(self, home, s):
        thome = home[::-1]
        i = thome.find(s)
        if i > -1:
            return len(home) - i - 1
        else:
            return False

    def tem_home(self, url):
        # the situations:
        # hsz/index.php   can.edu.cn  cn/hsz   cn/hsz/
        # the most import thing is the last . and / pos
        askpos = self.__backFind(url, "?")
        if askpos:  # if ? exists
            url = url[:askpos]
        right_end = ["cn", "com", "org"]
        pos1 = self.__backFind(url, "/")  # pos of last /
        pos2 = self.__backFind(url, ".")  # pos of last .
        length = len(url)  # length of url
        # start to judge
        if pos1 and pos2:
            if pos1 > pos2:
                # cn/hsz cn/hsz/
                print "length is", length
                print "pos1 is ", pos1
                if pos1 == length - 1:
                    return url[:-1]
                return url
            # cau.edu.cn   hsz.php
            end = url[pos2 + 1 :]
            print "ping: cau.edu.cn\n the end is:", end
            for i in right_end:
                if end == i:  # like: cau.edu.cn
                    return url
            # like cau.edu.cn/index.php
            pos2 = self.__backFind(url[:pos2], "/")
            return url[:pos2]