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

作业3

我的getee仓库链接 https://gitee.com/LLLzt-III/crawl_project
作业3代码链接 https://gitee.com/LLLzt-III/crawl_project/tree/master/作业3

一、作业①:

  • 要求:指定一个网站,爬取这个网站中的所有的图片,例如:中国气象网(http://www.weather.com.cn)。使用scrapy框架分别实现单线程和多线程的方式爬取。
    -务必控制总页数(学号尾数2位)、总下载的图片数量(尾数后3位)等限制爬取的措施。
  • 输出信息
    • 将下载的Url信息在控制台输出,并将下载的图片存储在images子文件中,并给出截图。

1.1思路与步骤

  1. 确定目标网站和数据

    • 选择要爬取的网页:中国气象网(http://www.weather.com.cn)。
    • 明确要爬取的图片,即这个网站中的所有的图片。
  2. 项目创建

    • 在项目中定义一个Item来存储图片的URL和二进制数据。
  3. 定义Item

    • 使用 BeautifulSoup 对返回的网页内容进行解析,创建一个 soup 对象。
  4. 编写Spider

    • 创建一个Spider,用于爬取中国气象网的图片。
  5. 图片下载

    • 实现图片的下载逻辑,并将图片保存到本地的images文件夹中。
  6. 测试与运行

    • 运行Spider并测试确保图片能够正确下载。

1.2作业代码与实现

import scrapy
from weather_images.items import WeatherImageItem

class WeatherSpider(scrapy.Spider):
    name = "weather1"
    allowed_domains = ["weather.com.cn"]
    start_urls = ["http://www.weather.com.cn/"]  # 修复了 URL,移除了错误的字符

    def parse(self, response):
        item = WeatherImageItem()
        # 使用xpath选择器来提取图片的URL
        image_urls = response.xpath('//img/@src').getall()
        item['image_urls'] = image_urls
        
        # 记录每个图片 URL
        for url in image_urls:
            self.logger.info(f"Downloading image from: {url}")
        
        yield item

1.3运行结果:



1.4代码解析:

1.导入模块:导入了scrapy用于爬虫框架,以及WeatherImageItem,这是一个自定义的Scrapy Item,用于存储爬取的图片信息。
2.定义Spider:定义了一个名为WeatherSpider的Scrapy Spider。
3.属性

  • name:爬虫的名称。
  • allowed_domains:允许爬取的域名列表,这里只允许爬取weather.com.cn域下的页面。
  • start_urls:初始URL列表,Scrapy将从这些URL开始爬取。

4.parse方法:这是Scrapy框架调用的主要方法,用于处理响应并提取数据。

  • WeatherImageItem:创建一个WeatherImageItem实例,用于存储爬取的图片信息。

5.提取图片URL:使用XPath选择器//img/@src来提取页面中所有标签的src属性,即图片的URL。
6.记录图片URL::遍历所有提取到的图片URL,并使用self.logger.info记录每个URL,这将在Scrapy的日志中显示。
7.生成Item:yield关键字用于生成WeatherImageItem实例,Scrapy会将这些Item传递给Item Pipeline进行进一步处理,保存到数据库或文件中。

1.5作业心得:

在完成作业①的过程中,我学习了Scrapy框架的基本使用方法,包括如何创建项目、定义Item、编写Spider以及如何下载文件。我意识到了爬虫在数据采集中的强大能力,同时也体会到了在编写爬虫时需要遵守的道德和法律规范,比如控制爬取速度和数量,以免对目标网站造成不必要的负担。


二、作业②:

  • 要求:熟练掌握 scrapy 中 Item、Pipeline 数据的序列化输出方法;使用scrapy框架+Xpath+MySQL数据库存储技术路线爬取股票相关信息。
  • 候选网站:东方财富网:https://www.eastmoney.com/
  • 输出信息
    • MySQL数据库存储和输出格式如下:
序号 股票代码 股票名称 最新报价 涨跌幅 涨跌额 成交量 振幅 最高 最低 今开 昨收
1 688093 N世华 28.47 10.92 26.13万 7.6亿 22.34 32.0 28.08 30.20 17.55
2 ... ... ... ... ... ... ... ... ... ... ...

2.1思路与步骤

  1. 确定目标网站和数据

    • 选择要爬取的网页:东方财富网:https://www.eastmoney.com/
    • 明确要提取的数据,即爬取股票相关信息。
  2. 项目创建

    • 使用Scrapy命令创建一个新的Scrapy项目。
  3. 数据库设计

    • 设计MySQL数据库表结构,以存储爬取的股票信息。
  4. 定义Item

    • 在项目中定义一个Item,包含所有需要爬取的股票信息字段。
  5. 编写Spider

    • 创建一个Spider,用于爬取东方财富网的股票信息。
  6. 数据存储

    • 实现Pipeline,将爬取的数据存储到MySQL数据库中。
  7. 测试与运行

    • 运行Spider并测试确保数据能够正确存储到数据库。

2.2作业代码

import scrapy
import json
from stock_info.items import StockInfoItem

class EastmoneySpider(scrapy.Spider):
    name = 'eastmoney'
    allowed_domains = ['eastmoney.com']
    base_url = "https://69.push2.eastmoney.com/api/qt/clist/get?cb=jQuery112404359196896638151_1697701391202&pn={page}&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&wbp2u=%7C0%7C0%7C0%7Cweb&fid=f3&fs=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&_=1697701391203"

    def start_requests(self):
        for page in range(1, 4):  # 限制爬取前3页
            url = self.base_url.format(page=page)
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        try:
            data = response.text
            json_data = json.loads(data[data.find('{'):data.rfind('}') + 1])
            stock_list = json_data['data']['diff']
            for stock in stock_list:
                item = StockInfoItem()  # 确保这里使用的是正确的Item类
                item['code'] = stock['f12']
                item['name'] = stock['f14']
                item['latest_price'] = stock['f2']
                item['change_degree'] = stock['f3']
                item['change_amount'] = stock['f4']
                item['volume'] = stock['f5']
                item['amplitude'] = stock['f6']
                item['highest'] = stock['f15']
                item['lowest'] = stock['f16']
                item['today'] = stock['f17']
                item['yestoday'] = stock['f18']
                yield item
        except json.JSONDecodeError as e:
            self.logger.error(f"JSON解析错误: {e}")
        except KeyError as e:
            self.logger.error(f"字段缺失: {e}")

2.3运行结果:




2.4代码解析:

1.导入模块:导入了scrapy用于爬虫框架,json用于处理JSON数据,以及StockInfoItem用于定义爬取的数据结构。
2.定义Spider:定义了一个名为EastmoneySpider的Scrapy Spider。
3.属性

  • name:爬虫的名称。
  • allowed_domains:允许爬取的域名列表。
  • base_url:请求的基础URL,用于构造请求的URL。

4.start_requests方法:Scrapy框架会调用此方法来生成初始请求。这里通过循环生成前3页的请求,并将parse方法作为回调函数
5.parse方法:这是回调函数,用于处理响应并提取数据。

2.5作业心得:

通过作业②,我深入了解了Scrapy框架与数据库结合使用的方法,学会了如何设计数据库表结构以及如何将数据存储到数据库中。这个过程中,我遇到了一些困难,比如如何正确地处理和转换数据类型,以及如何优化Scrapy的爬取效率。这些经验对于我未来处理和分析网络数据非常有帮助。


三、作业③:

  • 要求:熟练掌握 scrapy 中 Item、Pipeline 数据的序列化输出方法;使用scrapy框架+Xpath+MySQL数据库存储技术路线爬取外汇网站数据。
  • 候选网站:中国银行网:https://www.boc.cn/sourcedb/whpj/
  • 输出信息
Currency TBP CBP TSP CSP Time
阿联酋迪拉姆 198.58 192.31 199.98 206.59 11:27:14

3.1思路与步骤

  1. 确定目标网站和数据

  2. 项目创建

    • 使用Scrapy命令创建一个新的Scrapy项目。
  3. 数据库设计

    • 设计MySQL数据库表结构,以存储爬取的外汇信息。
  4. 定义Item

    • 在项目中定义一个Item,包含所有需要爬取的外汇信息字段。
  5. 编写Spider

    • 创建一个Spider,用于爬取中国银行外汇牌价信息。
  6. 数据存储

    • 实现Pipeline,将爬取的数据存储到MySQL数据库中。
  7. 运行与测试

    • 运行Spider并测试确保数据能够正确存储到数据库。

3.2作业代码与实现

import scrapy
from forex.items import ForexItem

class BankSpider(scrapy.Spider):
    name = 'bank'
    allowed_domains = ['www.boc.cn']
    start_urls = ['https://www.boc.cn/sourcedb/whpj/']

    def parse(self, response):
        table = response.xpath('//table[1]')
        rows = table.xpath('.//tr')[1:]  # 跳过表头

        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[7]/text()').get()
            yield item

3.3运行结果:




3.4代码解析:

1.导入模块:导入Scrapy框架的核心模块,使得可以使用Scrapy提供的类和函数。
2.定义Spider:定义BankSpider类,设置爬虫的名称、允许的域名和起始URL。
3.parse方法:用于解析网页响应,提取表格中的数据。
4.XPath选择器:使用XPath选择器定位表格行,并逐行提取货币名称、买入价、卖出价和时间等信息。
5.生成Item:将提取的数据存储到ForexItem实例中,并产出这些实例以供后续处理。

3.5作业心得:

在完成作业③的过程中,我学习了如何使用Scrapy框架来爬取网页上的表格数据,并且了解了如何将这些数据存储到MySQL数据库中。我遇到了一些挑战,比如如何处理网页中的分页和如何正确地提取表格数据。通过编写Pipeline,我学会了如何与数据库进行交互,并且理解了数据持久化的重要性。


总结

这三个作业不仅让我掌握了Scrapy框架的基本和高级用法,还让我学会了如何与数据库进行交互,以及如何将网络数据结构化存储。我学会了如何设计爬虫、处理异常、优化爬取策略,并且加深了对HTML和XPath的理解。这些技能对于我未来在数据分析、数据科学以及任何需要网络数据采集的领域的工作都是极其宝贵的。总的来说,这些作业极大地提升了我的技术能力,并为我未来的学习和职业发展打下了坚实的基础。

posted @ 2024-11-01 23:28  III527  阅读(19)  评论(0编辑  收藏  举报