结合调度器完成爬虫任务

学习任务
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=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






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞飞翼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值