前几天由于工作需求,我要去网上下载数量比较大的一批风景名胜的图片,想省点劲就搞了搞爬虫,感觉还挺有意思的。干完活之后闲暇之余看了看《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, '