简单易扩展的爬虫架构
已经写了好几篇的网络爬虫了,都是单个应用程序,那个下面介绍一下简单易扩展的爬虫架构;
应用场景是:爬取百度百科搜索关键字的1000个相关链接及相应的简介;
模块介绍:
首先是我们的主调度程序spidermain,用来决定从哪个地开始爬取及调用相关模块;
urlmanager 用来管理目标URL,对于新爬取的URL检查是否已爬取,并 对爬取过的URL做回收;
htmldownload 用来下载目标URL的网页源码;
htmlparser 用来分析目标URL网页源码,解析出源码中的URL及简介;
htmloutput 收集已经爬取过的网页内容,并输出;
spidermain.py
#!/usr/bin/env python #coding:utf-8 import htmldownload import htmlparser import urlmanager import htmloutput from myLog import MyLog as mylogclass SpiderMain(object):def __init__(self):self.urls = urlmanager.UrlManager()self.downloader = htmldownload.HtmlDownLoad()self.parser = htmlparser.HtmlParser()self.outputer = htmloutput.HtmlOutPut()self.log = mylog()def crow(self,url):self.urls.add_new_url(url)count = 1while self.urls.has_new_url():try:new_url = self.urls.get_new_url()self.log.info(u"当前爬取的是%d 个URL:%s"%(count,new_url))html_content = self.downloader.download(new_url) # print html_contentnew_urls,new_data = self.parser.parser(new_url,html_content)self.urls.add_new_urls(new_urls)self.outputer.collect_data(new_data)if count == 10 :breakcount += 1except Exception,e:self.log.error(u"当前爬取的%d 个URL:%s,失败......"%(count,new_url))self.log.error(e)self.outputer.output_html()if __name__ == "__main__":root_url = "https://baike.baidu.com/item/CSS/5457"obj_spider = SpiderMain()obj_spider.crow(root_url)
urlmanager.py
#coding:utf-8class UrlManager(object):def __init__(self):self.new_urls = set()self.old_urls = set()def add_new_url(self,url):if url is None :returnif url not in self.new_urls and url not in self.old_urls:self.new_urls.add(url)def add_new_urls(self,urls):if urls is None or len(urls) == 0 :returnfor url in urls:self.add_new_url(url)def has_new_url(self):return len(self.new_urls) != 0def get_new_url(self):new_url = self.new_urls.pop()self.old_urls.add(new_url)return new_url
htmldownload.py
#coding:utf-8 import urllib2 class HtmlDownLoad(object):def download(self,url):if url is None:returnheaders = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36","Referer":"https://baike.baidu.com/item"}req = urllib2.Request(url,headers=headers)response = urllib2.urlopen(req)if response.getcode() != 200:return Nonereturn response.read()
htmlparser.py
#coding:utf-8from bs4 import BeautifulSoup import re import urlparseclass HtmlParser(object):def _get_new_urls(self, page_url, soup):new_urls = set()links = soup.find_all('a', attrs={'href': re.compile(r'/item/.*?')})for link in links:new_url = link.get('href')new_full_url = urlparse.urljoin(page_url, new_url)new_urls.add(new_full_url)return new_urlsdef _get_new_data(self, page_url, soup):res_data = {}title_node = soup.find('dd', attrs={'class': 'lemmaWgt-lemmaTitle-title'}).find('h1')res_data['title'] = title_node.get_text()summary_node = soup.find('div', attrs={'class': 'lemma-summary'}).find('div',attrs={'class':'para'})res_data['summary'] = summary_node.get_text()res_data['url'] = page_url # print res_data.get('summary'),res_data.get('title'),res_data.get('url')return res_datadef parser(self, page_url, html_content):if page_url is None or html_content is None:returnsoup = BeautifulSoup(html_content,'lxml')new_urls = self._get_new_urls(page_url, soup)new_data = self._get_new_data(page_url, soup)return new_urls, new_data
htmloutput.py
#coding:utf-8 import codecs class HtmlOutPut(object):def __init__(self):self.datas = []def collect_data(self,data):if data is None:returnself.datas.append(data)def output_html(self): # print 'i am run 'fout = codecs.open('output.html','w','utf-8')fout.write('<html>')fout.write('<body>')fout.write('<table style="border:2px solid #000;">')for data in self.datas:fout.write('<tr style="border:2px solid #000;">')fout.write('<td style="border:2px solid #000;width:200px">%s</td>'%data.get('url'))fout.write('<td style="border:2px solid #000;">%s</td>' % data.get('title'))fout.write('<td style="border:2px solid #000;">%s</td>' % data.get('summary'))fout.write("</tr>")fout.write('</table>')fout.write('</body>')fout.write('</html>')
经过扩展,可以轻易获取想要内容;
后续将会上传爬取JS渲染过的网页,一起学习进步!
转载于:https://www.cnblogs.com/Mail-maomao/p/8017167.html
简单易扩展的爬虫架构相关推荐
- 开源OpenIM:高性能、可伸缩、易扩展的即时通讯架构
本文属于OpenIM技术团队原创,转载请注明出处,谢谢 网上有很多关于IM的教程和技术博文,有亿级用户的IM架构,有各种浅谈原创自研IM架构,也有微信技术团队分享的技术文章,有些开发者想根据这些资料自 ...
- 开源、易扩展、方便集成的Web绘图工具(流程图、架构图、组态、SCADA、大屏)
乐吾乐2D可视化Meta2d.js是一个基于typescript + canvas 实现的开源在线绘图软件.采用引擎 + 图形库+中间件的思路能够方便.快速的扩展.集成到前端项目. 集实时数据展示.动 ...
- 第3章 简单爬虫架构
第一节 python简单爬虫架构 1.爬虫调度端 2. 爬虫:URL管理器.网页下载器.网页解析器 3.价值数据 第二节 python简单爬虫架构的动态 转载于:https://www.cnblogs ...
- 写一个简单易用可扩展vue表单验证插件(vue-validate-easy)
写一个vue表单验证插件(vue-validate-easy) 需求 目标:简单易用可扩展 如何简单 开发者要做的 写了一个表单,指定一个name,指定其验证规则. 调用提交表单方法,可以获取验证成功 ...
- 简单的爬虫架构和网页下载器requests
目录 简单的爬虫架构: 网页下载器: URL管理器: 网页解析器: 网页下载器requests: 发送requests请求: 接收requests请求: requests操作实例: 简单的爬虫架构: ...
- 【vue2.0进阶】用axios来实现数据请求,简单易用
写了几期的黑话<互联网公司黑话大全>,有个同学问vue2.0的进阶篇算更新完了吗? 让我猛地想起进阶篇在推出预告的时候,大家都提醒前端君,vue-resource已经停止更新了,现在都推荐 ...
- python爬虫架构师之路_一位资深 架构师大牛给予Java技术提升的学习路线建议
一位资深 架构师大牛给予Java技术提升的学习路线建议 对于工作多年的程序员而言,日后的职业发展无非是继续专精技术.转型管理和晋升架构师三种选择. 架构师在一家公司有多重要.优秀架构师需要具备怎样的素 ...
- Reliable, Scalable, and Maintainable Applications 高可靠、易扩展、易运维应用
寻找翻译本书后续章节合作者 微信:18600166191 ---------------------------------- PART I Foundations of Data Systems ...
- 全场景、简单易用、极致高效!新一代AI部署工具FastDeploy来了!
人工智能产业应用发展的越来越快,开发者需要面对的适配部署工作也越来越复杂.层出不穷的算法模型.各种架构的AI硬件.不同场景的部署需求.不同操作系统和开发语言,为AI开发者项目落地带来极大的挑战. 为了 ...
最新文章
- 架构设计开发方式汇总
- 线性表的链式存储结构(C语言版)
- poj 2388 排序的水题
- 爱奇艺数据中台建设组合拳:日志投递、统一数仓、大数据平台
- Jsp页面用javascript加 滑动验证条
- 请问在JAVA编程中什么叫耦合?什么又叫解藕? 悬赏分:0 - 解决时间:2008-3-8 12:55...
- django进阶05中间件
- 测试对于list的sort与sorted的效率
- go - json -struct
- 17-什么是资源服务器
- 网站小图标制作及配置
- emqx配置ssl/tsl实现双向认证
- 《Delphi 4 开发大全》作者、Delphi研发团队开发工程师:史蒂夫·特谢拉(Steve Teixeira)访谈
- 输入三个整数a,b,c。并进行两两相加,最后比较相加和的最大值。
- Unity 简单TCP通信实现
- deepin v20显卡问题wifi网速慢cpu高频率发热(2021-1-23更新)
- 下级对上级回复已阅知_【优质】上级对下级报告的回复-范文模板 (9页)
- sqlserver2000企业版安装
- 用ExcelVBA下载股票板块历史数据
- OneCoin战队——个人总结(真·终章)