数据采集与融合技术实践作业3

news/2025/1/20 3:53:10/文章来源:https://www.cnblogs.com/fzu-ljs/p/18514812

102202143 梁锦盛

1.中国气象网信息爬取

爬取这个网站中的所有图片,控制总页数(学号尾数2位)、总下载的图片数量(尾数后3位)等限制爬取的措施

一、作业代码与展示

1.编写spider代码文件

import scrapy
from urllib.parse import urljoin
from scrapy.pipelines.images import ImagesPipelineclass A31Spider(scrapy.Spider):name = 'weather'allowed_domains = ['weather.com.cn']start_urls = ['http://www.weather.com.cn/']  # 修正了URLheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',}def parse(self, response):# 提取页面中的所有图片链接并补全 URLimage_urls = [urljoin(response.url, url) for url in response.css('img::attr(src)').getall()]# 输出图片链接for url in image_urls:self.log(f'Downloading image: {url}')# 递归访问子链接,只跟随有效的 URLfor next_page in response.css('a::attr(href)').getall():if next_page.startswith("http"):yield response.follow(next_page, self.parse)# 返回图片链接if image_urls:yield {'image_urls': image_urls}

2.编写piplines代码文件

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html# useful for handling different item types with a single interface
from itemadapter import ItemAdapterfrom scrapy.pipelines.images import ImagesPipeline
import scrapyclass MyImagesPipeline(ImagesPipeline):def __init__(self, store_uri, *args, **kwargs):super(MyImagesPipeline, self).__init__(store_uri, *args, **kwargs)self.downloaded_count = 0self.target_count = 143  # 目标下载数量@classmethoddef from_settings(cls, settings):store_uri = settings.get('IMAGES_STORE')  # 获取存储图片的路径return cls(store_uri)def get_media_requests(self, item, info):for image_url in item['image_urls']:yield scrapy.Request(image_url)def file_path(self, request, response=None, info=None):return f'images/{request.url.split("/")[-1]}'def item_completed(self, results, item, info):# 检查是否成功下载图片for ok, result in results:if ok:self.downloaded_count += 1# 检查是否达到目标下载数量if self.downloaded_count >= self.target_count:self.close_spider(reason='Reached target download count')breakreturn itemdef close_spider(self, spider, reason):spider.crawler.engine.close_spider(spider, reason=reason)class Hw1Pipeline:def process_item(self, item, spider):return item

3.编写settings代码文件,如果单线程可删除CONCURRENT_REQUESTS = 16代码

BOT_NAME = 'hw1'SPIDER_MODULES = ['hw1.spiders']
NEWSPIDER_MODULE = 'hw1.spiders'
LOG_LEVEL = 'ERROR'
# 设置每个请求之间的下载延迟(单位:秒)
CONCURRENT_REQUESTS = 16  # 并发请求的数量
DOWNLOAD_DELAY = 0.25  # 每请求之间的延迟时间,单位为秒# 在settings.py中配置管道
ITEM_PIPELINES = {'hw1.pipelines.MyImagesPipeline': 1,  # 替换 `your_project_name` 为你的实际项目名称
}IMAGES_STORE = 'E:\\Pycharm\\数据采集\\作业代码\\实验3\\hw1'

4.运行结果


3.Gitee文件夹链接:https://gitee.com/liang-jinsheng-289668/project/tree/master/作业3/3.1

二、作业心得

scrapy的多线程存储免去了python中threading的许多麻烦,更方便地允许我们实现大量数据的爬取

2.东方财富网信息爬取

熟练掌握 scrapy 中 Item、Pipeline 数据的序列化输出方法;使用scrapy框架+Xpath+MySQL数据库存储技术路线爬取股票相关信息。候选网站:东方财富网:https://www.eastmoney.com/

一、作业代码与展示

1.编写spider代码

