数据采集和融合技术作业3

news/2024/11/7 10:51:03/文章来源:https://www.cnblogs.com/xuwanyu/p/18523881

作业①:

1)指定一个网站,爬取这个网站中的所有的所有图片,例如:中国气象网(http://www.weather.com.cn)。使用scrapy框架分别实现单线程和多线程的方式爬取。

代码解析

weather_spiders.py文件

解析起始页面
def parse(self, response):urls = response.xpath('//div[@class="tu"]/a/@href').extract()for url in urls:yield scrapy.Request(url=url, callback=self.imgs_parse)
  • parse 方法是 Scrapy 默认的回调方法,处理响应并提取数据。
  • 使用 XPath 提取特定 div 下的所有链接,生成一个 URL 列表。
  • 对每个提取的 URL,创建一个新的 scrapy.Request,并将其交由 imgs_parse 方法处理。
解析图片链接
def imgs_parse(self, response):item = WeatherItem()item["pic_url"] = response.xpath('/html/body/div[3]/div[1]/div[1]/div[2]/div/ul/li/a/img/@src').extract()yield item
  • imgs_parse 方法用于处理每个图像页面的响应。
  • 创建 WeatherItem 实例以存储数据。
  • 使用 XPath 提取图像链接,并将其存储在 pic_url 字段中。
  • 最后,通过 yield 返回 item,将数据传递给 Scrapy 的管道处理。

pipelines.py文件

覆盖 get_media_requests 方法
def get_media_requests(self, item, info):for i in range(len(item['pic_url'])):yield scrapy.Request(url=item['pic_url'][i])
  • get_media_requests 方法负责生成每个图片的下载请求。
  • item 参数是 Scrapy Item 对象,包含了爬虫抓取到的数据。
  • info 参数是关于当前请求的信息。
覆盖 item_completed 方法
def item_completed(self, results, item, info):if not results[0][0]:raise DropItem('下载失败')return item
  • item_completed 方法在所有图片下载完成后调用。
  • results 是一个列表,每个元组包含两个元素,第一个元素是下载成功与否的布尔值,第二个元素是保存图片信息的字典。
  • 通过 if not results[0][0]: 判断第一个下载请求是否成功,如果失败,就抛出 DropItem 异常,以丢弃这个 item,且输出 '下载失败' 的消息。
  • 如果下载成功,返回原始的 item。

items.py文件


class WeatherItem(scrapy.Item):pic_url = scrapy.Field()

settings.py文件

  • Scrapy 默认是多线程的,但你可以通过配置来限制它的并发请求数,从而实现单线程和多线程的爬取。
    *单线程爬取
    CONCURRENT_REQUESTS = 1
  • 多线程爬取
    CONCURRENT_REQUESTS = 16

输出信息


Gitee文件夹链接

2)心得体会

  • XPath 的灵活性:XPath 是提取 HTML 表达式的强大工具。在代码中,正是利用 XPath 成功定位了所需数据。对于复杂的网页结构,掌握 XPath 能够简化数据提取过程。

  • Scrapy 工具链:Scrapy 的请求和回调机制使得抓取过程可以实现高效而清晰的工作流。通过 yield 返回请求和数据,保持了代码的简洁性与优雅性。

  • 数据处理:使用自定义的 WeatherItem 使得数据在抓取后可以方便地进行处理,这符合面向对象编程的理念,能够提升代码的模块化和重用性。

作业②

1)熟练掌握 scrapy 中 Item、Pipeline 数据的序列化输出方法;使用scrapy框架+Xpath+MySQL数据库存储技术路线爬取股票相关信息。

候选网站:东方财富网:https://www.eastmoney.com/

代码解析

stock_spiders.py文件

  • 定义 parse 方法,接收网页响应。
  • 使用 XPath 获取包含股票数据的 div 元素。
for stock in stocks:item = StockItem()item['bStockNo'] = stock.xpath('.//div[@class="code"]/text()').get()item['bStockName'] = stock.xpath('.//div[@class="name"]/text()').get()item['latestPrice'] = stock.xpath('.//div[@class="latest"]/text()').get()item['priceChangePercent'] = stock.xpath('.//div[@class="percent"]/text()').get()item['priceChange'] = stock.xpath('.//div[@class="change"]/text()').get()item['volume'] = stock.xpath('.//div[@class="volume"]/text()').get()item['amplitude'] = stock.xpath('.//div[@class="amplitude"]/text()').get()item['highest'] = stock.xpath('.//div[@class="highest"]/text()').get()item['lowest'] = stock.xpath('.//div[@class="lowest"]/text()').get()item['openPrice'] = stock.xpath('.//div[@class="open"]/text()').get()item['closePrice'] = stock.xpath('.//div[@class="close"]/text()').get()yield item
  • 遍历获取的股票数据,创建 StockItem 实例。
  • 使用 XPath 提取每个股票的各项信息,并赋值给 item。
  • 最后,使用 yield 将 item 返回。

