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

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

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/2024DataCollectionandFusiontechnology
码云作业gitee仓库 https://gitee.com/huang-yuejia/DataMining_project/tree/master/work3
学号 102202149
姓名 黄悦佳

一、作业内容

作业①:

  • 要求:指定一个网站,爬取这个网站中的所有的所有图片,例如:中国气象网(http://www.weather.com.cn)。使用scrapy框架分别实现单线程和多线程的方式爬取。
    –务必控制总页数(学号尾数2位)、总下载的图片数量(尾数后3位)等限制爬取的措施。

1.爬取网站图片(作业1)

本作业源码链接:https://gitee.com/huang-yuejia/DataMining_project/blob/master/work3/work3.1

  • 结果展示:


  • 关键代码展示:

class WeatherNewSpider(scrapy.Spider):
    name = 'weather_new_spider'

    # 设置允许爬取的页面数量和图片数量
    max_pages = 5  # 控制总页数
    max_images = 142  # 控制下载的图片数量
    image_count = 0  # 当前下载的图片数量
    current_page = 1  # 当前页数
    start_urls = ['https://p.weather.com.cn/tqxc/index.shtml']

    def parse(self, response):
        # 找到图片链接
        image_urls = response.css('img::attr(src)').getall()

        for img_url in image_urls:
            if self.image_count >= self.max_images:
                break

            self.image_count += 1
            yield {
                'image_urls': img_url
            }

        # 控制页数,爬取下一页
        if self.current_page < self.max_pages and self.image_count < self.max_images:
            self.current_page += 1
            next_page = f'https://p.weather.com.cn/tqxc/index_{self.current_page}.shtml'
            yield response.follow(next_page, self.parse)

    def close(self, reason):
        self.log(f'Total images downloaded: {self.image_count}')

体现多线程

# 最大并发请求数
CONCURRENT_REQUESTS = 16  # 可以根据需要调整

# 下载延迟(避免对服务器的压力)
DOWNLOAD_DELAY = 0.5  # 每个请求之间的延迟,单位为秒

2.心得体会

  • 分别实现了单线程和多线程的爬取方式。使用 Scrapy 的 CSS 选择器获取图片链接,并在 parse 方法中进行图片链接的提取和处理。当达到设定的最大图片数量或最大页数时,停止爬取。在多线程部分,通过设置 CONCURRENT_REQUESTS 和 DOWNLOAD_DELAY 来控制并发请求数和下载延迟,以优化爬取效率并避免对服务器造成过大压力。

作业②:

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

    1.爬取股票数据

本作业源码链接:https://gitee.com/huang-yuejia/DataMining_project/blob/master/work3/work3.2

  • 结果展示:

  • 关键代码展示:

爬取数据

    def parse(self, response):
        # 提取 JSON 数据
        json_str_start = response.text.index('(') + 1
        json_str_end = response.text.rindex(')')
        json_str = response.text[json_str_start:json_str_end]

        # 解析 JSON 数据
        data = json.loads(json_str)

        if 'data' in data and 'diff' in data['data']:
            for stock in data['data']['diff']:
                item = StockItem()
                item['code'] = stock.get('f12')  # 股票代码
                item['name'] = stock.get('f14')  # 股票名称
                item['price'] = stock.get('f2')   # 当前价格
                item['change'] = stock.get('f4')   # 涨跌
                item['trading_volume'] = stock.get('f5')  # 交易量
                item['total_transaction'] = stock.get('f6')  # 总交易金额
                item['change_percent'] = stock.get('f10')  # 涨跌幅度

                yield item
        else:
            self.logger.error("数据格式不正确或未找到 'diff' 字段。")

2.心得体会

  • 实践了mysql与scrapy技术的结合,将爬取的数据存储在连接的数据库中,方便对数据进一步的操作和分析。

作业③:

1.爬取外汇数据

  • 结果展示:

  • 关键代码展示:

class ForeignSpider(scrapy.Spider):
    name = "foreign"
    allowed_domains = ["boc.cn"]
    start_urls = ["https://www.boc.cn/sourcedb/whpj/"]

    def parse(self, response):
        rows = response.xpath('//table//tr[position()>1]')
        for row in rows:
            item = ForeignExchangeItem()
            item['name'] = row.xpath('./td[1]/text()').get()
            item['buy_price'] = row.xpath('./td[2]/text()').get()
            item['cash_buy_price'] = row.xpath('./td[3]/text()').get()
            item['sell_price'] = row.xpath('./td[4]/text()').get()
            item['cash_sell_price'] = row.xpath('./td[5]/text()').get()
            item['conversion_price'] = row.xpath('./td[6]/text()').get()
            item['publish_date'] = row.xpath('./td[7]/text()').get()
            item['publish_time'] = row.xpath('./td[8]/text()').get()

            yield item

2.心得体会

  • 通过 XPath 表达式定位网页中的表格数据,进行准确的筛选爬取。

二、作业总结

  • 通过本次作业,对数据采集技术有了更全面和深入的实践经验。在完成各项任务的过程中,不仅掌握了 Scrapy 框架的核心技能,还学会了如何应对各种实际问题和挑战。虽然在过程中遇到了一些困难,但通过不断地调试和学习,逐渐克服了这些问题,提高了自己的编程能力和数据处理能力。在今后的学习和实践中,将继续深化这些技术的应用,不断改进和完善数据采集方案,以满足更多复杂的数据获取需求。同时,也会关注数据的质量和合法性,确保采集到的数据能够为后续的分析和应用提供可靠的支持。
posted @ 2024-10-30 19:53  Dust4399  阅读(11)  评论(0编辑  收藏  举报