import scrapy
import jsonfrom ..items import StockItemclass EastmoneySpider(scrapy.Spider):name = 'eastmoney'allowed_domains = ['eastmoney.com']start_urls = ['https://quote.eastmoney.com/center/gridlist.html#hs_a_board']def start_requests(self):for page_number in range(1, 6):  # 爬取前5页url = f'https://12.push2.eastmoney.com/api/qt/clist/get?cb=jQuery1124049801084556447983_1730190060013&pn={page_number}&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&dect=1&wbp2u=|0|0|0|web&fid=f3&fs=m:0+t:6,m:0+t:80,m:1+t:2,m:1+t:23,m:0+t:81+s:2048&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&_=1730190060014'yield scrapy.Request(url=url, callback=self.parse, cookies=self.get_cookies(), headers=self.get_headers())def get_headers(self):return {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36'}def get_cookies(self):return {'qgqp_b_id': '2d31e8f17cf8a3447185efdf4e253235','st_si': '66228653710444','st_asi': 'delete','st_pvi': '25044947399556','st_sp': '2024-10-15 16:41:44','st_inirUrl': 'https://www.eastmoney.com/','st_sn': '13','st_psi': '20241015165715752-111000300841-2878299811'}def parse(self, response):json_data = response.text[response.text.index('(') + 1: -2]data = json.loads(json_data)if 'data' in data and 'diff' in data['data']:for stock in data['data']['diff']:item = StockItem()item['bStockNo'] = stock.get('f62')  # 股票代码item['bStockName'] = stock.get('f14')  # 股票名称item['fPrice'] = stock.get('f2')  # 最新报价item['fPriceChangeRate'] = stock.get('f3')  # 涨跌幅item['fPriceChange'] = stock.get('f4')  # 涨跌额item['fVolume'] = stock.get('f5')  # 成交量item['fAmount'] = stock.get('f6')  # 成交额item['fAmplitude'] = stock.get('f7')  # 振幅item['fHigh'] = stock.get('f8')  # 最高item['fLow'] = stock.get('f9')  # 最低item['fOpen'] = stock.get('f10')  # 今开item['fClose'] = stock.get('f11')  # 昨收yield item

2.编写items代码

# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.htmlimport scrapyclass StockItem(scrapy.Item):bStockNo = scrapy.Field()  # 股票代码bStockName = scrapy.Field()  # 股票名称fPrice = scrapy.Field()  # 最新报价fPriceChangeRate = scrapy.Field()  # 涨跌幅fPriceChange = scrapy.Field()  # 涨跌额fVolume = scrapy.Field()  # 成交量fAmount = scrapy.Field()  # 成交额fAmplitude = scrapy.Field()  # 振幅fHigh = scrapy.Field()  # 最高fLow = scrapy.Field()  # 最低fOpen = scrapy.Field()  # 今开fClose = scrapy.Field()  # 昨收

3.编写piplines代码

import mysql.connector
from mysql.connector import Error
from hw2.items import StockItemclass StockPipeline:def __init__(self):self.connection = self.connect_to_database()def connect_to_database(self):try:connection = mysql.connector.connect(host='localhost',database='stock_database',user='root',password='2896685056Qq!')return connectionexcept Error as e:print(f"Error: {e}")def process_item(self, item, spider):cursor = self.connection.cursor()query = ("INSERT INTO stock_table ""(bStockNo, bStockName, fPrice, fPriceChangeRate, fPriceChange, fVolume, fAmount, fAmplitude, fHigh, fLow, fOpen, fClose) ""VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)")data = (item['bStockNo'],item['bStockName'],item['fPrice'],item['fPriceChangeRate'],item['fPriceChange'],item['fVolume'],item['fAmount'],item['fAmplitude'],item['fHigh'],item['fLow'],item['fOpen'],item['fClose'])cursor.execute(query, data)self.connection.commit()cursor.close()return item

4.编写settings代码