pipelines.py文件

self.cursor = self.connection.cursor()
self.cursor.execute('''CREATE TABLE IF NOT EXISTS stocks (id INT PRIMARY KEY AUTO_INCREMENT,bStockNo VARCHAR(20),bStockName VARCHAR(100),latestPrice FLOAT,priceChangePercent FLOAT,priceChange FLOAT,volume VARCHAR(20),amplitude VARCHAR(20),highest FLOAT,lowest FLOAT,openPrice FLOAT,closePrice FLOAT)
''')
self.connection.commit()
  • 创建一个游标以执行 SQL 语句。
  • 检查并创建 stocks 表,如果表不存在的话。
def close_spider(self, spider):self.cursor.close()self.connection.close()
  • 定义 close_spider 方法,负责关闭数据库连接和游标。
def process_item(self, item, spider):self.cursor.execute('''INSERT INTO stocks (bStockNo, bStockName, latestPrice, priceChangePercent,priceChange, volume, amplitude, highest, lowest, openPrice, closePrice)VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)''', (item['bStockNo'], item['bStockName'], item['latestPrice'],item['priceChangePercent'], item['priceChange'], item['volume'],item['amplitude'], item['highest'], item['lowest'],item['openPrice'], item['closePrice']))self.connection.commit()return item
  • 定义 process_item 方法,处理每个抓取到的 item。
  • 使用 SQL 语句将数据插入数据库,并提交更改。

itmes.py

class StockItem(scrapy.Item):id = scrapy.Field()          # 序号bStockNo = scrapy.Field()    # 股票代码bStockName = scrapy.Field()  # 股票名称latestPrice = scrapy.Field() # 最新报价priceChangePercent = scrapy.Field() # 涨跌幅priceChange = scrapy.Field()  # 涨跌额volume = scrapy.Field()       # 成交量amplitude = scrapy.Field()    # 振幅highest = scrapy.Field()      # 最高lowest = scrapy.Field()       # 最低openPrice = scrapy.Field()    # 今开closePrice = scrapy.Field()   # 昨收

输出信息

Gitee文件夹链接

2)心得体会

  • 使用 pymysql 连接数据库是一种常见的做法,配置从 Scrapy 设置中获取,增强了灵活性和可维护性。

  • 写代码要考虑到良好的资源管理,确保在爬虫结束后释放数据库连接,有助于避免资源泄漏。

  • 可以考虑增加错误处理机制,以提高程序的鲁棒性。

作业③:

1)熟练掌握 scrapy 中 Item、Pipeline 数据的序列化输出方法;使用scrapy框架+Xpath+MySQL数据库存储技术路线爬取外汇网站数据。

候选网站:中国银行网:https://www.boc.cn/sourcedb/whpj/

代码解析

myspiders.py文件

  • 使用 XPath 获取数据的方式灵活且高效,为后续数据提取做好准备。
        for tr in trs[1:]:Currency = tr.xpath("./td[1]/text()").extract_first().strip()TSP = tr.xpath("./td[4]/text()").extract_first().strip()CSP = tr.xpath("./td[5]/text()").extract_first().strip()TBP = tr.xpath("./td[6]/text()").extract_first().strip()CBP = tr.xpath("./td[7]/text()").extract_first().strip()Time = tr.xpath("./td[8]/text()").extract_first().strip()
  • 遍历表格行,从每一行提取出所需的字段数据。
            item['Currency'] = Currencyitem['TSP'] = TSPitem['CSP'] = CSPitem['TBP'] = TBPitem['CBP'] = CBPitem['Times'] = Timeitem['Id'] = contcont += 1yield item
  • 将提取到的数据赋值给 item 对象,并通过 yield 返回。。

pipelines.py文件

        connect = pymysql.connect(host='localhost', user='chenshuo', password='cs031904104',database='cs031904104', charset='UTF-8') cur = connect.cursor()  
  • 建立数据库连接并创建游标,后续将使用该游标执行 SQL 命令。
        try:cur.execute("insert into rate_cs (id,Currency,TSP,CSP,TBP,CBP,Times) values ('%d','%s','%s','%s','%s','%s','%s')" % (item['Id'], item['Currency'].replace("'", "''"), item['TSP'].replace("'", "''"),item['CSP'].replace("'", "''"), item['TBP'].replace("'", "''"),item['CBP'].replace("'", "''"), item['Times'].replace("'", "''")))connect.commit()  # 提交命令except Exception as er:print(er)
  • 使用 try 块执行插入操作,捕获并打印可能发生的异常。
  • 使用 SQL 语句插入数据并提交更改,特别处理了单引号的问题以避免 SQL 错误。
        connect.close()  # 关闭与数据库的连接return item
  • 关闭数据库连接并返回处理后的 item。

items.py文件

class Exp42Item(scrapy.Item):Currency = scrapy.Field()TSP = scrapy.Field()CSP = scrapy.Field()TBP = scrapy.Field()CBP = scrapy.Field()Times = scrapy.Field()Id = scrapy.Field()pass

