Python爬虫完整案例 - 爬取百度百科词条信息

2023-05-16

概述

一个完整的爬虫,一般由以下5个组件构成:

1.URL管理器

负责维护待爬取URL队列已爬取URL队列,必须拥有去重功能。

2.HTML下载器

负责根据调度器从URL管理器中取出的url,下载html页面数据

3.HTML解析器

负责解析HTML下载器下载的网页数据,从中提取新的url和目标数据,并将其返回

4.数据存储器

负责将HTML下载器返回的的数据保存到本地或数据库中

5.调度器

爬虫的核心组件。根据业务流程,调用其它组件完成数据抓取。

一般情况下,爬虫的入口URL在这里提供。


源码

首先,项目结构如下,每个组件使用一个模块文件


1.URL管理器

# !/usr/bin/env python
# -*- coding:utf-8 -*-


class UrlManager(object):
    """URL管理器"""

    def __init__(self):
        # 待爬去url集合
        self.new_urls=set()
        # 已爬取url集合
        self.old_urls=set()

    def new_urls_size(self):
        """获取新的url数量"""
        return len(self.new_urls)

    def old_urls_size(self):
        """获取已爬取url数量"""
        return len(self.old_urls)

    def has_new_url(self):
        """判断是否有新的url"""
        return self.new_urls_size()

    def get_new_url(self):
        """从待爬取url集合中获取一个url"""
        # 从未爬取url集合中取出并移除一个url
        new_url=self.new_urls.pop()
        # 将取出的url添加到已爬取url集合中
        self.old_urls.add(new_url)
        return new_url

    def add_new_url(self,url):
        """添加一个新的url到待爬取url集合中"""
        if url:
            self.new_urls.add(url)

    def add_new_urls(self,urls):
        """添加多个个新的url到待爬取url集合中"""
        if urls:
            for url in urls:
                self.add_new_url(url)

2.HTM下载器

# !/usr/bin/env python
# -*- coding:utf-8 -*-


import requests

class HtmlDownloader(object):
    """HTML下载器"""
    def download(self,url):
        if not url:
            return None

        headers={
            "User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36",
        }
        resp=requests.get(url,headers=headers,timeout=5)
        if resp.status_code==requests.codes.ok:
            resp.encoding='utf-8'
            return resp.text

3.HTML解析器

# !/usr/bin/env python
# -*- coding:utf-8 -*-

import urllib.parse
from lxml import etree

class HtmlParser(object):
    """HTML解析器"""
    def parse(self,url,html):
        html_et=etree.HTML(html)

        new_urls=self.__get_new_urls(url,html_et)
        new_data=self.__get_new_data(html_et)
        return new_urls,new_data

    def __get_new_urls(self,url,html_et):
        """提取当前词条页面下所有相关链接"""
        urls=[]
        link_list=html_et.xpath('//div[@class="main-content"]//a/@href')
        for link in link_list:
            if link.startswith('/item/'):
                urls.append(urllib.parse.urljoin(base=url,url=link))
        return urls

    def __get_new_data(self,html_et):
        """提取当前词条的摘要"""
        summary=[]
        text_list=html_et.xpath('//div[@class="lemma-summary"]//text()')
        for text in text_list:
            summary.append(text+'\n')
        return ''.join(summary)

4.数据存储器

# !/usr/bin/env python
# -*- coding:utf-8 -*-

import os
import codecs

class DataStore(object):
    """数据存储器"""
    def store(self,data):
        """将数据保存到本地文本文件中"""
        path='../../data'
        if not os.path.exists(path):
            os.makedirs(path)

        with codecs.open(filename=os.path.join(path,'python百科词条.txt'),mode='a',encoding='utf-8') as f:
            f.write(data+'\n')


5.调度器

# !/usr/bin/env python
# -*- coding:utf-8 -*-

"""
爬虫调度器
"""

import requests
import time

from urlmanager import UrlManager
from htmldownloader import HtmlDownloader
from htmlpaser import HtmlParser
from datastore import DataStore

class Scheduler(object):
    def __init__(self):
        """初始化各组件"""
        self.urlmanager=UrlManager()
        self.htmldownloader=HtmlDownloader()
        self.htmlparser=HtmlParser()
        self.datastore=DataStore()

    def crawl(self,start_url):
        try:
            # 添加起始url
            self.urlmanager.add_new_url(start_url)

            # 最多只爬取500个词条数据
            while self.urlmanager.old_urls_size()<500:
                time.sleep(0.5)

                # 从待爬取url集合中提取一条url
                url=self.urlmanager.get_new_url()

                if url:
                    # 使用HTML下载器下载网页
                    html=self.htmldownloader.download(url)

                    # 使用HTML解析器解析网页,提取url和摘要信息
                    new_urls,new_data=self.htmlparser.parse(url,html)

                    # 将新提取出的url添加到待爬取url集合中
                    self.urlmanager.add_new_urls(new_urls)

                    # 将提取出的摘要文本保存到本地文件中
                    self.datastore.store(new_data)

                    print('已爬取{}个词条'.format(self.urlmanager.old_urls_size()))
            else:
                print("爬取完成")

        except requests.RequestException as e:
            print('爬取失败',e)





if __name__ == '__main__':
    start_url='https://baike.baidu.com/item/Python/407313'
    scheduler=Scheduler()
    scheduler.crawl(start_url)

运行结果


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python爬虫完整案例 - 爬取百度百科词条信息 的相关文章

