[手写爬虫框架],从回忆Python到爬虫原理解析

手写爬虫框架,又名:手写爬虫框架的第1天

  1. 数据存储(无数据库版)
    • HTML正文抽取
    • 多媒体文件抽取
    • Email提醒
  2. 实战项目:基础爬虫
    • 基础爬虫架构及运行流程
    • URL管理器
    • HTML下载器
    • HTML解析器
    • 数据存储器
    • 爬虫调度器

从爬虫底层 —> 分布式爬虫, 企业级大数据融合, 个人应用场景总有一个适合你, 动动你的小手。 点上关注,方便每天阅读

一键三连是我最大的动力。谢谢~~

1. 回顾Python编程

  • 安装Python
    • 概念: 安装Python解释器,使您可以在计算机上运行Python程序。
    • 场景: 当您开始学习Python编程或需要在新的计算机上配置Python开发环境时,这个概念很重要。
    • 示例代码: 安装Python的示例代码可以是安装Python的命令或链接到Python官方下载页面的代码。
  • 搭建开发环境
    • 概念: 配置开发环境包括设置编辑器、虚拟环境和必要的工具,以便更有效地编写和运行Python代码。
    • 场景: 开发者通常需要在自己的计算机上配置适当的开发环境,以便顺利进行Python编程工作。
    • 示例代码: 创建虚拟环境、安装依赖库和编辑器配置等示例。
  • IO编程
    • 概念: IO编程涉及输入和输出操作,包括文件读写、控制台输入和输出等。
    • 场景: 当您需要处理文件、读取用户输入或将输出写入文件时,IO编程是必不可少的。
    • 示例代码: 读取文件、写入文件、从控制台获取用户输入等IO操作的示例。
  • 进程和线程
    • 概念: 进程和线程是多任务处理的方式。进程是独立的执行单元,线程是在进程内部运行的轻量级执行单元。
    • 场景: 在需要同时执行多个任务或并行处理时,了解进程和线程的概念非常重要。
    • 示例代码: 创建进程、创建线程、进程间通信、线程同步等多任务处理的示例。
  • 网络编程
    • 概念: 网络编程涉及使用Python编写网络应用程序,包括服务器和客户端应用程序,以进行网络通信。
    • 场景: 在构建网络应用程序、实现网络通信或访问网络资源时,网络编程是必需的。
    • 示例代码: 创建简单的网络服务器和客户端、HTTP请求、Socket编程等网络编程示例。

2. Web前端基础

  • W3C标准
    • 概念: W3C标准是由万维网联盟制定的互联网标准,用于确保Web文档的一致性和互操作性。
    • 场景: Web开发者需要了解W3C标准以确保网页在不同浏览器和设备上的正确渲染。
    • 示例代码: 无代码示例,但可以涉及HTML和CSS的示例,以遵循W3C标准。
  • HTTP标准
    • 概念: HTTP(超文本传输协议)是用于在Web上传输数据的协议,包括HTTP请求和HTTP响应。
    • 场景: Web开发者需要理解HTTP协议以构建和维护Web应用程序。
    • 示例代码: 发送HTTP请求、处理HTTP响应和创建RESTful API等HTTP相关示例。

3. 初识网络爬虫

  • 网络爬虫概述
    • 概念: 网络爬虫是自动抓取和提取网页信息的程序,用于获取数据并进行分析。
    • 场景: 网络爬虫在数据采集、搜索引擎、价格比较等应用中有广泛的用途。
    • 示例代码: 基本的网络爬虫示例,例如抓取网页内容。
  • HTTP请求的Python实现
    • 概念: 使用Python编写HTTP请求代码,可以实现向Web服务器发送请求以获取网页内容。
    • 场景: 在网络爬虫中,您需要了解如何使用Python发送HTTP请求以获取需要的数据。
    • 示例代码: 使用Python发送GET和POST请求的示例代码。

希望以上解释、场景说明和示例代码对您有所帮助,如果您需要更详细的示例代码或其他问题,请随时提出。


1. 如何安装 Python,进行步骤说明:

安装Python非常简单,以下是安装Python的一般步骤:

步骤 1:访问Python官方网站
首先,打开您的Web浏览器,并访问Python的官方网站。官方网站地址为:https://www.python.org/

步骤 2:下载Python安装程序
在官方网站上,您会看到一个大的“Downloads”按钮。点击这个按钮,它将带您到Python的下载页面。

