简单爬虫的实现

 以下是一个简单爬虫代码的实现:

import requests
from bs4 import BeautifulSoup# 生成一个包含多个网页 URL 的列表
# 这里我们构造了 50 个页面的 URL,假设网站有多页内容,页数从 1 到 50
urls = [f"https://www.cnblogs.com/#p{i}" for i in range(1, 51)]  # #p1, #p2, ..., #p50# 生产者——负责下载网页内容
def craw(url):"""通过 requests 库向指定的 URL 发送 GET 请求,并返回响应的网页内容(HTML)"""r = requests.get(url)  # 发送 GET 请求return r.text  # 返回网页的 HTML 内容# 消费者——解析网页内容,提取有用信息
def parse(html):"""解析 HTML 内容,提取其中所有 class 为 'post-item-title' 的超链接(<a> 标签)"""soup = BeautifulSoup(html, "html.parser")  # 使用 BeautifulSoup 解析网页的 HTML 内容# 使用 find_all 方法查找所有 class 名为 'post-item-title' 的 <a> 标签links = soup.find_all("a", class_="post-item-title")# 遍历所有找到的 <a> 标签,提取每个标签的 href 属性和标签文本# 将 href(链接地址)和 get_text(链接的文字)以元组的形式返回return [(link["href"], link.get_text()) for link in links]# 主程序——执行爬虫任务
if __name__ == '__main__':# 只处理第 3 个网页的内容(urls[2] 对应第 3 页,即 #p3)# 首先调用 craw 函数下载网页内容,然后将下载的 HTML 内容传给 parse 函数解析for result in parse(craw(urls[2])):# 输出每一个链接及其文字内容print(result)

 此时我们可以将上述爬虫代码作为我们基础的模块,通过多线程爬取,将我们爬取到的信息保存到文件当中,以下是一个用例来实现我们的要求:

import threading
import time
import random
import queue
import blog_spider  # 导入自定义的爬虫模块# 生产者线程:负责从 url_queue 中取出 URL,并下载网页内容,将 HTML 放入 html_queue
def do_craw(url_queue: queue.Queue, html_queue: queue.Queue):while True:# 从 URL 队列中获取一个 URLurl = url_queue.get()  # get() 会阻塞,直到队列中有元素可取# 调用 blog_spider 模块中的 craw 函数下载网页内容html = blog_spider.craw(url)# 将下载的 HTML 放入 html_queue 队列中html_queue.put(html)# 打印日志,显示当前线程正在处理的 URL 以及剩余的 URL 数量print(threading.current_thread().name, f"craw {url}", "url_queue.size=", url_queue.qsize())# 随机等待 1 到 2 秒,模拟爬虫访问间隔,避免对服务器造成过大压力time.sleep(random.randint(1, 2))# 消费者线程:负责从 html_queue 中取出 HTML 内容,并解析数据,写入文件
def do_parse(html_queue: queue.Queue, fout):while True:# 从 HTML 队列中获取一个 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())# 随机等待 1 到 2 秒,模拟处理时间,避免过快操作time.sleep(random.randint(1, 2))# 主程序:负责初始化队列和线程
if __name__ == '__main__':# 创建两个队列:一个用于存放待爬取的 URL,另一个用于存放下载的 HTML 内容url_queue = queue.Queue()html_queue = queue.Queue()# 将 blog_spider 模块中的 URL 列表添加到 url_queue 中for url in blog_spider.urls:url_queue.put(url)  # 将每个 URL 放入队列中# 开启 3 个生产者线程,每个线程负责从 url_queue 中取 URL 并下载网页for idx in range(3):t = threading.Thread(target=do_craw, args=(url_queue, html_queue), name=f"craw{idx}")t.start()  # 启动线程# 打开一个文件用于保存爬取的数据fout = open("spider_data.txt", "w")# 开启 2 个消费者线程,每个线程负责从 html_queue 中取出 HTML 内容并解析数据for idx in range(2):t = threading.Thread(target=do_parse, args=(html_queue, fout), name=f"parse{idx}")t.start()  # 启动线程

下面是代码运行时产出的结果: 

 

 

 

 

