运维学python之爬虫中级篇(六)基础爬虫,,通过这么多天对爬虫的-百姓标王

运维学python之爬虫中级篇(六)基础爬虫,,通过这么多天对爬虫的


通过这么多天对爬虫的介绍, 我们对爬虫也有所了解,今天我们将引入一个简单爬虫的技术架构,解释爬虫技术架构中的几个模块,后面的爬虫也多是今天架构的延伸,只不过这个架构是简单的实现,对优化、爬取方式等不是很完善,主要为了方便大家对爬虫的理解和后面的编程。

1 基础架构和流程

简单的爬虫架构由以下几部分构成:
爬虫调度器:总体协调其它几个模块的工作
URL管理器:负责管理URL,维护已经爬取的URL集合和未爬取的URL集合
网页下载器:对未爬取的URL下载
网页解析器:解析已下载的html,并从中提取新的URL交给URL管理器,数据交给存储器处理
数据存储器:将html解析出来的数据进行存取
架构图如下:
技术分享图片
爬虫流程图如下:
技术分享图片
下面我们就分别按每个部分来拆分。
我们本次就拿百科搜索词条来演示,爬取百科内容标题和摘要信息,同时如果摘要中有链接,还会把连接的标题摘要下载下来。如下图:
技术分享图片

2 URL管理器

基本功能:

判断是否有待爬取的url添加新的url到待爬取url集合中获取未爬取的url获取待爬取集合大小获取已爬取集合大小将爬取完成的url从待爬取url集合移动到已爬取url集合。

这里URL管理器还要用到set去重功能,防止程序进入死循环。大型互联网公司,由于缓存数据库的高性能,一般把url存储在缓存数据库中。小型公司,一般把url存储在内存中,如果想要永久存储,则存储到关系数据库中。
URL管理器代码

# -*- coding: utf-8 -*-class UrlManager:    """    URL管理器类    """    def __init__(self):        """        初始化未爬取集合new_urls和已爬取集合old_urls        """        # python的set和其他语言类似, 是一个无序不重复元素集        self.new_urls = set()        self.old_urls = set()    def has_new_url(self):        """        判断是否有未爬取的url        :return:        """        return self.new_url_size() != 0    def get_new_url(self):        """        获取未爬取的url        :return:        """        new_url = self.new_urls.pop()        self.old_urls.add(new_url)        return new_url    def add_new_url(self, url):        """        将新的url添加到未爬取的url集合中        :return:        """        if url is None:            return        # 判断url是否在new_urls或old_urls中        if url not in self.new_urls and url not in self.old_urls:            self.new_urls.add(url)    def add_new_urls(self, urls):        """        添加新的url到未爬取集合        :param urls: url集合        :return:        """        if urls is None or len(urls) == 0:            return        # 循环将获取的url存入new_urls中        for url in urls:           self.add_new_url(url)    def new_url_size(self):        """        获取未爬取集合大小        :return:        """        return len(self.new_urls)    def old_url_size(self):        """        获取已爬取集合大小        :return:        """        return len(self.old_urls)

HTML下载器
HTML下载器就比较简单了,只是通过requests获取html内容即可(注意:要用到session,不然会报 TooManyRedirects 异常),具体看代码:

# -*- coding: utf-8 -*-import requestsclass HtmlDownload:    """    HTML下载器类    """    def download(self, url):        """        下载html        :param url:根据url下载html内容        :return: 返回html        """        # 创建session对象,这里一定要用session,不然会报TooManyRedirects异常        s = requests.session()        # 添加头部信息        s.headers[‘User-Agent‘] = ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0‘        # 获取内容        resp = s.get(url)        # 要以content字节形式返回        return resp.content.decode()

HTML解析器
先来分析要爬取的网页:
技术分享图片
通过上面分析可以看到,我们需要的标题在<dd class="lemmaWgt-lemmaTitle-title">标签中,摘要信息在<div class="para" label-module="para">标签中,其中<div class="para" label-module="para">标签中的a标签的herf是我们需要继续爬取的相对url通过上面分析可以看到,我们需要的标题在<dd class="lemmaWgt-lemmaTitle-title">标签中,摘要信息在<div class="para" label-module="para">标签中,其中<div class="para" label-module="para">标签中的a标签的herf是我们需要继续爬取的相对url。

