Python开发简单爬虫

Python开发简单爬虫

         源码网址:  http://download.csdn.NET/detail/hanchaobiao/9860671

目前成都创新互联已为成百上千的企业提供了网站建设、域名、网络空间、网站托管、企业网站设计、杭州网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

一、爬虫的简介及爬虫技术价值

       1.什么是爬虫:

         一段自动抓取互联网信息的程序,可以从一个URL出发,访问它所关联的URL,提取我们所需要的数据。也就是说爬虫是自动访问互联网并提取数据的程序。

Python开发简单爬虫

            入口:http://baike.baidu.com/item/Python

           分析URL格式:防止访问无用路径 http://baike.baidu.com/item/{标题}

           数据:抓取百度百科相关Python词条网页的标题和简介

                       通过审查元素得标题元素为 :class="lemmaWgt-lemmaTitle-title"

                       简介元素为:class="lemma-summary"

            页面编码:UTF-8

            作为定向爬虫网站要根据爬虫的内容升级而升级如运行出错可能为百度百科升级,此时则需要重新分析目标

            代码集注释:

            创建spider_main.py

[python] view plain copy

  1. #创建类  

  2. from imooc.baike_spider import url_manager,html_downloader,html_output,html_parser  

  3. class spiderMain:  

  4.     #构造函数 初始化  

  5.     def __init__(self):  

  6.         #实例化需引用的对象  

  7.         self.urls = url_manager.UrlManager()  

  8.         self.downloader = html_downloader.HtmlDownLoader()  

  9.         self.output = html_output.HtmlOutPut()  

  10.         self.parser = html_parser.HtmlParser()  

  11.   

  12.     def craw(self,root_url):  

  13.         #添加一个到url中  

  14.         self.urls.add_new_url(root_url)  

  15.         count = 1  

  16.         while self.urls.has_new_url():  

  17.             try:  

  18.                 new_url = self.urls.get_new_url()  

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

  20.                 #下载  

  21.                 html_context = self.downloader.downloade(new_url)  

  22.                 new_urls,new_data = self.parser.parse(new_url,html_context)  

  23.                 print(new_urls)  

  24.                 self.urls.add_new_urls(new_urls)  

  25.                 self.output.collect_data(new_data)  

  26.                 #爬一千个界面  

  27.                 if(count==1000):  

  28.                     break  

  29.                 count+=1  

  30.             except:  

  31.                 print("craw faile")  

  32.         self.output.output_html()  

  33.   

  34.   

  35. #创建main方法  

  36. if __name__ == "__main__":  

  37.     root_url = "http://baike.baidu.com/item/Python"  

  38.     obj_spider = spiderMain()  

  39.     obj_spider.craw(root_url)  


     创建url_manager.py

[python] view plain copy

  1. class UrlManager:  

  2.     'url管理类'  

  3.     #构造函数初始化set集合  

  4.     def __init__(self):  

  5.         self.new_urls = set() #待爬取的url  

  6.         self.old_urls = set() #已爬取的url  

  7.   

  8.     #向管理器中添加一个新的url  

  9.     def add_new_url(self,root_url):  

  10.         if(root_url is None):  

  11.             return  

  12.         if(root_url not in self.new_urls and root_url not in self.old_urls):  

  13.             #既不在待爬取的url也不在已爬取的url中,是一个全新的url,因此将其添加到new_urls  

  14.             self.new_urls.add(root_url)  

  15.   

  16.     # 向管理器中添加批量新的url  

  17.     def add_new_urls(self,urls):  

  18.         if(urls is None or len(urls) == 0):  

  19.             return  

  20.         for url in urls:  

  21.             self.add_new_url(url) #调用add_new_url()  

  22.   

  23.     #判断是否有新的待爬取的url  

  24.     def has_new_url(self):  

  25.         return len(self.new_urls) != 0  

  26.     #获取一个待爬取的url  

  27.     def get_new_url(self):  

  28.         new_url = self.new_urls.pop()  

  29.         self.old_urls.add(new_url)  

  30.         return new_url  


    创建html_downloader.py

