Pythony——多线程简单爬虫实现

news2024/11/19 14:52:12

简单爬虫实现

import requests
from bs4 import BeautifulSoup

# 生成要爬取的网页地址列表,这里是博客园的分页地址,从第1页到第50页
urls = [f"https://www.cnblogs.com/#p{i}" for i in range(1, 50 + 1)]


# 生产者函数——负责下载网页内容
def craw(url):
    这个函数接收一个网页的URL作为参数,使用requests库发送GET请求获取该网页的内容,并以文本形式返回。
    r = requests.get(url)# 要下载内容的网页URL
    return r.text#返回获取到的网页文本内容

# 消费者函数——拿着生产者下载好的网页内容,进行解析
def parse(html):
    """
    此函数接收从网页下载的HTML文本内容作为参数,使用BeautifulSoup库对其进行解析,
    提取出所有class名为post-item-title的超链接a标签,然后遍历这些标签,将每个标签的href链接内容
    和标签文字内容以元组的形式提取出来并返回
    """
    # 指定为html解析器 从网页上下载下来的HTML文本内容
    soup = BeautifulSoup(html, "html.parser")  

    # 提取出所有class名为post-item-title 的 超链接 a标签
    links = soup.find_all("a", class_="post-item-title")
    # 遍历links元组,将超链接a标签的href链接内容 和 标签文字内容提取输出
    
    return [(link["href"], link.get_text()) for link in links]
    # 返回一个包含元组的列表,每个元组包含一个超链接的href值和对应的文字内容


# 主程序入口,当脚本直接运行时执行以下代码
if __name__ == '__main__':
    """
    在这里我们调用了craw函数去下载urls列表中第3个网址(索引为2)的网页内容,
    然后将下载好的内容传递给parse函数进行解析,最后遍历parse函数返回的结果并打印出来。
    """
    for result in parse(craw(urls[2])):
        print(result)

生产者消费者函数

import threading
import time
import random
import queue
import blog_spider

# 定义生产者线程要执行的函数,用于从URL队列中获取URL,爬取网页内容并放入HTML队列
def do_craw(url_queue: queue.Queue, html_queue: queue.Queue):#url_queue: 存储待爬取URL的队列, html_queue: 用于存储爬取到的网页HTML内容的队列
 
    """
    这个函数是生产者线程要执行的函数。
    不断从URL队列中获取URL,调用blog_spider.craw函数爬取网页的内容,
    然后将爬取到的HTML内容放入HTML队列中,并打印相关的内容。
  
    """
    while True:
        # 从URL队列中获取一个URL
        url = url_queue.get()
        # 调用blog_spider模块中的craw函数爬取该URL对应的网页内容
        html = blog_spider.craw(url)
        # 将爬取到的网页内容放入HTML队列
        html_queue.put(html)
        # 打印当前线程的名称、正在爬取的URL以及URL队列剩余的大小
        print(threading.current_thread().name, f"craw {url}", "url_queue.size=", url_queue.qsize())
        time.sleep(random.randint(1, 2))#休眠一段时间

# 定义消费者线程要执行的函数,用于从HTML队列中获取网页内容
def do_parse(html_queue: queue.Queue, fout):#html_queue: 存储网页HTML内容的队列
    """
    此函数是消费者线程要执行的任务函数。
    它会不断从HTML队列中获取网页内容,调用blog_spider.parse函数对其进行解析,fout: 用于写入解                    
析结果的文件对象
    将解析结果写入到指定的文件中,并打印相关的内容。
    """
    while True:
        # 从HTML队列中获取一个网页内容
        html = html_queue.get()
        # 调用blog_spider模块中的parse函数对网页内容进行解析,得到解析结果
        results = blog_spider.parse(html)
        for result in results:
            fout.write(str(result) + "\n")
        # 打印当前线程的名称、解析结果的数量以及HTML队列剩余的大小
        print(threading.current_thread().name, f"results.size", len(results), "html_queue_size=", html_queue.qsize())
        time.sleep(random.randint(1, 2))#休眠一段时间