到这里可以看到代码已经输出完毕,这时我们打开该爬虫创建的文件,就可以看到我们爬取的内容了,如下图所示:

 到这里我们就实现了一次简单爬虫的应用,通过写一个爬虫的代码模块,然后通过外部调用将其爬取的内容保存到相应的文件中,方便我们查看。

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

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

相关文章

RNN简单理解;为什么出现Transformer:传统RNN的问题;Attention(注意力机制)和Self-Attention(自注意力机制)区别;

目录 RNN简单理解 RNN n to n Transformer N to M LSTM 为什么出现Transformer:传统RNN的问题 信息丢失的后果 Rnn是顺序执行的效率不高:顺序执行 Attention(注意力机制)和Self-Attention(自注意力机制)区别 一、计算对象不同 二、应用场景不同 三、功能差异…

小熊派Nano|HarmonyOS初体验-LiteOS内核

在这个万物互联的时代&#xff0c;操作系统作为连接硬件与应用的桥梁&#xff0c;其重要性不言而喻。华为推出的HarmonyOS&#xff08;鸿蒙操作系统&#xff09;&#xff0c;自诞生以来便备受瞩目&#xff0c;它不仅承载着华为对未来智能生态的愿景&#xff0c;更以其独特的分布…

Linux基础(二十一)——认识系统服务(daemons)

认识系统服务 &#xff08; daemons&#xff09; 1.daemon 与服务 &#xff08; service&#xff09;2. systemd3. systemctl4. systemctl 配置文件 1.daemon 与服务 &#xff08; service&#xff09; 在 Linux 和类 Unix 系统中&#xff0c;daemon&#xff08;守护进程&…

QT QChart+Eigen库绘制线性回归散点图

QChart+Eigen库绘制线性回归散点图 老套路,一图胜千言 项目结构 代码 mainwindow.h #ifndef MAINWINDOW_H #

uniapp开发微信小程序笔记4-自定义组件

前言&#xff1a;本文重点记录的是uniapp如何封装一个自定义组件&#xff0c;以swiper组件为例。 一、创建组件目录 官方文档中的easycom组件规范中可以看到这样一句话&#xff1a; 只要组件安装在项目的components目录下或uni_modules目录下&#xff0c;并符合components/组…

(三)反向传播 Backpropagation

文章目录 反向传播Backpropagation&#xff08;1&#xff09;Chain Rule&#xff08;2&#xff09;Forward pass和Backward pass 反向传播Backpropagation 对于计算Gradient Descent这件事情&#xff0c;我们的neural network是有非常非常多的参数&#xff0c;可能有上百万个参…

Dowex 50WX8 ion-exchange resin可以用于去除水中的金属离子(如钠、钾、镁、钙等)和其他杂质,提高水质,11119-67-8

一、基本信息 中文名称&#xff1a;Dowex 50WX8 离子交换树脂 英文名称&#xff1a;Dowex 50WX8 ion-exchange resin CAS号&#xff1a;11119-67-8 供应商&#xff1a;陕西新研博美生物科技 外观&#xff1a;米色至浅棕色或绿棕色粉末/微球状 纯度&#xff1a;≥95% 分子…

国标GB28181视频平台EasyCVR视频融合平台H.265/H.264转码业务流程

在当今数字化、网络化的视频监控领域&#xff0c;大中型项目对于视频监控管理平台的需求日益增长&#xff0c;特别是在跨区域、多设备、高并发的复杂环境中。EasyCVR视频监控汇聚管理平台正是为了满足这些需求而设计的&#xff0c;它不仅提供了全面的管理功能&#xff0c;还支持…

一家餐饮企业,「闯入」AI阵地

作者| 皮爷 出品|产业家 “我们需要用AI来帮助我们门店破除内卷的状态。”一位连锁餐饮品牌告诉产业家&#xff0c;“这也是我们想尽快把AI用起来的原因&#xff0c;看看能不能带来一些帮助。” 这种情况正发生在一众餐饮企业中。 与这种情况对应的一个背景是&#xff0c…

基于YOLOv8深度学习的智慧社区建筑外墙破损(裂缝、露筋、剥落)检测系统研究与实现(PyQt5界面+数据集+训练代码)