[python] view plain copy from urllib import request  from urllib.parse import quote  import string  class HtmlDownLoader:      '下载页面内容'      def downloade(self,new_url):          if(new_url is None):              return None          #解决请求路径中含义中文或特殊字符          url_ = quote(new_url, safe=string.printable);          response = request.urlopen(url_)          if(response.getcode()!=200):              return None #请求失败          html = response.read()          return html.decode("utf8")

       创建html_parser.py

[python] view plain copy

  1. from bs4 import BeautifulSoup  

  2. import re  

  3. from urllib import parse  

  4. class HtmlParser:  

  5.     #page_url 基本url 需拼接部分  

  6.     def _get_new_urls(self,page_url,soup):  

  7.         new_urls = set()  

  8.         #匹配 /item/%E8%87%AA%E7%94%B1%E8%BD%AF%E4%BB%B6  

  9.         links = soup.find_all('a',href=re.compile(r'/item/\w+'))  

  10.         for link in links:  

  11.             new_url = link["href"]  

  12.             #例如page_url=http://baike.baidu.com/item/Python new_url=/item/史记·2016?fr=navbar  

  13.             #则使用parse.urljoin(page_url,new_url)后 new_full_url = http://baike.baidu.com/item/史记·2016?fr=navbar  

  14.             new_full_url = parse.urljoin(page_url,new_url)  

  15.             new_urls.add(new_full_url)  

  16.         return new_urls  

  17.   

  18.     def _get_new_data(self,page_url,soup):  

  19.         # 

    Python

      

  20.         red_data = {}  

  21.         red_data['url'] = page_url  

  22.         title_node = soup.find('dd',class_="lemmaWgt-lemmaTitle-title").find('h2') #获取标题内容  

  23.         red_data['title'] = title_node.get_text()  

  24.         #  

  25.         summary_node = soup.find('div',class_="lemma-summary")  

  26.         red_data['summary'] = summary_node.get_text()  

  27.         return red_data  

  28.   

  29.   

  30.   

  31.     #new_url路径 html_context界面内容  

  32.     def parse(self,page_url, html_context):  

  33.         if(page_url is None or html_context is None):  

  34.             return  

  35.         #python3缺省的编码是unicode, 再在from_encoding设置为utf8, 会被忽视掉,去掉【from_encoding = "utf-8"】这一个好了  

  36.         soup = BeautifulSoup(html_context, "html.parser")  

  37.         new_urls = self._get_new_urls(page_url, soup)  

  38.         new_data = self._get_new_data(page_url, soup)  

  39.         return new_urls,new_data  

       创建html_output.py

[python] view plain copy

  1. class HtmlOutPut:  

  2.     def __init__(self):  

  3.         self.datas = [] #存放搜集的数据  

  4.     def collect_data(self,new_data):  

  5.         if(new_data is None):  

  6.             return  

  7.         self.datas.append(new_data)  

  8.   

  9.     def output_html(self):  

  10.         fout = open('output.html','w',encoding='utf8')  #写入文件 防止中文乱码  

  11.         fout.write('\n')  

  12.         fout.write('\n')  

  13.         fout.write('

    \n')  

  14.         for data in self.datas:  

  15.             fout.write('

  16. \n')  

  17.             fout.write('

  18. \n'%data['url'])  

  19.             fout.write('

  20. \n'%data['title'])  

  21.             fout.write('

  22. \n'%data['summary'])  

  23.             fout.write('

  24. \n')  

  25.         fout.write('

  26. %s%s%s
    \n')  

  27.         fout.write('\n')  

  28.         fout.write('\n')  

  29.         fout.close()  


视频网站:http://www.imooc.com/learn/563

源码网址:http://download.csdn.Net/detail/hanchaobiao/9860671


分享标题:Python开发简单爬虫
转载源于:http://scyanting.com/article/gjooge.html