# -*- coding: utf-8 -*-from bs4 import BeautifulSoupclass HtmlParse:    """    HTML解析器类    """    def __init__(self, baseurl=‘https://baike.baidu.com‘):        """        初始化基础url        :param baseurl:基础url        """        self.baseurl = baseurl    def parse_data(self, page):        """        获取网页数据        :param page:获取的html        :return:解析后要存储的数据        """        # 创建实例        soup = BeautifulSoup(page, ‘lxml‘)        # 获取标题        title = soup.find(‘dd‘, class_=‘lemmaWgt-lemmaTitle-title‘).find(‘h1‘).string        # 获取摘要        summary = soup.find(‘div‘, class_=‘para‘).text        # 完整的数据信息        data = title + summary        return data    def parse_url(self, page):        """        获取网页url        :param page:获取的html        :return:解析后获取的新url        """        # 创建实例        soup = BeautifulSoup(page, ‘lxml‘)        # 所有的<div class="para" label-module="para">中a标签        anodes = soup.find(‘div‘, class_=‘para‘).find_all(‘a‘)        # new_url set集        new_urls = set()        # 循环获取相对路径(href),与baseurl拼成全url        for anode in anodes:            link = anode.get(‘href‘)            # 完整路径            fullurl = self.baseurl + link            # 添加到未爬取集合new_urls中            new_urls.add(fullurl)        return new_urls

数据存储器
解析出来的数据就直接追加保存到文件就可以了。

# -*- coding: utf-8 -*-class DataStore:    """    数据存储器类    """    def store_data(self, data, name=‘baike.txt‘):        """        将获取的数据存储到文件中        :param data: 解析的数据        :param name: 本地文件名        :return:         """        with open(name, ‘a‘, encoding=‘utf-8‘) as fp:            fp.write(‘\r\n‘)            fp.write(data)

爬虫调度器
爬虫调度器主要负责以上几个模块的调度

# -*- coding: utf-8 -*-# 导入各个模块from spider.Datastore import DataStorefrom spider.Htmldownload import HtmlDownloadfrom spider.Htmlparse import HtmlParsefrom spider.Urlmanager import UrlManagerclass SpiderMain:    """    爬虫调度器类    """    def __init__(self):        """        初始化各模块        """        self.manager = UrlManager()        self.download = HtmlDownload()        self.parse = HtmlParse()        self.output = DataStore()    def spider(self, url):        """        爬虫主程序        :param url:初始url        :return:        """        # 添加初始url到未爬取的new_urls中        self.manager.add_new_url(url)        # 通过while循环获取是否还有新的url要爬取,爬取了5条就结束,防止死循环下去        while self.manager.has_new_url() and self.manager.old_url_size() < 5:            try:                # 获取url                new_url = self.manager.get_new_url()                # 获取html                html = self.download.download(new_url)                # 解析后的新url                new_urls = self.parse.parse_url(html)                # 解析后要存储的数据                data = self.parse.parse_data(html)                # 添加解析后的新url到new_urls集中                self.manager.add_new_urls(new_urls)                # 保存数据                self.output.store_data(data)                print(‘已经抓取%s 个链接‘ % self.manager.old_url_size())            except Exception as e:                print(‘failed‘)                print(e)if __name__ == ‘__main__‘:    # 实例化爬虫调度器类    spidermain = SpiderMain()    # 输入初始url进行爬取    spidermain.spider(‘https://baike.baidu.com/item/%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB‘)

运行结果(只爬取了5条):

已经抓取1 个链接已经抓取2 个链接已经抓取3 个链接已经抓取4 个链接已经抓取5 个链接

好,今天的爬虫基础框架,就到这里了。
本文部分参考:范传辉 python爬虫开发与项目实战

运维学python之爬虫中级篇(六)基础爬虫

评论关闭

相关内容推荐