随着智慧社区的发展&#xff0c;对建筑结构健康状况的实时监测变得愈发重要。在此背景下&#xff0c;建筑外墙破损&#xff08;如裂缝、露筋和剥落&#xff09;等问题对建筑物整体结构的安全性和耐久性构成了严重威胁&#xff0c;及时、准确地检测这些问题变得尤为关键。传统的…

单片机UART协议相关知识

概念 UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff0c;通用异步收发传输器&#xff09; 是一种 异步 串行 全双工 通信协议&#xff0c;用于设备一对一进行数据传输&#xff0c;只需要两根线&#xff08;TX&#xff0c;RX&#xff09;。 异步&…

Python模块、迭代器与正则表达式day10

1、Python模块 1.1模块的简介 在编写代码的时候&#xff0c;创建的.py文件就被称为一个模块 1.2模块的使用 想要在a文件里使用b文件的时候&#xff0c;只要在a文件中使用关键字import导入即可 1.2.2 from ...import...语句 导入模块可以使用import&#xff0c;如果只导入模…

DDD架构设计知道(1)

看过很多人写架构设计的文章&#xff0c;绝大多数都是站在企业的角度谈“术”的层面。而当今的时代社会特别是00后门更多的会站在个人的角度&#xff0c;去看架构设计。个体和超级单体时代也已经来临&#xff0c;很多传统意义上的企业管理模式也在改变。所以如果架构设计面对当…

ubuntu下连接了192.168.1.x和192.168.2.x两个网络段,如何让这个两个网段互相通信?

在 Ubuntu 上连接两个网络段&#xff08;如 个人终端A 192.168.1.10 和 个人终端B 192.168.2.10&#xff09;&#xff0c;需要配置路由和网络转发功能&#xff0c;使这两个网段能够相互通信。以下是实现方法&#xff1a; 步骤 1&#xff1a;确认网络配置 1. 确保 Ubuntu 机器…

Shell脚本5 -- 脚本与用户交互read

声明&#xff1a; 本文的学习内容来源于B站up主“泷羽sec”视频【shell编程&#xff08;4&#xff09;脚本与用户交互以及if条件判断】的公开分享&#xff0c;所有内容仅限于网络安全技术的交流学习&#xff0c;不涉及任何侵犯版权或其他侵权意图。如有任何侵权问题&#xff0c…

mysql5.7主从问题记录

项目运行一段时间后突然打印如下异常信息。 由于现场环境和数据库是客户提供&#xff0c;看异常提示一直以为是代码问题&#xff0c;导致锁表。 通过逐步排查之后发现&#xff0c;是binlog把磁盘占满了&#xff0c;让客户的DBA设置了一下就恢复。 当设置了主从同步之后&…

使用卷积自编码器进行图像重构

1. 自编码器简介 自编码器&#xff08;Autoencoder&#xff09;是一种无监督学习的神经网络模型&#xff0c;旨在学习数据的有效表示。自编码器的主要组成部分包括编码器和解码器&#xff0c;二者共同工作以实现数据的压缩和重构。以下是自编码器的详细介绍&#xff1a; 1.1 …

鸿蒙实战:页面跳转传参

文章目录 1. 实战概述2. 实现步骤2.1 创建鸿蒙项目2.2 编写首页代码2.3 新建第二个页面 3. 测试效果4. 实战总结 1. 实战概述 本次实战&#xff0c;学习如何在HarmonyOS应用中实现页面间参数传递。首先创建项目&#xff0c;编写首页代码&#xff0c;实现按钮跳转至第二个页面并…

恶意代码分析入门--静态分析(chapter1_Lab01-01)

恶意代码分析-工具收集 - 17bdw - 博客园 (cnblogs.com) 实验环境&#xff1a;Lab 1-1 这个实验使用Lab01-01.exe和Lab01-01.dll文件&#xff0c;使用本章描述的工具和技术来获取 关于这些文件的信息。 操作环境 操作场景&#xff1a; windows xp sp3 实验工具&#xff1a; PEi…

【操作系统不挂科】<信号量(9)>选择题(带答案与解析)

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