步骤 3:选择Python版本
Python有多个版本可供选择,通常有Python 3.x和Python 2.x。推荐选择最新的Python 3.x版本。点击下载按钮,选择您操作系统对应的安装程序。

步骤 4:运行安装程序
一旦下载完成,运行安装程序。在Windows上,双击下载的安装程序文件并按照提示进行安装。在Linux或macOS上,打开终端,进入下载文件所在的目录,运行以下命令:

python3 -m venv myenv

这将创建一个虚拟环境,以隔离Python环境。

步骤 5:完成安装
按照安装程序的提示,完成Python的安装。安装完成后,您可以在命令行中输入以下命令来验证Python是否成功安装:

python --version

现在,您已成功安装Python并可以开始编写Python代码了。

2. 介绍 Python 的基础语法,及其示例:

Python的基础语法非常简单和易于学习。以下是一些Python基础语法的示例:

  • 变量和数据类型:
# 定义变量
name = "John"
age = 30
height = 5.9

# 数据类型示例
text = "Hello, World!"  # 字符串
num = 42                # 整数
pi = 3.14159265         # 浮点数

  • 条件语句(if语句):
# 判断条件
if age < 18:
    print("未成年")
elif age >= 18 and age < 65:
    print("成年")
else:
    print("退休年龄")

  • 循环(for循环):
# 循环示例
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
    print(fruit)

  • 函数定义和调用:
# 函数定义
def greet(name):
    return "Hello, " + name

# 函数调用
message = greet("Alice")
print(message)

这些示例覆盖了Python的基础语法元素,包括变量、数据类型、条件语句、循环和函数

3. 中级Python 回忆

  1. 列表(List):

    • 概念: 列表是Python中的有序可变序列,可以包含不同类型的元素。
    • 示例代码: 创建列表、访问元素、添加和删除元素、列表切片等示例。
    my_list = [1, 2, 3, "apple", "banana"]
    print(my_list[0])          # 访问元素
    my_list.append("cherry")   # 添加元素
    del my_list[3]             # 删除元素
    
    
  2. 字典(Dictionary):

    • 概念: 字典是Python中的无序键值对集合,用于存储相关数据。
    • 示例代码: 创建字典、访问和修改键值对、遍历字典等示例。
    my_dict = {"name": "John", "age": 30, "city": "New York"}
    print(my_dict["name"])       # 访问值
    my_dict["age"] = 31          # 修改值
    for key, value in my_dict.items():
        print(key, value)
    
    
  3. 模块和包(Modules and Packages):

    • 概念: Python的模块是代码组织的方式,而包是一组相关模块的集合。
    • 示例代码: 导入模块、使用模块中的函数和变量、创建和使用包等示例。
    import math
    print(math.sqrt(25))   # 使用math模块的函数
    
    
  4. 异常处理(Exception Handling):

    • 概念: 异常处理用于处理程序运行时可能出现的错误,以避免程序崩溃。
    • 示例代码: 使用try-except语句捕获和处理异常。
    try:
        result = 10 / 0
    except ZeroDivisionError as e:
        print("发生除零错误:", e)
    
    
  5. 面向对象编程(Object-Oriented Programming,OOP):

    • 概念: 面向对象编程是Python的一种编程范式,它允许您创建和操作对象。
    • 示例代码: 创建类和对象、定义方法、继承等示例。
    class Person:
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def greet(self):
            return f"Hello, my name is {self.name} and I am {self.age} years old."
    
    person = Person("Alice", 25)
    print(person.greet())
    
    

这些知识点覆盖了Python的一些重要方面,包括数据结构、模块、异常处理和面向对象编程。如果您需要更多关于特定知识点的详细信息或示例,请随时提出具体的问题。我将继续为您提供详细解释和示例代码。