BOT_NAME = 'hw2'SPIDER_MODULES = ['hw2.spiders']
NEWSPIDER_MODULE = 'hw2.spiders'
DOWNLOAD_DELAY = 1.0  # 1秒延迟
ROBOTSTXT_OBEY = False
ITEM_PIPELINES = {'hw2.pipelines.StockPipeline': 300,
}# MySQL数据库配置
MYSQL_HOST = 'localhost'
MYSQL_USER = 'root'
MYSQL_PASSWORD = '2896685056Qq!'
MYSQL_DB = 'stock_database'

5.运行结果


6.Gitee文件夹链接:https://gitee.com/liang-jinsheng-289668/project/tree/master/作业3/3.2/hw2

二、作业心得

一个一个对应数据库里面的表格属性进行插入,使用scrapy的pipline能够帮助我们更好地与数据库联通存储

3.外汇网站数据爬取

熟练掌握 scrapy 中 Item、Pipeline 数据的序列化输出方法;使用scrapy框架+Xpath+MySQL数据库存储技术路线爬取外汇网站数据。候选网站:中国银行网:https://www.boc.cn/sourcedb/whpj/

一、作业代码与展示

1.分析页面源代码

2.编写spider代码

import scrapy
from ..items import ForexItemclass SourceSpider(scrapy.Spider):name = 'source'allowed_domains = ['boc.cn']start_urls = ['https://www.boc.cn/sourcedb/whpj/']def parse(self, response):rows = response.xpath('//div/table/tr')for row in rows:  # 跳过表头item = ForexItem()item['currency'] = row.xpath('./td[1]/text()').get()item['tbp'] = row.xpath('./td[2]/text()').get()item['cbp'] = row.xpath('./td[3]/text()').get()item['tsp'] = row.xpath('./td[4]/text()').get()item['csp'] = row.xpath('./td[5]/text()').get()item['time'] = row.xpath('./td[8]/text()').get()yield item

3.编写items代码

import scrapyclass ForexItem(scrapy.Item):currency = scrapy.Field()  # 货币名称tbp = scrapy.Field()  # 现汇买入价cbp = scrapy.Field()  # 现钞买入价tsp = scrapy.Field()  # 现汇卖出价csp = scrapy.Field()  # 现钞卖出价time = scrapy.Field()  # 发布时间

4.编写piplines代码

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html# useful for handling different item types with a single interface
from itemadapter import ItemAdapterimport mysql.connector
from .items import ForexItemclass ForexPipeline:def open_spider(self, spider):self.connection = mysql.connector.connect(host='localhost',database='forex_db',user='root',password='2896685056Qq!')self.cursor = self.connection.cursor()def close_spider(self, spider):self.cursor.close()self.connection.close()def process_item(self, item, spider):self.cursor.execute("""INSERT INTO forex_rates (currency, tbp, cbp, tsp, csp, time)VALUES (%s, %s, %s, %s, %s, %s)""", (item['currency'],item['tbp'],item['cbp'],item['tsp'],item['csp'],item['time']))self.connection.commit()return item

5.编写settings代码

BOT_NAME = 'hw3'SPIDER_MODULES = ['hw3.spiders']
NEWSPIDER_MODULE = 'hw3.spiders'ITEM_PIPELINES = {'hw3.pipelines.ForexPipeline': 300,
}# MySQL数据库配置
MYSQL_HOST = 'localhost'
MYSQL_USER = 'root'
MYSQL_PASSWORD = '2896685056Qq!'
MYSQL_DB = 'forex_db'

运行结果


Gitee文件夹链接:https://gitee.com/liang-jinsheng-289668/project/tree/master/作业3/3.3/hw3

二、作业心得

结合scrapy和xpath,将数据存储到数据库中,能够对页面源代码能够提取的数据进行更好的处理存储了。

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

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

相关文章

Bluetooth Audio Receiver使用(Win10)

Bluetooth Audio Receiver有时失灵重置设置即可

Tauri(一)——更适合 Web 开发人员的桌面应用开发解决方案 ✅

背景 我们最近决定开发一个开源的桌面端应用程序(先卖个关子,会尽快推出,敬请期待!关注一下不迷路!),并选择了 Tauri 作为技术方案。可能只有少部分人了解过它,感兴趣的朋友们可以一起深入探讨! Tauri 介绍官方网站:https://tauri.app/ (v2.0) GitHub:https://git…

