结合调度器完成爬虫任务
2017-12-13 18:22
344 查看
学习任务
1.编写一个简单的爬虫程序
爬虫的结果
crow 1:https://baike.baidu.com/view/21087.html
crow 2:http://v.baidu.com/
crow failed
crow 2:http://map.baidu.com/
crow failed
crow 2:https://baike.baidu.com/ziran
crow failed
crow 2:https://baike.baidu.com/kedou/
crow failed
crow 2:https://baike.baidu.com/uc/favolemma
crow failed
crow 2:https://baike.baidu.com/redirect/bd57D_QYRJrWtaYXMHfo4iHnUkk-10lbsmyUNTIBCyStIVCwG90uXOqxPuW_YBCkKIYcdmiuJg
crow failed
crow 2:https://baike.baidu.com/item/%E9%A9%AC%E7%89%B9%E5%88%A9
crow 3:https://baike.baidu.com/item/%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E7%BC%96%E7%A8%8B%E6%8E%A5%E5%8F%A3
crow 4:https://baike.baidu.com/feiyi?fr=dhlfeiyi
学习目标
知识目标
1.熟悉爬虫的调度程序
2.掌握简单的爬虫架构
能力目标
1.能够自主编写一个简单的爬虫
初始化函数
爬虫调度函数
爬虫开始函数
知识点总结
1.爬虫调度程序
2.调度程序调度三个模块
问题
1.什么是爬虫的调度程序
2.爬虫调度程序最重要的一个函数
3.自己写一个简单的爬虫程序
答案
1.爬虫调度器询问URL管理器,判断是否有待爬取的URL,如果有的话,
从调度器获取一个待爬取的URL,URL管理器将这个URL返回给调度器,
调度器得到这个URL,将URL返回给下载器,下载URL内容,下载好后下
载器将URL的内容返回给调度器,调度器将URL的内容传给解析器,解析
其内容然后得到有价值的数据,得到新的URL列表传给调度器调度器收集
价值数据,传给应用,另一方面,调度器会将新的URL列表传给URL管理器,
如果还有待爬取的URL,上面步骤会循环
最后,调度器会调用应用的方法,输出有价值的数据
2.最重要的函数是
爬虫的入口函数
3.
URL管理器模块
网页下载器模块
网页解析器模块
爬虫调度模块
输出爬取的信息
1.编写一个简单的爬虫程序
爬虫的结果
crow 1:https://baike.baidu.com/view/21087.html
crow 2:http://v.baidu.com/
crow failed
crow 2:http://map.baidu.com/
crow failed
crow 2:https://baike.baidu.com/ziran
crow failed
crow 2:https://baike.baidu.com/kedou/
crow failed
crow 2:https://baike.baidu.com/uc/favolemma
crow failed
crow 2:https://baike.baidu.com/redirect/bd57D_QYRJrWtaYXMHfo4iHnUkk-10lbsmyUNTIBCyStIVCwG90uXOqxPuW_YBCkKIYcdmiuJg
crow failed
crow 2:https://baike.baidu.com/item/%E9%A9%AC%E7%89%B9%E5%88%A9
crow 3:https://baike.baidu.com/item/%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E7%BC%96%E7%A8%8B%E6%8E%A5%E5%8F%A3
crow 4:https://baike.baidu.com/feiyi?fr=dhlfeiyi
学习目标
知识目标
1.熟悉爬虫的调度程序
2.掌握简单的爬虫架构
能力目标
1.能够自主编写一个简单的爬虫
初始化函数
#初始化个个器材 def __init__(self): self.urls=url_manage.UrlManager(); self.downloder=html_downloader.HtmlDownloader(); self.parser=html_parser.Html_Parser(); self.outputer=html_outputer.Html_Outputer()
爬虫调度函数
#爬虫的调度程序 def craw(self,root_url): count=1; self.urls.add_new_url(root_url); while self.urls.has_new_url: try: new_url=self.urls.get_new_url() print 'crow %d:%s'%(count,new_url) html_cont=self.downloder.download(new_url) new_urls ,new_data=self.parser.parse(new_url,html_cont) self.urls.add_new_urls(new_urls ); self.outputer.collect_data(new_data) if count==100: break; count=count+1; except: print 'crow failed' self.outputer.output_html()
爬虫开始函数
if __name__=='__main__': #入口url root_url='https://baike.baidu.com/view/21087.html'; obj_spider=SpiderMain(); #启动爬虫 obj_spider.craw(root_url)
知识点总结
1.爬虫调度程序
2.调度程序调度三个模块
问题
1.什么是爬虫的调度程序
2.爬虫调度程序最重要的一个函数
3.自己写一个简单的爬虫程序
答案
1.爬虫调度器询问URL管理器,判断是否有待爬取的URL,如果有的话,
从调度器获取一个待爬取的URL,URL管理器将这个URL返回给调度器,
调度器得到这个URL,将URL返回给下载器,下载URL内容,下载好后下
载器将URL的内容返回给调度器,调度器将URL的内容传给解析器,解析
其内容然后得到有价值的数据,得到新的URL列表传给调度器调度器收集
价值数据,传给应用,另一方面,调度器会将新的URL列表传给URL管理器,
如果还有待爬取的URL,上面步骤会循环
最后,调度器会调用应用的方法,输出有价值的数据
2.最重要的函数是
if __name__=='__main__': #入口url root_url='https://baike.baidu.com/view/21087.html'; obj_spider=SpiderMain(); #启动爬虫 obj_spider.craw(root_url)
爬虫的入口函数
3.
URL管理器模块
#!/user/bin/env python # _*_ coding:utf-8 _*_ #URL管理器 class UrlManager(): def __init__(self): self.new_urls=set(); self.odd_urls=set(); def add_new_url(self,url): if url is None: return if url not in self.new_urls and url not in self.odd_urls: self.new_urls.add(url) def add_new_urls(self,urs): if urs is None and len(urs)==0: return for url in urs: self.add_new_url(url) def has_new_url(self): return len(self.new_urls)!=0; def get_new_url(self): new_url=self.new_urls.pop(); self.odd_urls.add(new_url) return new_url
网页下载器模块
#!/user/bin/env python # _*_ coding:utf-8 _*_ #HTML下载器 import urllib2 class HtmlDownloader(): #传进来一个要下载的URl def download(self,url): #如果url为空,则返回空 if url is None: return None; response=urllib2.urlopen(url); # 获取请求值 if response.getcode()!=200: return None; else: #返回html字符串 return response.read()
网页解析器模块
#!/user/bin/env python # _*_ coding:utf-8 _*_ #html解析器 from bs4 import BeautifulSoup import re,urlparse class Html_Parser(): #获取新的URL def _get_new_urls(self,page_url,soup): #存储URL new_urls=set(); #获取所有的URl #/view/\d+\.htm links=soup.find_all('a',href=re.compile(r'')) for link in links: #获取每一个URL new_url=link['href'] #上面获取的URl不完整要拼接 #urljoin 这个函数能够按照page_url的格式拼接字符串 new_full_url=urlparse.urljoin(page_url,new_url) new_urls.add(new_full_url) return new_urls #解析数据 我们需要解析title和soup两个数据 def _get_new_data(self,page_url,soup): res_data={} res_data['url']=page_url; #匹配title节点 title_node=soup.find('dd',class_='lemmaWgt-lemmaTitle-title',).find('h1') #获取title的文本信息 res_data['title']=title_node.get_text(); summary_node=soup.find('div',class_='lemma-summary') res_data['summary'] = summary_node.get_text(); return res_data #从cont中解析出两个数据(新的URL列表和数据) def parse(self,page_url,html_cont): if page_url is None and html_cont is None: return; soup=BeautifulSoup(html_cont,'html.parser',from_encoding='utf-8') new_urls=self._get_new_urls(page_url,soup) #进行解析出新的数据 new_data = self._get_new_data(page_url, soup) return new_urls,new_data
爬虫调度模块
#!/user/bin/env python
# _*_ coding:utf-8 _*_
import url_manage,html_downloader,html_parser,html_outputer
class SpiderMain(object):
#初始化个个器材 def __init__(self): self.urls=url_manage.UrlManager(); self.downloder=html_downloader.HtmlDownloader(); self.parser=html_parser.Html_Parser(); self.outputer=html_outputer.Html_Outputer()
#爬虫的调度程序
def craw(self,root_url):
count=1;
self.urls.add_new_url(root_url);
while self.urls.has_new_url:
try:
new_url=self.urls.get_new_url()
print 'crow %d:%s'%(count,new_url)
html_cont=self.downloder.download(new_url)
new_urls ,new_data=self.parser.parse(new_url,html_cont)
self.urls.add_new_urls(new_urls );
self.outputer.collect_data(new_data)
if count==100:
break;
count=count+1;
except:
print 'crow failed'
self.outputer.output_html()
if __name__=='__main__': #入口url root_url='https://baike.baidu.com/view/21087.html'; obj_spider=SpiderMain(); #启动爬虫 obj_spider.craw(root_url)
输出爬取的信息
#!/user/bin/env python # _*_ coding:utf-8 _*_、 #输出爬出来的数据 class Html_Outputer(): #用于数据的维护 def __init__(self): self.datas=[] #用于收集数据 def collect_data(self,data): if data is None: return self.datas.append(data) pass #用于将收集好的数据写到HTML中 def output_html(self): #建立一个文件,写的模式 font 4000 =open('outhtml.html','w') font.write("<html>") font.write("<body>") font.write("<table>") for data in self.datas: font.write("<tr>") font.write("<td>%s</td>"%data['url']) font.write("<td>%s</td>" % data['title'].encode('utf-8')) font.write("<td>%s</td>" % data['summary'].encode('utf-8')) font.write("</tr>") font.write("</table>") font.write("</body>") font.write("</html>") font.close(); pass
相关文章推荐
- Ubuntu下配置python完成爬虫任务(笔记一)
- windows任务计划和批处理脚本结合完成的一些简单功能
- 任务调度器之azkaban(一)
- 1、根据SC数据库用SQL语句完成以下任务。
- [ACM_水题] UVA 11729 Commando War [不可同时交代任务 可同时执行 最短完成全部时间 贪心]
- 2008年10月21日记录(任务有待进一步完成)
- 用Python高效地完成任务
- PHP结合Linux的cron命令实现定时任务
- 坚持#第114天~每天安排的任务要完成!
- 算法,设计模式,数据结构,多线程以及研究领域的深入是我研究生阶段要完成的任务
- 怎么样提高团队合力完成的信息收集任务的质量
- 完成任务来增加Dropbox免费空间
- 简单爬虫结合协程
- mapreduce源码分析之默认的任务调度器——JobQueueTaskScheduler
- Selenium 与Junit 结合完成Web autmation
- 企业级任务调度框架Quartz 六 任务调度器(Scheduler)
- 第一次完成工作任务 ^_^
- 用Pandas完成Excel中常见的任务
- 编译阶段完成的任务
- 任务1:把一张图附到另一张图上(c++结合opencv)