4. 回忆 高级 Python

  1. 生成器(Generators):

    • 概念: 生成器是一种特殊类型的迭代器,可以逐个产生值,而不是一次性生成所有值。
    • 场景: 当您需要处理大量数据,但又不想一次性加载所有数据到内存中时,生成器非常有用。
    • 示例代码: 创建生成器函数、使用yield关键字、迭代生成器等示例。
    def read_large_file(file_path):
        with open(file_path, 'r') as file:
            for line in file:
                yield line
    
    for line in read_large_file('large_data.txt'):
        process_line(line)
    
    
  2. 装饰器(Decorators):

    • 概念: 装饰器是Python中用于修改函数或类行为的强大工具,通常用于日志记录、授权、性能测量等。
    • 场景: 当您希望在不修改原始函数代码的情况下,添加额外的功能或逻辑时,可以使用装饰器。
    • 示例代码: 创建和使用装饰器函数,将装饰器应用于函数或方法等示例。
    def log_function_call(func):
        def wrapper(*args, **kwargs):
            print(f"Calling {func.__name__} with arguments {args}, {kwargs}")
            result = func(*args, **kwargs)
            print(f"{func.__name__} returned {result}")
            return result
        return wrapper
    
    @log_function_call
    def add(a, b):
        return a + b
    
    
  3. 多线程和多进程编程:

    • 概念: 并发编程涉及同时执行多个任务,了解如何使用多线程和多进程来实现并发。
    • 场景: 当您需要加速计算或同时处理多个任务时,多线程和多进程是有用的。
    • 示例代码: 创建多线程、多进程、线程同步和进程间通信等示例。
    import threading
    import multiprocessing
    
    def print_numbers():
        for i in range(1, 6):
            print(f"Number {i}")
    
    def print_letters():
        for letter in 'abcde':
            print(f"Letter {letter}")
    
    # 多线程示例
    thread1 = threading.Thread(target=print_numbers)
    thread2 = threading.Thread(target=print_letters)
    thread1.start()
    thread2.start()
    
    
  4. 异步编程(Asynchronous Programming):

    • 概念: 异步编程用于处理非阻塞的I/O操作,以提高应用程序性能。
    • 场景: 当您需要处理大量的I/O操作,如网络请求或文件读写时,异步编程可以提高效率。
    • 示例代码: 使用asyncio库创建异步函数、协程、异步I/O操作等示例。
    import asyncio
    
    async def fetch_url(url):
        print(f"Fetching {url}")
        await asyncio.sleep(2)
        print(f"Received data from {url}")
    
    async def main():
        await asyncio.gather(
            fetch_url("<https://example.com>"),
            fetch_url("<https://google.com>"),
            fetch_url("<https://github.com>")
        )
    
    asyncio.run(main())
    
    
  5. 数据库连接和操作:

    • 概念: Python可以与各种数据库进行连接和操作,包括SQLite、MySQL、PostgreSQL等。
    • 场景: 当您需要存储和检索大量数据时,与数据库的交互是必要的。
    • 示例代码: 使用数据库库连接数据库、执行查询、插入、更新和删除数据等示例。
    import sqlite3
    
    conn = sqlite3.connect('mydb.db')
    cursor = conn.cursor()
    
    # 创建表
    cursor.execute('''CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)''')
    
    # 插入数据
    cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Alice', 30))
    
    # 查询数据
    cursor.execute("SELECT * FROM users")
    rows = cursor.fetchall()
    for row in rows:
        print(row)
    
    conn.close()
    
    

5. 关于 W3C 的来源和重要性,及其例子:

W3C标准(World Wide Web Consortium标准):

来源: W3C是一个国际性组织,成立于1994年,致力于制定和维护Web技术标准。它由互联网上的领先公司、研究机构和个人共同组成。W3C的任务是确保Web的长期发展,推动Web技术的标准化和互操作性。

重要性: W3C标准是Web开发的基石,它们确保了不同浏览器和设备之间的一致性,以及Web内容的可访问性和可维护性。W3C标准包括HTML、CSS、XML等,它们定义了Web页面的结构、样式和数据交换格式。在没有这些标准的情况下,Web开发将变得混乱,不同浏览器之间的渲染可能会不一致,这会增加开发的复杂性。

示例: HTML5是一个W3C标准的示例,它定义了Web页面的结构和元素。以下是一个简单的HTML5示例:

<!DOCTYPE html>
<html>
<head>
    <title>我的网页</title>
</head>
<body>
    <h1>欢迎来到我的网页</h1>
    <p>这是一个示例网页。</p>
</body>
</html>

HTTP标准(Hypertext Transfer Protocol标准):

来源: HTTP是一个应用层协议,用于在Web上传输和交换超文本文档,它是Web的核心协议之一。HTTP的标准化由IETF(Internet Engineering Task Force)进行,其中定义了HTTP/1.0、HTTP/1.1和HTTP/2等版本。

重要性: HTTP标准定义了Web客户端和服务器之间的通信方式。它规定了请求和响应的格式、方法(GET、POST等)、状态码(200 OK、404 Not Found等)等。HTTP的正确实施是确保Web应用程序可靠性、性能和安全性的关键。HTTP/2的引入进一步提高了Web性能,允许多路复用和头部压缩,加速了页面加载速度。