Zlibrary入口电子图书馆官网最新可用镜像网址(持续更新)

Zlibrary电子图书馆介绍 Zlibrary 是全球最大电子数字图书馆之一,藏书丰富,有超 982 万册电子书及 8483 万余篇学术期刊文章。其涵盖经典文学、理工学科、人文艺术、学术论文等广泛领域,能满足各类求知者阅读学习需求。Zlibrary如一座知识宝库,为人们探索知识提供广阔资源,…

MASM的使用和DOS调试(微机原理课程作业)

1、指令 ———————————————— t:执行下一条语句。 u:查看汇编代码。 g:跳转到该内存所对应的语句 r:查看寄存器的内容(后可直接接寄存器的名称,就只查看该寄存器的内容)。 d:后接内存地址,查看该地址后面 8 * 16 个字节空间的地址(每行 16 个字节,共 8…

24山东省赛wp

24山东省赛wpmisc ezpic 在这个通道可以看到二维码扫一下能看到前半flag010里看到后半flag简单编码根据提示有,我们可以找到rot系列的rot13和rot47,尝试一下就有flag了pwn epwn 这回真是ezpwn了( 检查保护IDA找到漏洞函数gets和偏移量以及后门函数于是可以快乐的写exp了 from p…

Animal Controller文档——General

General 在General选项卡中,你会找到可以修改的最常用参数(AC)。Parameters Player如果设置为true,该Animal将是你的主角。 这将使用单例模式,并设置静态值:Animal.isPlayer.Value = true;。这样,Respawn System和CheckPoints将知道在Animal死亡时应该重生哪个主Animal(…

VUEDjango开发-1-环境搭建

一、使用pyenv,安装python,创建虚拟环境 pyenv是管理python版本的神器,官方链接:github.com/pyenv/pyenv,在macOS、Linux、Windows上均可以安装使用。 使用自动脚本一键安装 curl https://pyenv.run | bash配置SHELL环境 对于Zsh,运行如下命令,把pyenv命令安装到 ~/.zsh…

总线协议系列——USART协议初探

前言 概述 USART全名Universal Synchronous/Asynchronous Receiver/Transmitter,也即通用同步/异步串行接收/发送器。是一种异步全双工点对点总线架构,其总共需要TX传输线、RX接收线和GND共地线。如果两个USART硬件没有自主供电VCC,还需要VCC线 电路特性 USART总线采用推挽输…

Meterpreter生成被控端并进行远程控制

Meterpreter生成被控端并进行远程控制 Meterpreter简介 Meterpreter是kali中自带的用于渗透测试和漏洞利用的工具,它的本质上是一种payload, 允许使用者使用命令行执行命令的生成及执行 生成木马 msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=本机的ip lport=5000…

13. 分组数据

1. 数据分组 分组允许把数据分为多个逻辑组,以便能对每个组进行聚集计算 2. 创建分组 分组是在SELECT语句的GROUP BY子句中建立的。 比如: select vend_id, count(*) as num_prods from products group by vend_id;输出如下:上面的SELECT语句指定了两个列,vend_id包含产品供…

什么叫做网络编程

网络编程是一种编程实践,主要关注在网络环境中进行数据交换的应用程序的开发,包括了如何使用和理解各种协议、数据传输方式和网络架构等内容,以在不同计算机或系统间实现有效的信息交换。套接字是网络编程的基础,是网络上运行的程序之间进行数据交换的一种方式。什么叫做网…

Linux进程调度器-CPU负载

1. 概述 CPU负载(cpu load)指的是某个时间点进程对系统产生的压力。来张图来类比下(参考Understanding Linux CPU Load)CPU的运行能力,就如大桥的通行能力,分别有满负荷,非满负荷,超负荷等状态,这几种状态对应不同的cpu load值; 单CPU满负荷运行时cpu_load为1,当多个…