数据采集与融合术作业三

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

总仓库链接

作业1:

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

代码和结果

class ChinaWeatherSpider(scrapy.Spider):
    name = 'china_weather'
    allowed_domains = ['www.weather.com.cn']
    start_urls = ['http://www.weather.com.cn/']

    def parse(self, response):
        # 根据网站结构提取图片URL
        for img_url in response.css('img::attr(src)').getall():
            yield WeatherImageItem(image_urls=[img_url])

        # 控制爬取页数和图片数量
        page = 1
        student_id_suffix = 102202107
        max_pages = int(student_id_suffix[-2:])
        max_images = int(student_id_suffix[-3:])
        count = 0

        while page <= max_pages and count < max_images:
            # 构造下一页URL并爬取
            next_page = response.urljoin('/changepage.shtml?pg={}'.format(page))
            yield response.follow(next_page, self.parse, meta={'page': page + 1, 'count': count})
            page += 1
            count += len(response.css('img::attr(src)').getall())

运行结果:

作业链接

心得体会:

学习使用Scrapy框架进行网站图片爬取,让我对Python编程和网络爬虫有了更深入的理解。通过实践单线程和多线程爬取,我掌握了如何控制爬取速度和数量,以遵守网站的使用协议,保护网站资源。这个过程不仅锻炼了我的编程技能,还增强了我对网络伦理的认识。

作业2

要求:熟练掌握 scrapy 中 Item、Pipeline 数据的序列化输出方法;使用scrapy框架+Xpath+MySQL数据库存储技术路线爬取股票相关信息。
候选网站:东方财富网:https://www.eastmoney.com/
输出信息:MySQL数据库存储和输出格式如下:
表头英文命名例如:序号id,股票代码:bStockNo……,由同学们自行定义设计

代码和结果

stock_spider.py

 self.page_num = response.meta.get('page_num', 1)
        if self.page_num < 3:
            self.page_num += 1
            next_page = f"https://69.push2.eastmoney.com/api/qt/clist/get?cb=jQuery112404359196896638151_1697701391202&pn={self.page_num}&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&wbp2u=|0|0|0|web&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"
            yield scrapy.Request(url=next_page, callback=self.parse, meta={'page_num': self.page_num})

items.py

import scrapy

class StockItem(scrapy.Item):
    code = scrapy.Field()
    name = scrapy.Field()
    latest_price = scrapy.Field()
    change_degree = scrapy.Field()
    change_amount = scrapy.Field()
    count = scrapy.Field()
    money = scrapy.Field()
    zfcount = scrapy.Field()
    highest = scrapy.Field()
    lowest = scrapy.Field()
    today = scrapy.Field()
    yesterday = scrapy.Field()

运行结果:
image
作业链接

心得体会:

做这次作业由于过度请求,短时间爬取太多次,违反了robot.txt的规定让我认识到爬虫时应该小心注意不要违反规定

作业3:

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

代码和结果

boc_spider.py

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

    def parse(self, response):
        # 使用XPath提取数据
        for row in response.xpath('//table/tr'):
            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[6]/text()').get()
            yield item

items.py

import scrapy

class ForexItem(scrapy.Item):
    currency = scrapy.Field()
    tbp = scrapy.Field()
    cbp = scrapy.Field()
    tsp = scrapy.Field()
    tsp = scrapy.Field()
    time = scrapy.Field()

运行结果
image

心得体会:

我学会了如何使用XPath来精确提取外汇网站的数据,并将这些数据通过Pipeline存储到MySQL数据库中。
作业链接

posted on 2024-11-11 23:13  102202107  阅读(7)  评论(0编辑  收藏  举报