示例: HTTP请求和响应是HTTP标准的核心示例。以下是一个HTTP GET请求的示例,该请求获取一个Web页面:

GET /index.html HTTP/1.1
Host: www.example.com

服务器将对这个请求返回一个HTTP响应,如下所示:

HTTP/1.1 200 OK
Content-Type: text/html

<!DOCTYPE html>
<html>
<head>
    <title>我的网页</title>
</head>
<body>
    <h1>欢迎来到我的网页</h1>
    <p>这是一个示例网页。</p>
</body>
</html>

这个示例展示了HTTP标准中的请求和响应的结构,以及状态码和响应的内容类型。

总之,W3C标准和HTTP标准是Web开发中至关重要的概念和规范,它们确保了Web的稳定性、一致性和可靠性。了解并遵循这些标准是Web开发人员的基本要求。

6. HTTP-request 进行一个爬虫演练

初识网络爬虫:

  1. 网络爬虫概述:
    • 概念: 网络爬虫是一种自动化程序,用于在互联网上抓取网页信息并提取数据。它们可以浏览网站,下载网页内容,然后对数据进行分析、存储或其他操作。
    • 重要性: 网络爬虫在许多领域中都有用,包括搜索引擎、数据采集、信息聚合、价格比较和自动化测试等。它们帮助我们从大量的互联网信息中提取有用的数据。
  2. HTTP请求的Python实现:
    • 概念: 在网络爬虫中,HTTP请求是与Web服务器通信以获取网页内容的关键部分。Python提供了许多库和模块来实现HTTP请求,其中最常用的是requests库。
    • 使用场景: HTTP请求的Python实现可用于从网站上获取HTML页面、API数据或其他网络资源。这对于构建网络爬虫或进行Web数据挖掘非常有用。

Python代码示例:

以下是一个简单的Python示例,使用requests库实现HTTP GET请求,以获取网页内容。假设我们要获取一个示例网页的内容:

import requests

# 指定目标URL
url = '<https://example.com>'

# 发送HTTP GET请求
response = requests.get(url)

# 检查响应状态码
if response.status_code == 200:
    # 打印响应内容
    print(response.text)
else:
    print(f"请求失败,状态码:{response.status_code}")

上述示例中,我们首先导入requests库,然后指定目标URL。接着,我们使用requests.get()函数发送HTTP GET请求,并获取响应。如果响应的状态码是200(表示成功),则打印响应内容。否则,打印请求失败的状态码。

这个示例展示了如何使用Python实现HTTP请求,这是构建网络爬虫的关键一步。网络爬虫通常会发送多个HTTP请求来获取不同页面的内容,然后解析和处理这些内容以提取所需的数据。

请注意,网络爬虫的使用需要遵守网站的使用条款和法律法规,以确保合法和道德的数据采集。

8. 解析的方法提升(使用 BeautifulSoup)

HTML解析大法:

HTML解析是Web开发和网络爬虫中的重要任务,它涉及将HTML文档分析为结构化数据以进行处理。在这个概念中,我们将介绍初识Firebug、正则表达式和强大的BeautifulSoup这三个工具,它们在HTML解析中发挥着关键作用。

BeautifulSoup是一个强大而易于使用的HTML解析工具,使开发人员能够轻松地处理和分析HTML文档。它在Web开发、网络爬虫、数据抓取和数据分析等领域都有广泛的应用。虽然也可以使用正则表达式等方法进行HTML解析,但BeautifulSoup提供了更便捷、可读性更高的解决方案,减少了错误和复杂性。

  • 如果没有它,那么:
  • 手动解析HTML: 没有BeautifulSoup,您需要手动编写代码来解析HTML文档,包括编写自定义的解析器以分析文档的结构和标签。
  • 容错性差: HTML文档可能包含不规范的标记、嵌套问题或其他错误,没有BeautifulSoup的容错性,您需要编写更多的代码来处理这些问题,以确保解析的准确性。
  • 复杂的元素定位: 没有BeautifulSoup提供的元素定位功能,您需要使用正则表达式或字符串处理函数来准确定位文档中的元素,这可能变得非常复杂和容易出错。
  • 文本提取困难: 没有BeautifulSoup的文本提取功能,您需要手动编写代码来提取文档中的文本内容,这包括处理各种标签和文本元素。

