python分布式爬虫

本文介绍了作者使用Python实现的一个简单的分布式爬虫项目,目标是从百度百科抓取词条信息,包括url、title和释义,并避免重复抓取。项目包含DataOutput、URLManager、controller、HtmlDownloader、HtmlParser和agent等模块,分别负责数据存储、url管理、控制流程、网页下载、内容解析和爬虫节点功能。通过启动controller和agent,即可开始分布式爬取任务。
摘要由CSDN通过智能技术生成

        前几天由于工作需求,我要去网上下载数量比较大的一批风景名胜的图片,想省点劲就搞了搞爬虫,感觉还挺有意思的。干完活之后闲暇之余看了看《python爬虫开发与项目实践》这本书,看到里边有一章介绍了分布式爬虫,感觉有些神奇,就稍微改了下书里的代码,分享一下。好了,话不多说,先看一下代码的文件结构:

        这个简单的工程的目的是从百度百科上爬词条,比如输入的第一个url是http://baike.XXXXXX.html,爬虫会把这个词条的自身的url,词条的名字(title),以及词条的释义都保存起来,然后会把这个页面中所有关联的其他词条的url记录下来,再对这些关联词条进行同样的操作。其中controller是控制节点,只在一台电脑上运行;agent是爬虫节点,你可以放在不同的电脑上去下载解析网页。由于我条件艰苦,所以controller和agent我都放在我自己的破笔记本上运行了。。。

        接下来说一下代码里的每一个文件,首先是DataOutput.py,这个文件是把从网络上爬取的信息(词条本身的url,词条名称,词条释义保存起来),详见代码及注释,如下:

#coding=utf-8

import codecs
import time

class DataOutput():
    
    #在controller下创建baike_年_月_日_时_分_秒.html的文件,并把html文件头写入
    def __init__(self):
        self.datas = []
        self.filepath = 'baike_%s.html' % (time.strftime('%Y_%m_%d_%H_%M_%S', time.localtime()))
        self.output_head(self.filepath)
        
    #写入html文件头
    def output_head(self, filepath):
        fout = codecs.open(filepath, 'w', encoding='utf-8')
        fout.write("<html>")
        fout.write("<body>")
        fout.write("<table>")
        fout.close()

    #当datas不为空时,将其中的data存到html中
    def store_data(self, data):
        if data is None:
            return
    
        self.datas.append(data)
        if len(self.datas) > 1:
            self.output_html(self.filepath)
            
    #把data存成html表格形式
    def output_html(self, path):
        fout = codecs.open(path, 'a', encoding='utf-8')
        tmp = []
        for data in self.datas:
            fout.write("<tr>")
            fout.write("<td>%s</td>" % data['url'])
            fout.write("<td>%s</td>" % data['title'])
            fout.write("<td>%s</td>" % data['summary'])
            fout.write("</tr>")
            tmp.append(data)
        for t in tmp:
            self.datas.remove(t)
        fout.close()
        
    #写入html文件的结尾
    def output_end(self, path):
        fout = codecs.open(path, '
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值