为了账号安全,请及时绑定邮箱和手机立即绑定

count = count + 1 为什么会报错???

#coding=utf-8                                                                              

import urllib2

import re

import urlparse

from bs4 import BeautifulSoup



class SpiderMain(object):

      def __init__(self):     #初始化对象                                                  

          self.urls = url_manager.UrlManager()    #管理器                                  

          self.downloader = html_downloader.HtmlDownloader()   #下载器                     

          self.parser = html_parser.HtmlParser()    #解析器                                

          self.outputer = html_outputer.HtmlOutputer()    #输出器                          


      def craw(self,root_url):    #如果有待爬取的url                                       

          count = 1   #记录当前爬取的是第几个url                                           

          self.urls.add_new_url(root_url)  #取一个出来                                     

          while self.urls.has_new_url():  #循环遍历                                        

              try:

                new_url = self.urls.get_new_url()  #得到链接                               

                print 'craw %d : %s'%(count,new_url)

                html_cont = self.downloader.download(new_url)  #下载对应的页面             

                new_urls,new_data = self.parser.parse(new_url,html_cont)#解析              

                self.urls.add_new_urls(new_urls)   #将新的url补充进url管理器               

                self.outputer.collect_data(new_data)  #进行数据的升级并输出                

                if count == 1000:

                  break

            count = count + 1

              except:

                  print 'craw failed'

            self.outputer.output_html()



class UrlManager(object):

    def __init__(self):

        self.new_urls = set()

        self.old_urls = set()


    def add_new_url(self,url):    #向管理器添加新的url                                     

if url is None:    #如果url等于空                                                  

            return         #不进行添加                                                     

        if url not in self.new_urls and url not in self.old_urls:

            #这个url既不在待爬取的urls里也不再爬取过的url里表里                            

            self.new_urls.add(url)     #添加到待爬取的列表里                               


    def add_new_urls(self,urls):   #向管理器中添加批量的url                                

        if urls is None or len(urls) == 0:   #若列表为空                                   

            return   #不进行添加                                                           

        for url in urls:

            self.add_new_url(url)   #进行单个添加

    def has_new_url(self):    #判断管理器中有新的待爬取的url                               

        return len(self.new_urls) != 0   #如果urls长度不为0的话说明有待爬取url             


    def get_new_url(self):    #从管理器中获取新的待爬取的url                               

          new_url = self.new_urls.pop()  #获取一个url                                      

          #pop:会从列表中获取一个url并且会移除这个url                                      

        self.old_urls.add(new_url)  #将这个url添加进oldurl                                 

        return new_url   #将这个url返回                                                    


class HtmlDownloader(object):

    def download(self,url):

        if url is None:

            return None


        response = urllib2.urlopen(url)


        if response.getcode() != 200:

            return None


        return response.read()

class HtmlParser(object):


      def _get_new_urls(self,page_url,soup):

            new_urls = set()

            links = soup.find_all('a',href=re.compile(r"/view/\d+\.htm"))

            for link in links:

                  new_url = link['href']

                  new_full_url = urlparse.urljoin(page_url,new_url)

                  new_urls.add(new_full_url)

            return new_urls


      def _get_new_data(self,page_url,soup):

            res_data = {}


            res_data['url'] = page_url


            title_node = soup.find('dd',class_="lemmaWgt-lemmaTitle-title").find("h1")

            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


      def parse(self,page_url,html_cont):

            if page_url is None or 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


class HtmlOutputer(object):

      def __init__(self):

            self.datas = []


      def collect_data(self,data):

            if data is None:

                  return

            self.datas.append(data)


      def output_html(self):

            fout = open('output.html','w')


            fout.write("<html>")

            fout.write("<body>")

            fout.write("<table>")


            for data in self.datas:

                  fout.write("<tr>")

                  fout.write("<td>%s</td>"%data['url'])

                  fout.write("<td>%s</td>"%data['title'].encode('utf-8'))

                  fout.write("<td>%s</td>"%data['summary'].encode('utf-8'))

                  fout.write("</tr>")


            fout.write("</table>")

            fout.write("</body>")

            fout.write("</html>")


            fout.close()


if __name__=="__main__":

   root_url = "http://baike.baidu.com/view/21087.htm"    #入口url                         

   obj_spider = SpiderMain()

   obj_spider.craw(root_url)   #启动爬虫                                                   

正在回答

1 回答

可能没有对齐,python对这个很看重的,你看下是否对齐

1 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
Python开发简单爬虫
  • 参与学习       227670    人
  • 解答问题       1219    个

本教程带您解开python爬虫这门神奇技术的面纱

进入课程

count = count + 1 为什么会报错???

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信