三大工具认识:

  1. 初识Firebug:
    • 概念: Firebug是一个用于Web开发的浏览器扩展程序,它提供了强大的调试和分析工具,使开发人员能够检查和修改网页的HTML、CSS和JavaScript。
    • 重要性: Firebug允许开发人员实时查看网页的DOM结构、样式和响应数据,帮助他们诊断问题并改进网页设计。
  2. 正则表达式:
    • 概念: 正则表达式是一种强大的文本匹配和模式查找工具,它允许您根据模式在文本中搜索、替换和提取内容。
    • 重要性: 在HTML解析中,正则表达式可以用来匹配和提取特定的HTML标签、属性或文本,从而实现数据抓取。
  3. 强大的BeautifulSoup:
    • 概念: BeautifulSoup是一个Python库,用于解析HTML和XML文档,提供了简单而直观的方式来浏览和搜索文档树。
    • 重要性: BeautifulSoup使HTML解析变得容易,它可以帮助开发人员轻松地从网页中提取数据,并进行分析和操作。

示例代码:

以下是一个使用BeautifulSoup解析HTML的示例,以从一个简单的HTML页面中提取链接的文本和URL。

import requests
from bs4 import BeautifulSoup

# 指定百度首页的URL
url = 'https://www.baidu.com'

# 发送HTTP GET请求
response = requests.get(url)

# 检查响应状态码
if response.status_code == 200:
    # 使用BeautifulSoup解析HTML
    soup = BeautifulSoup(response.text, 'html.parser')
    
    # 查找百度搜索框的HTML元素
    search_input = soup.find('input', {'name': 'wd'})
    
    if search_input:
        # 提取搜索框的相关信息
        input_name = search_input['name']
        input_type = search_input['type']
        input_placeholder = search_input['placeholder']
        
        print(f"搜索框名称: {input_name}")
        print(f"搜索框类型: {input_type}")
        print(f"搜索框占位符: {input_placeholder}")
    else:
        print("未找到搜索框元素")
else:
    print(f"请求失败,状态码:{response.status_code}")

在上述示例中,我们导入了BeautifulSoup库,然后使用BeautifulSoup()函数解析HTML。接着,我们使用find_all()方法找到所有的链接,并循环遍历它们以提取文本和URL。

这个示例展示了BeautifulSoup的强大功能,使HTML解析变得简单而直观。这种工具在Web开发和网络爬虫中非常有用,可以帮助您轻松地处理和分析HTML文档。

9. 扩展爬虫的功能

让爬虫在后台爬取,其中正文内容和多媒体内容要进行分开, 比如爬的时候出去喝杯咖啡摸一下🐟,也要及时回来,则就需要一个消息提醒了:

  1. HTML正文抽取:
    • 概念: HTML正文抽取是从HTML页面中提取主要内容的过程,通常去除导航、广告和其他非关键信息,以便更好地分析和保存有用的数据。
    • 扩展: 为了更精确地抽取HTML正文,可以使用专门的库或工具,如Python中的newspaper3kreadability库,它们可以智能地识别和提取主要内容。
  2. 多媒体文件抽取:
    • 概念: 除了HTML文本,网页上还可能包含图片、音频、视频等多媒体文件。抽取这些多媒体文件是在数据存储过程中的重要一部分。
    • 扩展: 使用Python的requests库下载多媒体文件,然后将它们保存到本地文件系统。可以根据需要创建不同的文件夹来组织这些文件。
  3. Email提醒:
    • 概念: Email提醒是一种方式,通过电子邮件通知用户或管理员有关抓取和存储数据的重要信息,例如错误报告、进度更新或新数据可用的通知。
    • 扩展: 使用Python的smtplib库来编写代码,以在特定条件下发送邮件通知。您可以设置警报阈值,例如在网站抓取失败时发送邮件提醒。

示例代码:

以下是一个示例代码,扩展了HTML正文抽取、多媒体文件抽取和Email提醒的内容:

import requests
from bs4 import BeautifulSoup
import os
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

# HTML正文抽取示例
def extract_main_content(html):
    # 使用新闻提取库 newspaper3k 提取HTML正文
    from newspaper import Article
    article = Article(url)
    article.download()
    article.parse()
    main_content = article.text
    return main_content

# 多媒体文件抽取示例
def extract_media_files(html, save_path):
    soup = BeautifulSoup(html, 'html.parser')
    # 从HTML中查找多媒体文件链接
    media_links = soup.find_all('img', src=True)
    for link in media_links:
        media_url = link['src']
        media_data = requests.get(media_url).content
        # 保存多媒体文件到本地文件系统
        media_filename = os.path.join(save_path, os.path.basename(media_url))
        with open(media_filename, 'wb') as media_file:
            media_file.write(media_data)

