102302109-胡贝贝-作业3

news/2025/11/17 21:22:47/文章来源:https://www.cnblogs.com/hubeibei/p/19214108

作业①
(1)实验内容及结果
要求:指定一个网站,爬取这个网站中的所有的所有图片,例如:中国气象网(http://www.weather.com.cn)。实现单线程和多线程的方式爬取。
–务必控制总页数(学号尾数2位)、总下载的图片数量(尾数后3位)等限制爬取的措施。
核心代码:

def single_thread_crawler():"""单线程爬虫"""print("--- 开始单线程爬虫 ---")global visited_urls, downloaded_images_count, crawled_pages_countvisited_urls.clear()downloaded_images_count = 0crawled_pages_count = 0urls_to_visit = [BASE_URL,'http://www.weather.com.cn/news/','http://pic.weather.com.cn/','http://www.weather.com.cn/sj/']while urls_to_visit and crawled_pages_count < MAX_PAGES and downloaded_images_count < MAX_IMAGES:current_url = urls_to_visit.pop(0)if current_url in visited_urls:continuevisited_urls.add(current_url)new_urls = crawl_page(current_url)# 添加新URL到列表末尾urls_to_visit.extend([url for url in new_urls if url not in visited_urls])time.sleep(1)print("--- 单线程爬虫结束 ---")def multi_thread_crawler():"""多线程爬虫"""print("--- 开始多线程爬虫 ---")global visited_urls, downloaded_images_count, crawled_pages_count, url_queuevisited_urls.clear()downloaded_images_count = 0crawled_pages_count = 0# 清空队列while not url_queue.empty():url_queue.get()# 提供多个种子URLseed_urls = [BASE_URL,'http://www.weather.com.cn/news/','http://pic.weather.com.cn/','http://www.weather.com.cn/sj/']# 将种子URL加入队列for url in seed_urls:url_queue.put(url)# 创建工作线程max_workers = min(5, len(seed_urls))  with ThreadPoolExecutor(max_workers=max_workers) as executor:futures = [executor.submit(worker_thread) for _ in range(max_workers)]for future in as_completed(futures):try:future.result()except Exception as e:print(f"线程异常: {e}")print("--- 多线程爬虫结束 ---")

输出信息:
image
image
image

Gitee文件夹链接:https://gitee.com/hu_beibei/data-collection-practice/tree/master/102302109_胡贝贝_作业3/作业1
 (2)实验心得
通过爬取中国气象网图片,我掌握了单线程与多线程爬虫的实现方法,并认识到合理控制请求频率的重要性。多线程显著提升了爬取效率,但需注意线程数量以避免反爬机制。

作业②
(1)实验内容及结果
要求:熟练掌握 scrapy 中 Item、Pipeline 数据的序列化输出方法;使用scrapy框架+Xpath+MySQL数据库存储技术路线爬取股票相关信息。
候选网站:东方财富网:https://www.eastmoney.com/
核心代码:

class EastmoneyStockSpider(scrapy.Spider):name = 'eastmoney_stock'def start_requests(self):self.logger.info("开始爬取东方财富股票数据")base_url = "http://82.push2.eastmoney.com/api/qt/clist/get"params = {'pn': '1','pz': '500','po': '1','np': '1','ut': 'bd1d9ddb04089700cf9c27f6f7426281','fltt': '2','invt': '2','fid': 'f3','fs': 'm:0+t:6,m:0+t:80,m:1+t:2,m:1+t:23','fields': 'f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152','_': str(int(time.time() * 1000))}api_url = base_url + '?' + '&'.join([f"{k}={v}" for k, v in params.items()])yield scrapy.Request(url=api_url,callback=self.parse_api,headers={'Referer': 'http://quote.eastmoney.com/','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'},meta={'source': 'api'})def parse_api(self, response):self.logger.info("解析API数据")try:json_text = response.text# 处理JSONP格式if json_text.startswith('jQuery') or json_text.startswith('callback'):start_index = json_text.find('({')end_index = json_text.rfind('})') + 2if start_index != -1 and end_index != -1:json_text = json_text[start_index:end_index]data = json.loads(json_text)stocks = data.get('data', {}).get('diff', [])self.logger.info(f" 从API获取到 {len(stocks)} 只股票数据")current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')count = 0for stock in stocks:item = StockItem()item['id'] = count + 1item['stock_code'] = stock.get('f12', '')item['stock_name'] = stock.get('f14', '')item['latest_price'] = stock.get('f2', 0)item['change_percent'] = stock.get('f3', 0)item['change_amount'] = stock.get('f4', 0)item['volume'] = self.format_number(stock.get('f5', 0))item['amplitude'] = stock.get('f7', 0)item['high'] = stock.get('f15', 0)item['low'] = stock.get('f16', 0)item['open_price'] = stock.get('f17', 0)item['close_price'] = stock.get('f18', 0)item['crawl_time'] = current_timeif item['stock_code'] and item['stock_name']:count += 1if count <= 50:  # 只打印前5条日志self.logger.info(f"提取: {item['stock_name']}({item['stock_code']}) - {item['latest_price']}")yield itemself.logger.info(f" 成功处理 {count} 只股票数据")except Exception as e:self.logger.error(f" API解析失败: {e}")

输出信息:
image
image
image

Gitee文件夹链接:https://gitee.com/hu_beibei/data-collection-practice/tree/master/102302109_胡贝贝_作业3/作业2/stock_eastmoney
 (2)实验心得
使用Scrapy框架爬取东方财富网股票数据,我熟悉了Xpath选择器和Item、Pipeline的使用。通过将数据存储到MySQL,我理解了数据清洗和持久化的流程。

作业③
(1)实验内容及结果
要求:熟练掌握 scrapy 中 Item、Pipeline 数据的序列化输出方法;使用scrapy框架+Xpath+MySQL数据库存储技术路线爬取外汇网站数据。
候选网站:中国银行网:https://www.boc.cn/sourcedb/whpj/
核心代码:

 import scrapy
from forex_project.items import ForexItemclass BocSpiderSpider(scrapy.Spider):name = 'boc_spider'allowed_domains = ['www.boc.cn']start_urls = ['https://www.boc.cn/sourcedb/whpj/']def parse(self, response):# 打印页面标题用于调试self.logger.info(f"页面标题: {response.css('title::text').get()}")# 尝试多种XPath选择器rows = response.xpath('//table//tr')# 如果没有找到表格行,尝试其他选择器if not rows:rows = response.xpath('//tr')self.logger.info(f"使用备用选择器,找到 {len(rows)} 行")self.logger.info(f"找到 {len(rows)} 行数据")for i, row in enumerate(rows[1:], 1):  # 跳过表头item = ForexItem()# 提取所有列文本columns = row.xpath('./td//text()').getall()# 清理数据:移除空字符串和换行符columns = [col.strip() for col in columns if col.strip()]self.logger.debug(f"第{i}行数据: {columns}")if len(columns) >= 7:try:item['currency'] = columns[0]item['tbp'] = columns[1]  # 现汇买入价item['cbp'] = columns[2]  # 现钞买入价item['tsp'] = columns[3]  # 现汇卖出价item['csp'] = columns[4]  # 现钞卖出价item['time'] = columns[6]  # 发布时间# 验证必要字段if item['currency']:self.logger.info(f"成功提取: {item['currency']}")yield itemelse:self.logger.warning(f"第{i}行货币名称为空")except Exception as e:self.logger.error(f"处理第{i}行时出错: {e}, 数据: {columns}")else:self.logger.warning(f"第{i}行列数不足: {len(columns)}列,期望至少7列")

输出信息:
image
image
image
Gitee文件夹链接:https://gitee.com/hu_beibei/data-collection-practice/tree/master/102302109_胡贝贝_作业3/作业3/forex_project
(2)实验心得
爬取中国银行外汇数据让我进一步熟练了Scrapy框架。我体会到精确的Xpath选择器的重要性,并成功将数据序列化存储到数据库。

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

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

相关文章

halt linux

在 Linux 系统中,halt 命令用于关机系统。它会立即终止所有正在运行的进程,并将系统状态设置为“关机”状态。 常用用法: sudo halt 或者: sudo poweroff 这两个命令的作用是相同的,但 poweroff 会更优雅地处理系…

hadoop linux 安装

在 Linux 系统上安装 Hadoop 需要以下几个步骤,包括系统准备、下载 Hadoop、解压安装、配置环境变量、启动集群等。以下是一个通用的安装指南,适用于大多数 Linux 发行版(如 Ubuntu、CentOS、Debian 等)。一、系统…

2025最新展柜设计公司推荐,展柜制作公司,展台源头厂家,烤漆展柜十大品牌推荐榜,家纺柜台供应厂家十大排行榜:梵之宇装饰推荐

2025最新展柜设计公司推荐,展柜制作公司,展台源头厂家,烤漆展柜十大品牌推荐榜,家纺柜台供应厂家十大排行榜:梵之宇装饰推荐2025最新展柜设计公司推荐,展柜制作公司,展台源头厂家,烤漆展柜十大品牌推荐榜,家纺…

团队技术资产建设:从散兵游勇到标准化作战

好的,这是一个能充分展现您技术领导力和工程化思维的问题。下面我将为您系统地阐述如何从0到1规划、设计并推动团队技术资产的建设。团队技术资产建设:从散兵游勇到标准化作战 提升100%的开发效率并非一蹴而就,它是…

2025年11月学习机榜单:打破智商税偏见,十大提分机型实证推荐

2025年11月学习机榜单:打破智商税偏见,十大提分机型实证推荐“学习机是智商税” 的偏见,本质是对 “低效工具” 的否定 —— 但 2025 年艾媒咨询数据显示,具备 “精准诊断 - 定向训练 - 效果追踪” 全链路能力的 A…

解决罗技M590右键必须用力才能使用的问题

罗技M590用了好几年了,最近频繁出现右键轻点没有反应的情况,必须用力才能弹出右键菜单,一开始还以为是微动问题,物理方法替换微动弹簧片也没有解决问题,后来发现是因为模具与微动接触的地方磨损出现空行程导致的.那就…

悼念故友

美人离思远,湘水夜来深美人离思远,湘水夜来深 我的生命中曾有一位非常非常重要的人。 我们一起观春花,爬夏树,拾秋叶,赏冬雪。 我们一起上学,一起闯祸,一起FQ翘课,一起登台演出。 我们一起上过道观,进过寺庙,…

UV python管理工具 mac电脑

python3.9为系统自带的 pip3pip 对应的是uv 3.13 系统配置了pip路径 也设置了软连接 所有是pip ls -la /Users/peter/.local/bin/ | grep pip 查看软连接 uv python包管理器 uv python list 查看安装的python uv pyth…

题解:uoj632【UR #21】挑战最大团

题意:给出一个无向图,其满足以下性质:若存在边 \((a,b),(b,c),(c,d)\),则 \((a,c),(a,d),(b,d)\) 不能同时不存在。求图中大小为 \(1,2,3\cdots n\) 的团的个数。\(n\le 8000\)。 做法: 直接做是 npc,考虑发掘性…

[CSP-S 2025] 员工招聘 / employ

P14364 [CSP-S 2025] 员工招聘 / employ 先初步分析一下录取的条件:\(s_i=0\) 此时一定不会被录取 \(s_i=1\) 记之前被淘汰的人数为 \(j\),则若 \(c_{p_i}>j\) 则会被录取,\(c_{p_i}\le j\) 不会被录取。考虑一个…

20232410 2025-2026-1 《网络与系统攻防技术》实验六实验报告

1.实验内容 掌握Metasploit的基础操作:模块搜索(search)、加载(use)、参数配置(set)、攻击执行(exploit/run)及会话管理(sessions)。 理解4类漏洞的核心原理,明确漏洞与靶机开放端口、服务的对应关系。 能…

sequence 题解

原题链接。 首先这个数据范围就很 meet in middle。 首先一个关键性质是对于任意的一个顶到界限的 \(a\) 都能保它顶到界限那一位后面的位数合法,因为它后面随便选就意味着一定能通过调整使得后面的位置异或完是零。 …

2025上海商铺办公室装修公司推荐指南:业态适配与TOP10实力榜

2025上海商铺办公室装修公司推荐指南:业态适配与TOP10实力榜一、商铺装修公司核心评估维度(基于商业空间需求定制) 据《上海市商业空间装饰服务标准(2025 版)》,优质商铺装修服务商需满足六大针对性指标,适配餐…

FastAPI Test Project

# FastAPI Test Project## 项目简介 这是一个使用 FastAPI 框架的测试项目。## 技术栈 - Python >= 3.13 - FastAPI >= 0.121.2 - Uvicorn >= 0.38.0 - uv (包管理工具)## 环境配置### 虚拟环境说明 本项目使…

React Scheduler(调度器)

非常好!React Scheduler(调度器)是React并发能力的引擎,是理解React高性能更新的关键。它独立于React本身,是一个用于在浏览器中调度任务的通用库。 让我们深入剖析React调度器的核心机制。一、调度器是什么?为什…

2025年11月学习机榜单:双线提分机型领衔,十大高性价比之选

2025年11月学习机榜单:双线提分机型领衔,十大高性价比之选孩子放学回家,居家自学缺方法、线下补漏效率低,新课标改革后知识梯度拉升,家长既难同步校内进度,又难精准帮孩子突破薄弱点 —— 这成了 2025 年秋季开学…

Hier-SLAM++ (2) MeshGPT:仅使用解码器Transformer生成三角形网格 - MKT

Hier-SLAM++ (2) MeshGPT:仅使用解码器Transformer生成三角形网格 MeshGPT: Generating Triangle Meshes with Decoder-Only Transformershttps://github.com/audi/MeshGPTMeshGPT通过对经过训练的Transformer模型进…

2025.11.10训练记录

noip模拟赛。 因为喝了咖啡没有睡觉。costa的瓶装拿铁真的特别难喝。 T1 图上加边删边,维护连通块大小的积。 一开始以为直接可撤销并查集就可以做。直接去看T2了,看了一会儿回来实现。 想了一下,感觉也许可以直接撤…

Day41(11)-F:\硕士阶段\Java\课程代码\后端\web-ai-code\web-ai-project02\tlias-web-management

Mybatis 配置文件spring:application:name: springboot-mybatis-quickstart#数据库的连接信息datasource:type: com.alibaba.druid.pool.DruidDataSourceurl: jdbc:mysql://localhost:3306/web01driver-class-name: co…

vue2和vue3声明式和命令时的区别

这是一个非常好的问题,它触及了Vue2到Vue3最核心的演进逻辑。Vue3在保留声明式本质的基础上,通过更底层的命令式API,让开发者能够编写出更具声明性、更易维护的代码。 让我们来深入剖析Vue2和Vue3在声明式与命令式上…