随机推荐

  • 阿里云生活物联网删除测试设备

    阿里云生活物联网平台 https living aliyun com 的测试设备 xff0c 在生活物联网平台页面是无法进行删除的 xff0c 生活物联网平台的设备列表只能显示量产设备 如果要删除测试设备 xff0c 必须在物联网平台 ht
  • STM32CubeMX学习教程之四:定时器中断

    完整源码下载 xff1a https github com simonliu009 STM32CubeMX TIM1 Interrupt 软件 xff1a STM32CubeMX V4 25 0 System Workbench V2 4
  • 算法——贝塞尔(Bézier)曲线拟合

    文章目录 1 基本概念 1 1 从熟悉的地方入手 1 2 贝塞尔曲线拟合原理 转载 2 公式和物理意义 2 0 阶数和伯恩斯坦多项式等 2 0 1 阶数 2 0 2 伯恩斯坦多项式 2 0 3 杨辉三角和二项式系数 2 1 一阶 次贝塞尔公
  • STM32CubeMX学习教程之五:PWM实现呼吸灯效果

    完整源码下载 xff1a https github com simonliu009 STM32CubeMX PWM Output 软件 xff1a STM32CubeMX V4 25 0 System Workbench V2 4 固件库版
  • STM32CubeMX学习教程之十:硬件I2C读写AT24C02

    完整源码下载 xff1a https github com simonliu009 STM32CubeMX hardware I2C AT24C02 网上有流传已久一种说法 xff0c 就是STM的I2C有bug xff0c 不好用 确实很
  • Visual Studio Code 的 includePath 全局设置

    这几天折腾使用Visual Studio Code 编写 ESP8266 non os 代码 xff0c 基本设置都没问题 xff0c 但是就是自动补全折腾很久没弄好 在折腾了一圈插件之后 xff08 包括Auto Import C 43
  • 使用.gitignore忽略文件或者文件夹及其失效解决方法

    git如果需要忽略某个文件夹 xff0c 可以在初始化之后 xff0c 在仓库根目录下创建一个 gitignore文件 xff0c 添加需要忽略的文件和文件夹即可 我们也不需要从头写 gitignore文件 xff0c GitHub已经为我
  • python源代码文件加密

    由于python设计的初衷是开源的 xff0c 因此py文件是可以直接看到源码的 但开发商业软件 xff0c 代码加密保护就比较重要了 python编译后程序 pyc文件是py文件经过编译后生成的二进制文件 xff0c 因此可以发布pyc文
  • gnu binutils

    The GNU Binutils are a collection of binary tools The main ones are ld the GNU linker as the GNU assembler But they also
  • android wakelock

    1 android休眠控制锁 powermanager acquir 获取控制锁 powermanager release 释放控制锁 2 在powerManagerService中 xff0c 有检测当前framework层中的wakel
  • 产品经理常用术语

    产品经理常用术语 长尾理论 网络时代兴起的一种新理论 xff0c 由于成本和效率的因素 xff0c 当商品储存流通展示的场地和渠道足够宽广 xff0c 商品生产成本急剧下降以至于个人都可以进行生产 xff0c 并且商品的销售成本急剧降低时
  • 传统CD车机面板操作说明

    转自http bbs hifidiy net thread 675597 1 1 html 一般CD车机带USB SD卡的面板操作说明 1 1 控制面板外观图 2 0 基本 共同 功能操作说明 2 1 开启和关闭电源 静音开关 按 钮为开启
  • 汽车总线系统通信协议

    天合汽车零部件 xff08 上海 xff09 有限公司 上海交通大学区域光纤通信网与新型光通信系统国家重点实验室 xff08 上网时间 xff1a 2006 11 xff09 摘要 xff1a 本文主要针对汽车电子控制系统和车载多媒体系统
  • 算法——连续性后处理(把26邻域连续的变成6邻域连续的)

    文章目录 1 概念 1 1 6邻域连续 1 2 18邻域连续 1 3 26邻域连续 1 4 总结 2 目标 3 严格一点的 3 1 原理描述 3 1 1 18邻域连续补充 3 1 2 26邻域连续补充 3 2 代码实现 C 4 宽松一点的
  • RedHat Linux下安装JDK1.7报错Permission denied

    在RedHat Linux5 中安装JDK1 7时 xff0c 当我解压jdk xff0c 并且配置好了环境变量 xff0c 测试的时候 xff0c 报以下错误 root 64 jingfeng01 java version Error d
  • 几种压缩算法的压缩和速度比较

    Quick Benchmark Gzip vs Bzip2 vs LZMA vs XZ vs LZ4 vs LZO EDIT Add zstd Contents hide 1 Selected archives2 Test conditio
  • DDR低功耗模式

    DDR规格 xff1a DDR工作状态图 xff1a DDR 刷新描述 xff1a 电特性 xff1a 工作模式简介 xff1a 1 1 自刷新模式 xff08 Self Refresh Mode xff09 DDR4 SDRAM中自刷新超
  • 嵌入式Linux的低功耗策略

    引 言 由于Linux系统具备嵌入式操作系统需要的很多特色 xff0c 如适应于多种CPU和多种硬件平台 性能稳定 可裁剪性很好 源码开放 研发和使用简单等 现在 xff0c 基于Linux应用的嵌入式设备日益增多 xff0c Linux正
  • libevent实现的HTTP Server

    在使用C语言编码时 有时候需要实现一个HTTP接口 我们可以选择使用libevent库来实现 以下代码演示了使用libevent 并同时支持多线程处理HTTP的请求 头文件 引入的头文件 span class token macro pro
  • Python爬虫完整案例 - 爬取百度百科词条信息

    概述 一个完整的爬虫 xff0c 一般由以下5个组件构成 1 URL管理器 负责维护待爬取URL队列 和已爬取URL队列 xff0c 必须拥有去重功能 2 HTML下载器 负责根据调度器从URL管理器中取出的url xff0c 下载html