# Email提醒示例
def send_email_notification(subject, body, to_email):
    smtp_server = 'smtp.example.com'
    smtp_port = 587
    sender_email = 'your_email@example.com'
    sender_password = 'your_email_password'

    msg = MIMEMultipart()
    msg['From'] = sender_email
    msg['To'] = to_email
    msg['Subject'] = subject

    msg.attach(MIMEText(body, 'plain'))

    # 连接SMTP服务器并发送邮件
    server = smtplib.SMTP(smtp_server, smtp_port)
    server.starttls()
    server.login(sender_email, sender_password)
    server.sendmail(sender_email, to_email, msg.as_string())
    server.quit()

# 示例用法
url = '<https://example.com>'
response = requests.get(url)
if response.status_code == 200:
    html_content = response.text

    # 抽取HTML正文
    main_content = extract_main_content(html_content)
    print("HTML正文抽取结果:")
    print(main_content)

    # 抽取多媒体文件
    save_directory = 'media_files'
    os.makedirs(save_directory, exist_ok=True)
    extract_media_files(html_content, save_directory)
    print(f"多媒体文件已保存到目录:{save_directory}")

    # 发送Email提醒
    subject = '数据抓取完成'
    body = '数据抓取已完成,可以查看结果。'
    recipient_email = 'recipient@example.com'
    send_email_notification(subject, body, recipient_email)
    print(f"Email提醒已发送至:{recipient_email}")
else:
    print(f"请求失败,状态码:{response.status_code}")

10. 实战的爬虫考虑

不管你是自己开发的框架还是使用别人的框架,大致内容都需要涉及下面几个步骤:

主要由这几个部分:

URL管理器、HTML下载器、HTML解析器、数据存储器和爬虫调度器是构成一个完整爬虫系统的关键组件。URL管理器负责管理待抓取的URL,HTML下载器负责下载网页内容,HTML解析器负责解析网页并提取有用的数据,数据存储器负责将提取的数据保存到指定的存储介质中,而爬虫调度器则负责协调各个组件的工作流程,确保爬虫系统的稳定运行。这些组件之间的协作和配合,使得爬虫系统能够高效地获取目标网站的数据,并实现相关的数据处理和分析任务。

  1. 基础爬虫架构及运行流程:
    • 概念: 基础爬虫通常遵循一种流程,包括从起始URL开始,依次进行URL管理、HTML下载、HTML解析、数据存储和爬虫调度等步骤。
    • 扩展: 在实际项目中,流程可能更复杂,包括多个爬虫模块、并发处理、异常处理和日志记录等。
  2. URL管理器:
    • 概念: URL管理器负责管理待爬取的URL队列,包括去重、添加新URL和获取下一个URL等功能。
    • 扩展: 可以使用哈希算法或分布式存储来处理大规模爬虫项目中的URL管理。
  3. HTML下载器:
    • 概念: HTML下载器负责从互联网上下载HTML页面,通常使用HTTP请求获取页面内容。
    • 扩展: 在现实项目中,可能需要处理反爬虫机制、设置代理、实现并发下载等。
  4. HTML解析器:
    • 概念: HTML解析器用于解析下载的HTML页面,提取有用的信息,通常使用正则表达式、XPath或HTML解析库(如BeautifulSoup)。
    • 扩展: 在大规模爬虫项目中,可能需要优化解析性能、处理多种HTML结构和错误情况。
  5. 数据存储器:
    • 概念: 数据存储器负责将抓取的数据保存到本地文件系统、数据库或其他存储介质中。
    • 扩展: 可以考虑分布式存储、数据清洗、数据转换和备份策略等。
  6. 爬虫调度器:
    • 概念: 爬虫调度器协调整个爬虫流程,包括控制爬虫速率、处理异常、管理任务队列等。
    • 扩展: 可以实现分布式爬虫调度、优化爬虫策略、处理多个爬虫模块等。

示例代码:

以下是一个基础爬虫架构的扩展示例,演示了如何构建一个简单的爬虫项目,并包含了上述扩展内容:

import requests
from bs4 import BeautifulSoup

class URLManager:
    def __init__(self):
        self.urls = set()

    def add_url(self, url):
        if url not in self.urls:
            self.urls.add(url)
            return True
        return False

    def get_url(self):
        if self.urls:
            return self.urls.pop()
        return None