# 主程序入口,当脚本直接运行时执行以下代码
if __name__ == '__main__':
    # 创建一个用于存储待爬取URL的队列
    url_queue = queue.Queue()
    # 创建一个用于存储爬取到的网页HTML内容的队列
    html_queue = queue.Queue()

    # 将blog_spider模块中定义的所有URL放入URL队列
    for url in blog_spider.urls:
        url_queue.put(url)

    # 开启生产者线程
    for idx in range(3):
        # 创建一个新的线程,指定其执行的任务函数为do_craw,并传入相应的参数
        t = threading.Thread(target=do_craw, args=(url_queue, html_queue), name=f"craw{idx}")
        t.start()

    # 开启消费者线程和创建用于存储解析结果的文本文件
    fout = open("spider_data.txt", "w")
    for idx in range(2):
        # 创建一个新的线程,指定其执行的任务函数为do_parse,并传入相应的参数
        t = threading.Thread(target=do_parse, args=(html_queue, fout), name=f"parse{idx}")
        t.start()

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaWeb后端开发知识储备1

目录 1.DTO/VO/PO 2.MVC架构/微服务架构 3.JWT令牌流程 4.ThreadLocal 5.接口路径/路径参数 6.自定义注解 1.DTO/VO/PO 1.1 DTO DTO 即 Data Transfer Object—— 数据传输对象,是用于传输数据的对象,通常在服务层与表现层之间传递数据&#xff…

什么是SMARC?模块电脑(核心板)规范标准简介三

1. 概念 SMARC(Smart Mobility ARChitecture,智能移动架构)是一种通用的小型计算机模块定义,基于ARM和X86技术的模块化计算机低功耗嵌入式架构平台,旨在满足低功耗、低成本和高性能的应用需求。这些模块通常使用与平板…

Filebeat升级秘籍:解锁日志收集新境界

文章目录 一、什么是filebeat二、Filebeat的工作原理2.1 filebeat的构成2.1.1 Prospector 组件2.1.2 Harvester 组件 2.2 filebeat如何保存文件的状态2.3 filebeat何如保证至少一次数据消费 三、Filebeat配置文件四、filebeat对比fluented五、Filebeat的部署安装5.1裸金属安装5…

C++小白实习日记——Day 4 将本地项目上传到gitee

生活就像一坨狗屎 我跑的代码老板说耗时太长了,不知道要怎么做才能耗时小一点 老板把我加到企业gitee里了,让我将代码上传到个人仓库: 新建一个文件夹当做库文件,点git bash here——> git init——>git config --global…

qiankun主应用(vue2+element-ui)子应用(vue3+element-plus)不同版本element框架css样式相互影响的问题

背景:qiankun微前端架构实现多应用集成 主应用框架:vue2 & element-ui 子应用框架:vue3 & element-plus >> 问题现象和分析 登录页面是主应用的,在登录之后才能打开子应用的菜单页面,即加载子应用。 首…

云渲染,解决houdini特效缓存太大上传太慢的问题

对于从事 Houdini 创作的艺术家和设计师们来说,使用云渲染的朋友,缓存太大导致云渲染上传慢一直是一个令人头疼的问题。然而,现在有了成都渲染 101 云渲染,这个难题迎刃而解。Houdini 以其强大的功能能够创建极为复杂和逼真的特效…

前端开发迈向全栈之路:规划与技能

一、前端开发与全栈开发的差异 前端开发主要负责构建和实现网页、Web 应用程序和移动应用的用户界面。其工作重点在于网页设计和布局,使用 HTML 和 CSS 技术定义页面的结构、样式和布局,同时运用前端框架和库如 React、Angular 或 Vue.js 等构建交互式和…

学习QT第二天

QT6示例运行 运行一个Widgets程序运行一个QT Quick示例 工作太忙了,难得抽空学点东西。-_-||| 博客中有错误的地方,请各位道友及时指正,感谢! 运行一个Widgets程序 在QT Creator的欢迎界面中,点击左侧的示例&#xf…

