已经写了好几篇的网络爬虫了,都是单个应用程序,那个下面介绍一下简单易扩展的爬虫架构;

应用场景是:爬取百度百科搜索关键字的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

简单易扩展的爬虫架构相关推荐

  1. 开源OpenIM:高性能、可伸缩、易扩展的即时通讯架构

    本文属于OpenIM技术团队原创,转载请注明出处,谢谢 网上有很多关于IM的教程和技术博文,有亿级用户的IM架构,有各种浅谈原创自研IM架构,也有微信技术团队分享的技术文章,有些开发者想根据这些资料自 ...

  2. 开源、易扩展、方便集成的Web绘图工具(流程图、架构图、组态、SCADA、大屏)

    乐吾乐2D可视化Meta2d.js是一个基于typescript + canvas 实现的开源在线绘图软件.采用引擎 + 图形库+中间件的思路能够方便.快速的扩展.集成到前端项目. 集实时数据展示.动 ...

  3. 第3章 简单爬虫架构

    第一节 python简单爬虫架构 1.爬虫调度端 2. 爬虫:URL管理器.网页下载器.网页解析器 3.价值数据 第二节 python简单爬虫架构的动态 转载于:https://www.cnblogs ...

  4. 写一个简单易用可扩展vue表单验证插件(vue-validate-easy)

    写一个vue表单验证插件(vue-validate-easy) 需求 目标:简单易用可扩展 如何简单 开发者要做的 写了一个表单,指定一个name,指定其验证规则. 调用提交表单方法,可以获取验证成功 ...

  5. 简单的爬虫架构和网页下载器requests

    目录 简单的爬虫架构: 网页下载器: URL管理器: 网页解析器: 网页下载器requests: 发送requests请求: 接收requests请求: requests操作实例: 简单的爬虫架构: ...

  6. 【vue2.0进阶】用axios来实现数据请求,简单易用

    写了几期的黑话<互联网公司黑话大全>,有个同学问vue2.0的进阶篇算更新完了吗? 让我猛地想起进阶篇在推出预告的时候,大家都提醒前端君,vue-resource已经停止更新了,现在都推荐 ...

  7. python爬虫架构师之路_一位资深 架构师大牛给予Java技术提升的学习路线建议

    一位资深 架构师大牛给予Java技术提升的学习路线建议 对于工作多年的程序员而言,日后的职业发展无非是继续专精技术.转型管理和晋升架构师三种选择. 架构师在一家公司有多重要.优秀架构师需要具备怎样的素 ...

  8. Reliable, Scalable, and Maintainable Applications 高可靠、易扩展、易运维应用

    寻找翻译本书后续章节合作者  微信:18600166191 ---------------------------------- PART I Foundations of Data Systems ...

  9. 全场景、简单易用、极致高效!新一代AI部署工具FastDeploy来了!

    人工智能产业应用发展的越来越快,开发者需要面对的适配部署工作也越来越复杂.层出不穷的算法模型.各种架构的AI硬件.不同场景的部署需求.不同操作系统和开发语言,为AI开发者项目落地带来极大的挑战. 为了 ...

最新文章

  1. 架构设计开发方式汇总
  2. 线性表的链式存储结构(C语言版)
  3. poj 2388 排序的水题
  4. 爱奇艺数据中台建设组合拳:日志投递、统一数仓、大数据平台
  5. Jsp页面用javascript加 滑动验证条
  6. 请问在JAVA编程中什么叫耦合?什么又叫解藕? 悬赏分:0 - 解决时间:2008-3-8 12:55...
  7. django进阶05中间件
  8. 测试对于list的sort与sorted的效率
  9. go - json -struct
  10. 17-什么是资源服务器
  11. 网站小图标制作及配置
  12. emqx配置ssl/tsl实现双向认证
  13. 《Delphi 4 开发大全》作者、Delphi研发团队开发工程师:史蒂夫·特谢拉(Steve Teixeira)访谈
  14. 输入三个整数a,b,c。并进行两两相加,最后比较相加和的最大值。
  15. Unity 简单TCP通信实现
  16. deepin v20显卡问题wifi网速慢cpu高频率发热(2021-1-23更新)
  17. 下级对上级回复已阅知_【优质】上级对下级报告的回复-范文模板 (9页)
  18. sqlserver2000企业版安装
  19. 用ExcelVBA下载股票板块历史数据
  20. OneCoin战队——个人总结(真·终章)

热门文章

  1. T2 Funcin T1,out T2(T1 arg)
  2. at for lte
  3. (原创)如何进行有符号小数乘法运算?(Verilog)
  4. 【Vue2.0】—mixin混入 (十五)
  5. FCFS,SJF,HRRN调度算法
  6. 比特币矿池是什么意思
  7. 无论你是用什么样的模式去拓展市场
  8. 一定要吃透的四个人性真相
  9. 躺赚的意思不是做到高级别就觉得高枕无忧了
  10. 阿里巴巴,华为都不在58上招聘么?