class HTMLDownloader:
    def download(self, url):
        try:
            response = requests.get(url)
            if response.status_code == 200:
                return response.text
        except Exception as e:
            print(f"下载失败:{str(e)}")
        return None

class HTMLParser:
    def parse(self, html):
        soup = BeautifulSoup(html, 'html.parser')
        # 在这里添加具体的解析逻辑,提取数据并返回

class DataStorage:
    def save_data(self, data):
        # 在这里添加数据存储逻辑,将数据保存到文件、数据库等

class SpiderScheduler:
    def __init__(self):
        self.url_manager = URLManager()
        self.downloader = HTMLDownloader()
        self.parser = HTMLParser()
        self.data_storage = DataStorage()

    def run(self, start_url):
        self.url_manager.add_url(start_url)
        while True:
            current_url = self.url_manager.get_url()
            if current_url:
                html = self.downloader.download(current_url)
                if html:
                    data = self.parser.parse(html)
                    self.data_storage.save_data(data)
                    # 在这里添加更多的爬虫调度逻辑,如添加新URL、处理异常等
            else:
                break

# 示例用法
start_url = '<https://example.com>'
spider = SpiderScheduler()
spider.run(start_url)

关注,评论,留下你的邮箱,机器人自动发送代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/314235.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《BackTrader量化交易图解》第10章:Trade 交易操作

文章目录 10 Trade 交易操作10.1 量化回测分析流程10.2 Cerebro 类模块10.3 案例&#xff1a;Trade 交易10.4 实盘交易机器隐性规则10.5 Stake 交易数额和 Trade 交易执行价格 10 Trade 交易操作 10.1 量化回测分析流程 从本章开始讲解 BackTrader 的实盘操作。前面的章节讲过…

redis系列:01 数据类型及操作

redis的数据类型有哪些 string,list,set,sorted_set,hash 操作 sting: set name maliao get name exists name expire name 5 ttl name del name setex name 10 maliao 设置key和过期时间 setnx name maliao 当key不存在时才添加list&#xff1a; lpush letter a lpush le…

二极管选型怎么选?常用参数要熟练~

同学们大家好&#xff0c;今天我们继续学习杨欣的《电子设计从零开始》&#xff0c;这本书从基本原理出发&#xff0c;知识点遍及无线电通讯、仪器设计、三极管电路、集成电路、传感器、数字电路基础、单片机及应用实例&#xff0c;可以说是全面系统地介绍了电子设计所需的知识…

【LeetCode】206. 反转链表(简单)——代码随想录算法训练营Day01

题目链接&#xff1a;206. 反转链表 题目描述 206. 反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a; 输入&#xff1…

公司寄快递教程

公司寄快递用哪个更划算&#xff1f;这个问题有最优解吗&#xff1f;恐怕没有......很简单&#xff0c;回答这个问题之前&#xff0c;我们先来看看公司寄快递的背景。 一、大背景 所谓的大背景是由国内快递行业的发展现状所决定的。众所周知&#xff0c;这十年来&#xff0c;国…

Centos安装Datax

Centos7安装DataX 一、DataX简介二、DataX的数据源支持三、安装DataX1、下载DataX2、解压3、检验是否安装成功4、使用 四、实践案例1、环境信息2、编写同步的配置文件(user_info.json)3、执行同步4、验证同步结果 一、DataX简介 DataX 是阿里云 DataWorks数据集成 的开源版本&a…

Minitab的单因子方差分析的结果

单因子方差分析概述 当有一个类别因子和一个连续响应并且想要确定两个或多个组的总体均值是否存在差异时&#xff0c;可使用 单因子方差分析。如果经检验&#xff0c;发现至少有一组存在差异&#xff0c;请使用单因子方差分析中的比较对话框来标识存在显著差异的组对。 例如&…

C++ 之LeetCode刷题记录(九)

&#x1f604;&#x1f60a;&#x1f606;&#x1f603;&#x1f604;&#x1f60a;&#x1f606;&#x1f603; 开始cpp刷题之旅&#xff0c;多学多练&#xff0c;尽力而为。 先易后难&#xff0c;先刷简单的。 58. 最后一个单词的长度 给你一个字符串 s&#xff0c;由若干…

代码随想录第第五十七天—回文子串,最长回文子序列

leetcode 647. 回文子串 题目链接&#xff1a;回文子串 版本一&#xff1a;动态规划 dp数组及下标的含义 dp[i][j]&#xff1a;区间范围[i, j] &#xff08;左闭右闭&#xff09;的子串是否是回文子串&#xff0c;如果是dp[i][j]为true&#xff0c;否则为false。确定递推公式…