删除课表中课程

文章目录 概要整体架构流程技术细节小结 概要 业务分析 删除课表中的课程有两种场景: 用户直接删除已失效的课程 用户退款后触发课表自动删除 技术细节 退款通知 其中用户退款与用户报名课程类似,都是基于MQ通知的方式。具体代码是在tj-trade模块的…

MySQL深度剖析-索引原理由浅入深

什么是索引? 官方上面说索引是帮助MySQL高效获取数据的数据结构,通俗点的说,数据库索引好比是一本书的目录,可以直接根据页码找到对应的内容,目的就是为了加快数据库的查询速度。 索引是对数据库表中一列或多列的值进…

MATLAB常见数学运算函数

MATLAB中含有许多有用的函数,可以随时调用。 a b s abs abs函数 a b s abs abs函数在MATLAB中可以求绝对值,也可以求复数的模长:c e i l ceil ceil函数 向正无穷四舍五入(如果有小数,就向正方向进一)f l o o r floor floor函数 向负无穷四舍五入(如果有小数,就向负方向…

如何使用本地大模型做数据分析

工具:interpreter --local 样本数据: 1、启动分析工具 2、显示数据文件内容 输入: 显示/Users/wxl/work/example_label.csv 输出:(每次输出的结果可能会不一样) 3、相关性分析 输入: 分析客户类型与成…

操作系统不挂科】<创建线程(7)>单选多选简答题(带答案与解析)

前言 大家好吖,欢迎来到 YY 滴操作系统不挂科 系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 本博客主要内容,收纳了一部门基本的操作系统题目,供yy应对期中考试复习。大家可以参考 本章为选择题题库,试卷…

RAG(Retrieval-Augmented Generation)评测篇

一、为什么需要 对 RAG 进行评测? 在探索和优化 RAG(检索增强生成器)的过程中,如何有效评估其性能已经成为关键问题。 二、如何合成 RAG 测试集? 假设你已经成功构建了一个RAG 系统,并且现在想要评估它的…

宝塔 docker 部署onlyoffice 服务

1.宝塔安装docker,直接下载安装就行 2.docker拉取onlyoffice镜像 docker pull onlyoffice/documentserver:5.3.1.26 5.4或更高的版本已经解决了连接数限制方法的Bug 3.创建容器 docker run -d --name onlyoffice --restartalways -p 暴露端口号:80 onlyoffice/documentserv…

强制放大缩小(适用于所有ctrl-,ctrl+)

以下操作: 使用资源管理器打开启动文件夹: 按下 Win R 键打开“运行”对话框。输入 shell:startup,然后按下 Enter。这应该会打开启动文件夹。 手动定位启动文件夹: 打开资源管理器并导航到以下路径: C:\Users\admin…

项目2:简易随机数生成器 --- 《跟着小王学Python·新手》

项目2:简易随机数生成器 — 《跟着小王学Python新手》 《跟着小王学Python》 是一套精心设计的Python学习教程,适合各个层次的学习者。本教程从基础语法入手,逐步深入到高级应用,以实例驱动的方式,帮助学习者逐步掌握P…

数字资产与大健康领域的知识宝藏:高效知识库搭建策略

在数字化时代,大健康领域的企业积累了丰富的数字资产,这些资产如同一座待挖掘的金矿,蕴含着巨大的价值。高效搭建知识库,能够将这些数字资产转化为企业竞争力。 数字资产与大健康领域知识宝藏 数字资产在大健康领域包括患者数据…

OpenAI震撼发布:桌面版ChatGPT,Windows macOS双平台AI编程体验!

【雪球导读】 「OpenAI推出ChatGPT桌面端」 OpenAI重磅推出ChatGPT桌面端,全面支持Windows和macOS系统!这款新工具为用户在日常生活和工作中提供了前所未有的无缝交互体验。对于那些依赖桌面端进行开发工作的专业人士来说,这一更新带来了令人…