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

作业①:Scrapy爬取中国气象网图片

1. 作业代码与实现步骤

Gitee文件夹链接:https://gitee.com/nongchenc/crawl_project/tree/master/作业3/第一题

步骤详解

  1. 单线程爬取
    • 使用 Scrapy 的Spider类创建一个爬虫,指定起始 URL 为中国气象网首页。
    • 通过 Xpath 选择器定位到图片元素,提取图片的 URL。
    • 设置限制总页数和总下载图片数量的逻辑,可以通过计数器来实现。
    • 将下载的图片存储在images子文件夹中,并在控制台输出下载的 URL 信息。
  2. 多线程爬取
    • 配置 Scrapy 的设置,启用多线程下载。
    • 其他步骤与单线程类似,但由于多线程的特性,需要注意线程安全和资源竞争问题。

代码示例

    def parse(self, response):
        # 如果超过限定页数,停止爬取
        if self.current_page > self.total_pages:
            print(f"达到最大页数限制:{self.total_pages}")
            return

        # 提取图片地址
        imgs = response.xpath("//img/@src").extract()

        # 下载图片并限制数量
        for img in imgs:
            if not img.startswith('http'):
                img = response.urljoin(img)  # 补全图片地址

            if self.current_image_count < self.max_images:
                item = WeatherImageItem()
                item['image_urls'] = [img]
                print(f"发现图片 URL: {img}")  # 输出图片 URL 到控制台
                yield item  # 传输到管道
                self.current_image_count += 1
            else:
                print(f"达到最大图片数量限制:{self.max_images}")
                break

图片展示

打印结果

下载图片截图

2. 作业心得

在完成这个作业的过程中,我深刻体会到了 Scrapy 框架的强大之处。通过单线程和多线程的方式爬取图片,让我了解到不同方式的性能差异。设置限制爬取的措施也让我学会了如何更好地控制爬虫的行为,避免对目标网站造成过大的负担。

作业②:爬取东方财富网股票数据

1. 作业代码与实现步骤

Gitee文件夹链接:https://gitee.com/nongchenc/crawl_project/tree/master/作业3/第二题

步骤详解

  1. 数据爬取
    • 使用 Scrapy 创建一个爬虫,针对东方财富网进行爬取。
    • 利用 Xpath 定位到股票信息的各个元素,如股票代码、股票名称、最新报价等。
    • 将提取到的数据封装成Item对象。
  2. 数据存储
    • 创建一个Pipeline,在其中连接 MySQL 数据库。
    • 将Item中的数据插入到 MySQL 数据库中,并按照规定的输出格式展示。

代码示例

    def parse(self, response):
        data = json.loads(response.text[response.text.find("(")+1:-2])  # 去掉回调函数
        stocks = data.get('data', {}).get('diff', [])
        for stock in stocks:
            item = StockItem()
            item['bStockNo'] = stock['f12']
            item['name'] = stock['f14']
            item['latest_price'] = float(stock['f2']) if stock['f2'] != '-' else None
            item['change_rate'] = float(stock['f3']) if stock['f3'] != '-' else None
            item['change_amount'] = float(stock['f4']) if stock['f4'] != '-' else None
            item['volume'] = float(stock['f5']) if stock['f5'] != '-' else None
            item['amount'] = float(stock['f6']) if stock['f6'] != '-' else None
            item['amplitude'] = float(stock['f7']) if stock['f7'] != '-' else None
            item['highest'] = float(stock['f15']) if stock['f15'] != '-' else None
            item['lowest'] = float(stock['f16']) if stock['f16'] != '-' else None
            item['open_price'] = float(stock['f17']) if stock['f17'] != '-' else None
            item['close_price'] = float(stock['f18']) if stock['f18'] != '-' else None
            yield item

class StockItem(scrapy.Item):
    id = scrapy.Field()
    bStockNo = scrapy.Field()  # 股票代码
    name = scrapy.Field()       # 股票名称
    latest_price = scrapy.Field()  # 最新报价
    change_rate = scrapy.Field()    # 涨跌幅
    change_amount = scrapy.Field()   # 涨跌额
    volume = scrapy.Field()          # 成交量
    amount = scrapy.Field()          # 成交额
    amplitude = scrapy.Field()       # 振幅
    highest = scrapy.Field()         # 最高
    lowest = scrapy.Field()          # 最低
    open_price = scrapy.Field()      # 今开
    close_price = scrapy.Field()     # 昨收

图片展示

打印结果

数据库结果

2. 作业心得

这个作业让我对 Scrapy 的数据处理流程有了更深入的理解。通过Item和Pipeline的配合,能够高效地将爬取到的数据进行序列化输出和存储。在与 MySQL 数据库交互的过程中,我学会了如何正确地配置数据库连接和执行 SQL 语句。

作业③:爬取外汇网站数据

1. 作业代码与实现步骤

Gitee文件夹链接:https://gitee.com/nongchenc/crawl_project/tree/master/作业3/第三题

步骤详解

  1. 数据爬取
    • 针对中国银行外汇网站创建 Scrapy 爬虫。
    • 使用 Xpath 提取外汇数据,包括货币名称、买入价、卖出价等。
    • 将数据封装成Item。
  2. 数据存储与输出
    • 在Pipeline中连接 MySQL 数据库,将外汇数据存入数据库。
    • 按照规定的输出格式在控制台输出数据。

代码示例

    def parse(self, response):
        rows = response.xpath('//table[@align="left"]//tr')
        for row in rows[1:]:  # 跳过表头
            item = ForeignExchangeItem()
            currency_text = row.xpath('./td[1]/text()').get()
            item['currency'] = currency_text.strip() if currency_text else None
            tbp_text = row.xpath('./td[2]/text()').get()
            item['tbp'] = tbp_text.strip() if tbp_text else None
            cbp_text = row.xpath('./td[3]/text()').get()
            item['cbp'] = cbp_text.strip() if cbp_text else None
            tsp_text = row.xpath('./td[4]/text()').get()
            item['tsp'] = tsp_text.strip() if tsp_text else None
            csp_text = row.xpath('./td[5]/text()').get()
            item['csp'] = csp_text.strip() if csp_text else None
            item['time'] = datetime.now().strftime('%H:%M:%S') 
            yield item

图片展示

打印结果

数据库结果

2. 作业心得

作业③进一步巩固了我对 Scrapy 和数据库操作的掌握。处理外汇数据的过程中,我学会了如何根据特定的格式要求进行数据输出。同时,也让我意识到在实际项目中,数据的规范化和准确输出对于后续分析和使用的重要性。通过这三个作业,我对 Scrapy 的应用有了更全面的认识和提高。

posted @ 2024-11-08 00:26  旺旺cc冰  阅读(7)  评论(0编辑  收藏  举报