Notepad++安装步骤

Notepad是一款文本编辑工具&#xff0c;支持27种编程语言&#xff0c;通吃C,C ,Java ,C#, XML, HTML, PHP,JS 等&#xff0c;该软件拥有完整的中文化接口及支持多国语言编写的功能&#xff0c;不仅可以用来制作一般的纯文字说明文件&#xff0c;还非常适合编写计算机程序代码&a…

大数据StarRocks(五) :数据类型

StarRocks 支持数据类型&#xff1a;数值类型、字符串类型、日期类型、半结构化类型、其他类型。您在建表时可以指定以下类型的列&#xff0c;向表中导入该类型的数据并查询数据。 5.1 数值类型 SMALLINT2 字节有符号整数&#xff0c;范围 [-32768, 32767] INT4 字节有符号整…

leetcode 动态规划(爬楼梯、零钱兑换、完全平方数)

70. 爬楼梯&#xff08;进阶版&#xff09; 卡码网&#xff1a;57. 爬楼梯(opens new window) 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬至多m (1 < m < n)个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 注意&#xff1a;给定 n 是一个正…

RedisTemplate使用zadd报错java.lang.StackOverflowError

代码当中使用RedisTemplate操作String、List都是正常的&#xff0c;但是操作zadd就会报错&#xff0c;有人说是这两个依赖的版本不一致的问题&#xff0c;但是项目中还有其他地方要用到&#xff0c;所以改版本号行不通&#xff0c; <dependency><groupId>org.redis…

DHCP与时间同步

目录 一、DHCP 1、DHCP定义 1.什么是DHCP 2.DHCP的好处 3.DHCP的分配方式 4.为什么使用DHCP 5.DHCP模式 2、DHCP的工作过程 3、DHCP动态配置主机地址 1.DHCP服务的优点 2.可分配的地址信息 3.动态分配IP地址 二、时间同步 1、ntp 2、chrony 1、搭建本地本地时间…

SpringSecurity入门demo(一)集成与默认认证

一、集成与默认认证&#xff1a; 1、说明&#xff1a;在引入 Spring Security 项目之后&#xff0c;没有进行任何相关的配置或编码的情况下&#xff0c;Spring Security 有一个默认的运行状态&#xff0c;要求在经过 HTTP 基本认证后才能访问对应的 URL 资源&#xff0c;其默认…

对于软件测试的认识和了解

对软件测试的认识&#xff1a; 软件测试要求开发人员避免测试自己开发的程序。从心理学角度讲&#xff0c;这是很有道理的。特别是一个相对复杂的系统&#xff0c;开发人员在刚刚开发完成的时候&#xff0c;尚沉浸于对自己设计的回味之中。此时去测试的话往往会侧重于程序本身的…

啥,凭什么Python中函数的返回值可以有多个?

你好&#xff0c;我是安然无虞。 文章目录 函数函数定义格式函数调用默认参数和变长参数默认参数变长参数 变量的作用域 函数 编程语言中的函数&#xff0c;是一段可以被重复使用的代码片段&#xff0c;使用函数能够减少冗余的代码。 函数定义格式 def 函数名(形参列表):函数…

JavaScript高级程序设计读书记录(十二):函数

函数是ECMAScript中最有意思的部分之一&#xff0c;这主要是因为函数实际上是对象。每个函数都是Function 类型的实例&#xff0c;而 Function 也有属性和方法&#xff0c;跟其他引用类型一样。因为函数是对象&#xff0c;所以函数名就是 指向函数对象的指针&#xff0c;而且不…

Python 解决安装三方包失败的问题

pip 安装三方包失败&#xff0c;常见的情况有三种&#xff1a;不能访问源所在服务器&#xff1b;Python 版本不支持&#xff1b;和本地版本冲突。 不能访问源服务器 对于这张问题&#xff0c;有两种解决方法 # 方法一 pip config set global.index-url <源服务器> pip…

文件操作(你真的会读写文件吗?)

文章目录 一、为什么使用文件&#xff1f;二、什么是文件&#xff1f;2.1 程序文件2.2 数据文件2.3 文件名 三、二进制文件和文本文件3.1 二进制文件3.2 文本文件 四、文件的打开和关闭4.1 流和标准流4.1.1 流4.1.2 标准流 4.2 文件指针4.3 fopen和fclose 五、文件的顺序读写5.…
最新文章