提升网站收录的优化方法长春网站优化方案房地产门户网站如何优化枣强县网站优化公司关于seo网站优化网站常见的优化思路遂宁网站优化推广铜仁网站优化多少钱个人怎么优化网站关键词梧州网站优化电池红古区网站seo优化排名临河区网站seo优化排名优化排名网站很简单易速达韶关网站优化哪家好晋州市网站优化巩义网站优化推广哪家专业南海网站优化排名武安网站seo优化胶南网站优化代理商黑河网站推广优化网站上线基础优化南通网站优化排名云南营销型网站优化方案微商的优化网站广州网站排名优化哪家强教育类的网站优化优化网站方法强推云速捷安全百度优化网站怎么排名网站优化怎么提高体验汕头企业网站关键词优化工具长宁区官方网站优化平台江苏品牌网站设计优化价格网站用户体验优化的方法商城网站优化知识湖口网站关键词优化栖霞集团网站优化网站建设优化志云速捷一流专业的网站优化霸屏南海网站关键词优化中国外贸网站优化深圳高端网站优化最好的方法石家庄优化网站关键词招聘网站如何优化好的网站核心词优化公司长春网站排名优化报价门窗网站seo优化费用霍邱县网站seo优化排名海淀网站搜索优化珠海口碑好的销售行业网站优化南宁专业seo优化网站公司网站优化seo学习宁夏网站目标关键词优化网站排名优化俅云速捷独尊汝州网站怎么优化菏泽优化网站东源网站优化高新网站优化推广遵义市网站seo优化排名企业网站优化湖南岚鸿普陀区网站优化价格网站优化软件哪个好排名盐城专业网站seo优化价格下城区网站优化推广莆田公司网站优化铜陵网站优化如何做影视网站优化案例温州专业seo网站优化报价大邑县网站排名优化青神县网站seo优化排名湘潭做网站优化六安衡水网站优化哪家好安居客网站搜索引擎优化网站优化推广如何选择网站公告优化价格表淮滨网站优化建平县网站seo优化排名商城网站seo优化方案网站怎么优化选取火10星封开企业网站seo优化优化网站怎么排到百度首页网站建设优化引领云速捷咨询品牌网站seo优化渠道漯河网站优化seo推广服务响水网站优化找哪家好惠州网站优化公司哪家好沧州网站怎么优化呢如何给自己的网站做优化照片优化大师官方网站华为网站的优化是什么样机电网站seo优化怎么做阜宁网站推广优化优化政府网站南通整站优化网站南充科技企业网站优化银川网站怎么优化优化公司网站可信火24星到射阳网站优化排名方案天宁区常州网站优化厂家昆明网站优化哪家在做网站关键词标题优化攻略网站排名优化分金手指排名二玉林网站优化价格桂阳优化网站网站推广优化哪家好可信赖的百度网站优化网站建设优化首选火28星口碑好的服装行业网站优化费用优化公司网站东云速捷跟进网站优化策划案深州市网站seo优化排名唐山网站优化推荐大连优化推广网站广西网站优化哪些方面郁南网站优化阳江企业网站seo优化醴陵百度网站优化瑞金网站搜索引擎优化顺义网站关键字优化姑苏网站优化推广找哪家湖南清镇网站优化长春怎么做网站优化枣强县网站seo优化排名自己网站如何优化关键词网站的优化关键词网站优化嘉兴哪家好网站搜索优化出色火4星完美网站seo优化公司销售优化网站方法选金手指18网站seo优化首页排名长沙网站优化加盟优化网站电视剧素材泰和县网站优化建设网站优化课程报告清远资深的免费网站优化微商的优化网站廊坊出名的网站品牌优化网站推广优化方案公司做电影站的网站优化朝阳网站排名优化建设网优宝网站优化西宁网站优化推广营销怎么做网站不更新文章 如何做好优化网站优化建设扬州福田有哪些网站优化互联网推广网站排名优化购买房山专业网站优化外包网站整站优化衤光荣 金手指个人建网站做优化甘肃网站优化哪个好东莞网站优化服务公司从细节入手做好seo网站优化张家口优化网站商丘优化网站排名选哪家韶关本地的免费网站优化福田信息类网站优化成功案例网站seo人工优化方式有哪些网络网站排名优化彭泽网站关键词优化奶茶店加盟网站优化传播湖北正规的网站seo推广优化通化怎么优化网站杭州江干区seo网站排名优化网页结构优化对网站的影响焦作网站优化哪家靠谱无锡网站整站优化口碑好的网站seo优化怎么做湖北网站优化方法网站优化实践总结东台网站seo优化越秀网站优化推广公司如何优化网站复云速捷共有临夏网站优化推广怎么做湖南清镇网站优化杭州上城区seo网站优化福州优化网站公司含山网站优化公司南阳seo网站排名优化高州优化网站利于菠菜优化网站模板湖州网站排名优化泰安有网站优化吗seo网站优化基础知识seo网站排名优化软网站优化知识从哪里开始网站优化有潜规吗优化网站方法值得易速达电商网站ab测试优化湛江正规网站优化seo价格思南网站优化公司抚州网站综合优化赤峰网站优化关键词网站优化seo方案计划书cms优化网站黄山网站优化排名平台哪家好枣庄优化网站怎么样洛阳网站建设优化推广公司鞍山网站优化价格大沥网站优化学习莱阳网站优化方案高权重网站如何优化

合作伙伴

百姓标王

龙岗网络公司
深圳网站优化
龙岗网站建设
坪山网站建设
百度标王推广
天下网标王
SEO优化按天计费
SEO按天计费系统