示例#1
0
 def __init__(self):
     #初始化分布式进程中的工作节点的连接工作
     # 实现第一步:使用BaseManager注册获取Queue的方法名称
     BaseManager.register('get_task_queue')
     BaseManager.register('get_result_queue')
     # 实现第二步:连接到服务器:
     server_addr = '127.0.0.1'
     print('Connect to server %s...' % server_addr)
     # 端口和验证口令注意保持与服务进程设置的完全一致:
     self.m = BaseManager(address=(server_addr, 8001), authkey='baike')
     # 从网络连接:
     self.m.connect()
     # 实现第三步:获取Queue的对象:
     self.task = self.m.get_task_queue()
     self.result = self.m.get_result_queue()
     #初始化网页下载器和解析器
     self.downloader = HtmlDownloader()
     self.parser = HtmlParser()
     print 'init finish'
示例#2
0
 def __init__(self):
     # 初始化分布式进程中的工作节点的连接工作
     # 实现第一步:使用BaseManager注册获取Queue的方法名称
     BaseManager.register('get_task_queue')
     BaseManager.register('get_result_queue')
     # 实现第二步:连接到服务器
     server_addr = '127.0.0.1'
     print("连接到服务器 %s..." % server_addr)
     # 端口和验证口令注意保持与服务器进程设置的完全一致
     self.m = BaseManager(address=(server_addr, 8002),
                          authkey='douban'.encode('utf-8'))
     # 从网络连接
     self.m.connect()
     # 实现第三步:获取Queue的对象:
     self.task = self.m.get_task_queue()
     self.result = self.m.get_result_queue()
     # 初始化网页下载器和解析器
     self.downloader = HtmlDownloader()
     self.parser = HtmlParser()
     print("初始化成功")
示例#3
0
class SpiderWork(object):
    def __init__(self):
        #初始化分布式进程中的工作节点的连接工作
        # 实现第一步:使用BaseManager注册获取Queue的方法名称
        BaseManager.register('get_task_queue')
        BaseManager.register('get_result_queue')
        # 实现第二步:连接到服务器:
        server_addr = '127.0.0.1'
        print(('Connect to server %s...' % server_addr))
        # 端口和验证口令注意保持与服务进程设置的完全一致:
        self.m = BaseManager(address=(server_addr, 8001),
                             authkey='baike'.encode('utf-8'))
        # 从网络连接:
        self.m.connect()
        # 实现第三步:获取Queue的对象:
        self.task = self.m.get_task_queue()
        self.result = self.m.get_result_queue()
        #初始化网页下载器和解析器
        self.downloader = HtmlDownloader()
        self.parser = HtmlParser()
        print('init finish')

    def crawl(self):
        while (True):
            try:
                if not self.task.empty():
                    url = self.task.get()

                    if url == 'end':
                        print('控制节点通知爬虫节点停止工作...')
                        #接着通知其它节点停止工作
                        self.result.put({'new_urls': 'end', 'data': 'end'})
                        return
                    print('爬虫节点正在解析:%s' % url.encode('utf-8'))
                    content = self.downloader.download(url)
                    new_urls, data = self.parser.parser(url, content)
                    self.result.put({"new_urls": new_urls, "data": data})
            except EOFError as e:
                print("连接工作节点失败")
                return
            except Exception as e:
                print(e)
                print('Crawl  fali ')
示例#4
0
 def main_parser(self, page, url):
     """
     :param page: 每种类别下爬取的页数
     :return:返回的是标签以及完整的url集合
     """
     content = HtmlDownloader().download(url)
     # print(content)
     soup = BeautifulSoup(content, 'html.parser')
     labels = []
     new_urls = []
     label_table_list = soup.find_all('table', {'class': 'tagCol'})
     for label_tabel in label_table_list:
         label_list = label_tabel.find_all('a')
         for label in label_list:
             labels.append(label.get_text())
             new_url = label['href']
             full_url = parse.urljoin('https://book.douban.com/', new_url)
             for i in range(page):
                 full_url = full_url + '?start=' + str(i * 20) + '&type=T'
                 new_urls.append(full_url)
     return labels, new_urls
from SpiderNode.HtmlDownloader import HtmlDownloader

html_downloader = HtmlDownloader()
url = "http://www.baidu.com"
print(html_downloader.download(url))
示例#6
0
class SpiderWork(object):
    def __init__(self):
        # 初始化分布式进程中的工作节点的连接工作
        # 实现第一步:使用BaseManager注册获取Queue的方法名称
        BaseManager.register('get_task_queue')
        BaseManager.register('get_result_queue')
        # 实现第二步:连接到服务器
        server_addr = '127.0.0.1'
        print("连接到服务器 %s..." % server_addr)
        # 端口和验证口令注意保持与服务器进程设置的完全一致
        self.m = BaseManager(address=(server_addr, 8002),
                             authkey='douban'.encode('utf-8'))
        # 从网络连接
        self.m.connect()
        # 实现第三步:获取Queue的对象:
        self.task = self.m.get_task_queue()
        self.result = self.m.get_result_queue()
        # 初始化网页下载器和解析器
        self.downloader = HtmlDownloader()
        self.parser = HtmlParser()
        print("初始化成功")

    def crawl(self):
        labels, url_list = self.parser.main_parser(config.page,
                                                   config.main_url)
        print(
            url_list
        )  # url_list里存储的是每个标签的网页地址 eg:https://book.douban.com/tag/小说?start=0%type=T
        print("爬虫结点正在解析主URL:%s" % config.main_url)
        for i in range(config.labels_number):  # 3代表标签数目,修改为5减少测试时间
            # for i in range(len(url_list)):
            url_list_content = self.downloader.download(url_list[i])
            new_urls = self.parser.parser(url_list[i], url_list_content,
                                          0)  # 返回值改为set类型
            print(new_urls)
            self.result.put({"label": labels[i], "new_urls": new_urls})
            time.sleep(2)
            dataset = list()
            while (True):
                try:
                    if not self.task.empty():
                        url = self.task.get()  # get到的数据同样为set类型需要进行类型转换
                        if url == 'over':  # over代表该标签下的所有url已全部解析,与end区分一下
                            print('%s标签下所有URL已全部解析' % labels[i])
                            self.result.put({'new_urls': 'over'})
                            print(dataset)
                            self.result.put({'data': dataset})
                            time.sleep(1)
                            break
                        print("爬虫节点正在解析:%s" % url.encode('utf-8'))
                        content = self.downloader.download(url)
                        data = self.parser.parser(url, content, 1)
                        # print(data)
                        dataset.append(data)
                        # print(len(dataset))
                        time.sleep(2)
                    else:
                        print('任务队列为空!')
                        return
                except EOFError as e:
                    print(e)
                    print("连接工作节点失败!")
                    return
                except Exception as e:
                    print(e)
                    print("爬取失败!")
        url = self.task.get()
        if url == 'end':
            print("控制节点通知其他节点停止工作...")
            self.result.put({'new_urls': 'end', 'data': 'end'})
            print("爬取完成")
            return
        else:
            print(url)
            print("爬取失败")