输出信息

Gitee文件夹链接

2)心得体会

  • 打印输出便于调试,帮助开发者查看数据是否正确提取。
  • 虽然使用字符串格式化插入数据方便,但不够安全,易受 SQL 注入攻击,下次可以尝试使用参数化查询。

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

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

相关文章

19-操作系统安全保护

19.1 概述 1)概念 一般来说,操作系统的安全是指满足安全策略要求,具有相应的安全机制及安全功能,符合特定的安全标准,在一定约束条件下,能够抵御常见的网络安全威胁,保障自身的安全运行及资源安全。 操作系统的安全可控目标分为两个层面:第一个层面,是指给定一个操作系…

2024-2025-1 20241313刘鸣宇《计算机基础与程序设计》第六周工作总结

作业信息这个作业属于哪个课程 <班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 <作业要求的链接>(如2024-2025-1计算机基础与程序设计第一周作业)这个作业的目标 <写上具体方面>作业正文 ... 本博客链接教材学习内容总结 学习了有关…

mysql 5.7.x版本查看某张表、库的大小 思路方案说明

mysql 5.7.x版本查看某张表、库的大小 思路方案说明@目录摘要(推荐)第一种方案:查询information_schema.TABLES的字段DATA_LENGTH使用场景优点:网上大多案例都是查询系统表的字段DATA_LENGTH去计算大小缺点:DATA_LENGTH不都是实时更新的,由表引擎决定,同时DATA_LENGTH是…

Fluent Editor 富文本开源2个月的总结:增加格式刷、截屏、TypeScript 类型声明等新特性

你好,我是 Kagol,个人公众号:前端开源星球。 Fluent Editor 是一个基于 Quill 2.0 的富文本编辑器,在 Quill 基础上扩展了丰富的模块和格式,框架无关、 功能强大、开箱即用。 2024年8月12日,Fluent Editor 正式开源!源码:https://github.com/opentiny/fluent-editor/ 官…

JavaScript DOM

一 获取Element对象点击查看代码 Document对象中提供了以下获取 Element元素对象的函数 getElementById():根据id属性值获取,返回单个Element对象 getElementsByTagName():根据标签名称获取,返回Element对象数组 getElementsByName():根据name属性值获取,返回Element对象…

zblog列表页面包屑导航的代码 支持显示所有子分类

当前位置:<a href="{$host}">网站首页</a> {if $type==category} {php} $html=; function navcate($id){global $html;$cate = new Category;$cate->LoadInfoByID($id);$html = > <a href=".$cate->Url." title="查看.$cat…

zblog注册插件调用自定义模板的方法

操作步骤安装注册插件:安装官方提供的注册插件。修改插件文件:打开/zb_users/plugin/RegPage/include.php文件。替换模板名称:在第213行,将$article->Template改为自定义模板的名称,例如login。扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种C…

帝国CMS如何判断当前页面为首页高亮代码

<?php if(empty($GLOBALS[navclassid])){ echo class="active"; } ?>说明:如果当前栏目ID为空,则认为是首页,添加class="active"进行高亮。 特殊情况处理:如果不想在TAG页面和自定义页面也高亮,可以在这些页面顶部定义$GLOBALS[navclassid]为…

开启慢SQL设置long_query_time=0.1为啥会统计的sql却存在小于100毫秒的sql

开启慢SQL设置long_query_time=0.1为啥会统计的sql却存在小于100毫秒的sql@目录问题描述我的使用场景描述结论本人其他相关文章链接 问题描述开启慢SQL设置long_query_time=0.1为啥会统计的sql却存在小于100毫秒的sql?我的使用场景描述 我采用执行sql修改配置文件,也就是采用…

帝国CMS文章列表页模板动态刷新点击数代码

修改HTML代码:将点击数显示部分修改为:<em class="clickcount" data-class="[!--classid--]" data-id="[!--id--]">[!--onclick--]</em>添加JS代码:在模板页面尾部加入以下JS代码:<script> window.onload = function() {$…

人工智能技术:引领档案馆数字化转型新浪潮,档案专业人士必读(内有产品体验)

获取白皮书或产品体验,文末添加产品经理微信 在这个信息爆炸的时代,档案馆作为知识的宝库,承载着历史的记忆和文化的传承。如何让这些宝贵的信息更容易被检索、管理和利用,是档案管理领域面临的重大挑战。思通数科AI多模态平台,以前沿的人工智能技术,为档案馆的数字化转型…

GoPro 不同数码镜头的区别 All In One

GoPro 不同数码镜头的区别 All In One GoPro 数码镜头 HyperView 数码镜头/视野,只有 GoPro 10 之后的几代才有, 即 GoPro 11、GoPro 12、GoPro 13 ... HyperView 超大广角 HV SuperView SV 宽 W 线性 L 线性 + 水平锁定/地平线修正 L+GoPro 不同数码镜头的区别 All In One Go…