• Python进阶篇:Python简单爬虫


    目录

    • 前言
    • 要解决的问题
    • 设计方案
    • 代码说明
    • 小结

    前言

    前一段一直在打基础,已经学习了变量,流程控制,循环,函数这几块的知识点,就想通过写写小程序来实践一下,来加深知识点的记忆和理解。首先考虑的就是爬虫啦,一直很崇拜爬虫大师,特别想能够学习一些爬虫技术,去淘宝上爬爬数据,说不定什么时候可以使用数据进行一些分析,比如哪天自己也开了个小店啥的~~。为了能够开始起步, 我看了一些视频,查阅了一些资料,起步阶段就不用那些很牛逼的框架了,主要是想通过基本的爬虫来了解爬虫的基本概念和思路。

    要解决的问题

    查阅百度百科的某个关键词以及相关联的关键词的集合。这是一个比较有意义的事情,通过这样的数据能更好的理解相关的生态圈。比如我查阅“分布式计算”  http://baike.baidu.com/item/%E5%88%86%E5%B8%83%E5%BC%8F%E8%AE%A1%E7%AE%97/85448 文章里面含有很多的有链接的关键词,就这样不断的迭代去爬这些链接的关键词的文章内的关键词。

    设计方案

    爬虫含有5个组成部分:主程序,URL管理器,HTML下载器,HTML解析器,结果展示器

    主程序:调度其他的部件的执行,并作为主程序入口来执行代码

    URL管理器: 管理URL的集合以及状态 - 未下载的URL,已下载的URL,添加新的URL,去除已现在的URL

    HTML下载器: 下载URL对应的HTML

    HTML解析器: 解析下载下来的HTML,取出有用的数据

    结果展示器: 组织最终生成的数据,并展示或者存储起来

    代码说明

    • 代码组织架构

    •  代码展示
    部件名称 程序名称 代码
    主程序 SpiderMain.py
    from Spider import UrlManager,HtmlDownloader,HtmlParser,HtmlOutputer
    
    class Spider(object):
    
        def __init__(self):
            self.urlmanager = UrlManager.Manager()
            self.htmldownloader = HtmlDownloader.Downloader()
            self.htmlparser = HtmlParser.Parser()
            self.htmloutputer = HtmlOutputer.Outputer()
    
    
        def scrpy(self, root_url):
            self.urlmanager.add_new_urls(root_url)
            count = 1
            while(self.urlmanager.has_new_url()):
                if(count>10):
                    break
    
                curr_url = self.urlmanager.get_new_url()
                html_content = self.htmldownloader.load(curr_url)
                print("No.%d Downloading URL %s" % (count, curr_url))
                word,new_urls,lemmasummary = self.htmlparser.parse(curr_url,html_content)
                data={}
                data['word']=word
                data['curr_url']=curr_url
                data['lemmasummary']=lemmasummary
                self.htmloutputer.collect(data)
                self.urlmanager.add_new_urls(new_urls)
                count = count + 1
            self.htmloutputer.genhtml()
    
    
    
    if(__name__=='__main__'):
        root_url = "http://baike.baidu.com/item/%E5%88%86%E5%B8%83%E5%BC%8F%E8%AE%A1%E7%AE%97/85448"
        spider = Spider()
        spider.scrpy({root_url})
    URL管理器 UrlManager.py
    class Manager(object):
        def __init__(self):
            self.old_urls=set()
            self.new_urls=set()
    
        def add_new_urls(self, root_url):
            for url in root_url:
                if(root_url not in self.old_urls and  root_url not in self.new_urls):
                    self.new_urls.add(url)
    
        def has_new_url(self):
            if(len(self.new_urls) > 0):
                return True
            else:
                return False
    
        def get_new_url(self):
            tmp=self.new_urls.pop()
            self.old_urls.add(tmp)
            return tmp
    HTML下载器 HtmlDownloader.py
    import urllib.request
    
    class Downloader(object):
        def load(self, curr_url):
            html = urllib.request.urlopen(curr_url)
            return html.read().decode("UTF-8",'ignore')
    HTML解析器 HtmlParser.py
    import re
    from urllib.parse import urljoin
    from bs4 import BeautifulSoup
    
    class Parser(object):
        def __init__(self):
            self.title = ''
            self.urls = set()
            self.lemmasummary = ''
    
        def parse(self, curr_url, html_content):
            soup = BeautifulSoup(html_content, 'html.parser',from_encoding="utf-8")
            soupurls=soup.find_all('a',href=re.compile(r'/view'))
            for url in soupurls:
               self.urls.add(urljoin(curr_url,url['href']))
            self.title = soup.title.string.split("_")[0]
            self.lemmasummary = soup.find('div',class_='lemma-summary')
            return self.title,self.urls,self.lemmasummary
    结果展示器 HtmlOutputer.py
    class Outputer(object):
        def __init__(self):
            self.table = []
    
        def collect(self, data):
            self.table.append(data)
    
        def genhtml(self):
            html = open('result.html','w')
            html.write("<html>")
            html.write("<head>")
            html.write("</head>")
            html.write("<body>")
            html.write("<table>")
            for data in self.table:
                html.write("<tr>")
                html.write("<td>%s</td>" % data['word'])
                html.write("<td>%s</td>" % data['curr_url'])
                html.write("<td>%s</td>" % data['lemmasummary'])
                html.write("</tr>")
            html.write("</table>")
            html.write("</body>")
            html.write("</html>")
            html.close()

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    •  最终的结果

     

    小结

    在上面的爬虫代码里面,主要体现了爬虫的几个部件之间的配合,以及每个部件的所引用的模块,比如urllib,bs4,re

     

  • 相关阅读:
    Easy UI form表单提交 IE浏览器不执行success ,以及 datagrid 展示过慢
    JS批量获取参数构建JSON参数对象
    Easy UI datebox控件无法正常赋值
    EasyUI控件combobox重复请求后台,dialog窗口数据异常
    后台Post/Get 请求接口 方式
    WebForm 页面ajax 请求后台页面 方法
    实现输入框小数多 自动进位展示,编辑时实际值不变
    页面获取Web控件ID不能正常获取,它惹得祸
    线性表的链式存储——单链表
    线性表
  • 原文地址:https://www.cnblogs.com/benchen/p/6111840.html
Copyright © 2020-2023  润新知