简单爬虫的实现

server/2024/11/19 14:14:35/

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

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.ppmy.cn/server/143204.html

相关文章

Python学习随笔(BSON数据格式 Python库的相对导入 文档字符串注释 Python中类的静态方法定义)

文章目录 前言BSON数据格式库的相对导入文档字符串注释类的静态方法 前言 博主写一篇质量相对比较好好的博文还是很费时间的&#xff0c;因为往往好的博文都需要非常精心构思&#xff0c;需要有大量的内容&#xff0c;并且对这些内容的结构进行非常详细的梳理&#xff0c;然后…

SQL MID() 函数详解

SQL MID() 函数详解 SQL 中的 MID() 函数是一个非常有用的字符串处理工具&#xff0c;它允许用户从字符串中提取特定位置的子字符串。这个函数在数据库查询和报告中特别有用&#xff0c;尤其是在需要从较长的文本字段中提取特定信息时。本文将详细介绍 MID() 函数的用法、参数…

集群搭建高可用

contos7.9 部署3节点 hadoop3.4 高可用集群 contos7.9 部署3节点 hadoop3.4 高可用集群环境信息Hadoop与Zookeeper的版本对应关系服务器角色分配使用端口服务器配置配置免密登录服务器配置初始化 init_server.sh配置主机名映射所有节点配置 hosts文件 hadoop 安装环境配置下载安…

C++中的适配器模式

适配器模式&#xff08;Adapter Pattern&#xff09; 适配器模式是一种结构型设计模式&#xff0c;它使得原本由于接口不兼容而不能一起工作的类可以协同工作。适配器模式通过将一个类的接口转换成客户端希望的另一种接口&#xff0c;使得原本接口不兼容的类可以一起工作。适配…

华为OD机试-日志采集 E100

题目描述 日志采集是运维系统的的核心组件。日志是按行生成&#xff0c;每行记做一条&#xff0c;由采集系统分批上报。 如果上报太频繁&#xff0c;会对服务端造成压力; 如果上报太晚&#xff0c;会降低用户的体验; 如果一次上报的条数太多&#xff0c;会导致超时失败。 …

Unity类银河战士恶魔城学习总结(P127 Stat ToolTip属性提示)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址&#xff1a;https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了把鼠标放到属性上面就会显示属性的作用 UI_StatToolTip.cs 这段代码实现了一个UI提示框&#xff08;ToolTip&#xff09;功能…

基于YOLOv8深度学习的无人机视角军事打击目标检测系统研究与实现(PyQt5界面+数据集+训练代码)

随着无人机技术的迅速发展及其在军事领域的广泛应用&#xff0c;精准目标检测逐渐成为现代战场中提升打击效能和战术决策的关键技术之一。无人机因其灵活性、机动性和高效性&#xff0c;已经成为现代战争中不可或缺的侦察与打击工具。在复杂多变的战场环境中&#xff0c;及时、…

【python】掌握 Flask:轻量级 Web 开发框架解析

【Python】掌握 Flask&#xff1a;轻量级 Web 开发框架解析 引言 Flask 是一个轻量级、灵活且广受欢迎的 Python Web 开发框架。它以其简单易用、模块化和强大的扩展功能而闻名&#xff0c;适合用于小型应用和快速原型设计。同时&#xff0c;Flask 提供了一系列工具和库&…