数据采集与融合技术实验课程作业三

数据采集与融合技术实验课程作业三

作业所属课程 https://edu.cnblogs.com/campus/fzu/2024DataCollectionandFusiontechnology
作业链接 https://edu.cnblogs.com/campus/fzu/2024DataCollectionandFusiontechnology/homework/13287
gitee码云代码位置 https://gitee.com/wang-qiangsy/crawl_project/tree/master/作业三
学号 102202106

任务①:

主要代码

## image_spider.py
class ImageSpider(scrapy.Spider):
    name = "image_spider"
    allowed_domains = ["weather.com.cn"]
    start_urls = ["http://www.weather.com.cn"]

    def parse(self, response):
        # Find all image URLs on the page
        img_urls = response.css('img::attr(src)').getall()
        img_urls = [response.urljoin(url) for url in img_urls]  # Handle relative URLs

        # Print image URLs in console
        for img_url in img_urls:
            self.log(f"Image URL: {img_url}")

        # Yield image requests
        for img_url in img_urls:
            yield scrapy.Request(img_url, callback=self.save_image)

    def save_image(self, response):
        # Save each image in 'images' folder
        path = 'images'
        os.makedirs(path, exist_ok=True)
        filename = os.path.join(path, response.url.split('/')[-1])

        with open(filename, 'wb') as f:
            f.write(response.body)
            self.log(f"Saved file {filename}")

运行后查看抓取的图片

作业心得

    1. Scrapy 框架的强大功能
      Scrapy 是一个功能强大的网页抓取框架,它提供了许多方便的工具和方法来处理网页抓取任务。在这个项目中,我使用 Scrapy 来抓取天气网站上的所有图片,并将它们保存到本地。Scrapy 的 Spider 类和 Request 对象使得抓取和处理网页内容变得非常简单和直观。
    1. 使用 CSS 选择器提取数据
      在 parse 方法中,我使用了 CSS 选择器来提取页面上的所有图片 URL。CSS 选择器是一种非常强大的工具,它允许我们轻松地选择和提取网页中的特定元素。在这个项目中,我使用 response.css('img::attr(src)').getall() 来获取所有图片的 URL。
    1. 处理相对 URL
      在抓取网页内容时,经常会遇到相对 URL。为了确保我们能够正确地访问这些资源,我使用了 response.urljoin(url) 方法将相对 URL 转换为绝对 URL。这是一个非常重要的步骤,因为它确保了我们能够正确地下载和保存所有图片。

任务②:

主要代码

# stock_spider.py
def parse(self, response):
        # 提取 JSON 数据
        data = json.loads(response.text[response.text.find('(') + 1 : response.text.rfind(')')])  # 去除 JSONP 包裹
        for stock in data['data']['diff']:
            item = StockScraperItem()
            item['id'] = stock['f12']
            item['code'] = stock['f12']
            item['name'] = stock['f14']
            item['latest_price'] = stock['f2']
            item['price_change_percentage'] = stock['f3']
            item['price_change'] = stock['f4']
            item['volume'] = stock['f5']
            item['turnover'] = stock['f6']
            item['amplitude'] = stock['f7']
            item['high'] = stock['f15']
            item['low'] = stock['f16']
            item['today_open'] = stock['f17']
            item['yesterday_close'] = stock['f18']
            yield item
# pipelines.py
def process_item(self, item, spider):
        # 插入数据
        self.cursor.execute("""
            INSERT INTO stock_data (id, code, name, latest_price, price_change_percentage, price_change, volume, turnover, amplitude, high, low, today_open, yesterday_close)
            VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
            ON DUPLICATE KEY UPDATE 
                latest_price=VALUES(latest_price),
                price_change_percentage=VALUES(price_change_percentage),
                price_change=VALUES(price_change),
                volume=VALUES(volume),
                turnover=VALUES(turnover),
                amplitude=VALUES(amplitude),
                high=VALUES(high),
                low=VALUES(low),
                today_open=VALUES(today_open),
                yesterday_close=VALUES(yesterday_close)
        """, (
            item['id'],
            item['code'],
            item['name'],
            item['latest_price'],
            item['price_change_percentage'],
            item['price_change'],
            item['volume'],
            item['turnover'],
            item['amplitude'],
            item['high'],
            item['low'],
            item['today_open'],
            item['yesterday_close']
        ))

运行查看MySQL中查看股票数据

作业心得

    1. 处理 JSON 数据
      在 StockSpider 爬虫中,我需要从 API 响应中提取 JSON 数据。通过使用 Python 的 json 模块,我能够轻松地解析 JSON 数据,并提取所需的字段。在这个项目中,我使用 json.loads 方法解析 JSON 数据,并使用字典访问提取到的数据。
    1. 使用 Scrapy Item
      为了更好地组织和管理抓取到的数据,我使用了 Scrapy 的 Item 类。在 StockScraperItem 中定义了各个字段,并在爬虫中将提取到的数据赋值给这些字段。这种方法不仅使代码更加清晰,还能确保数据的一致性和完整性。
    1. 数据存储到 MySQL
      在 StockScraperPipeline 中,我使用了 mysql.connector 模块将抓取到的数据存储到 MySQL 数据库中。通过在 open_spider 方法中建立数据库连接,并在 close_spider 方法中关闭连接,我确保了数据库连接的正确管理。在 process_item 方法中,我使用 SQL 语句将数据插入到数据库中,并使用 ON DUPLICATE KEY UPDATE 语句处理重复数据。

任务③:

主要代码

# work3.py
    def parse(self, response):
        data = response.body.decode()
        selector=scrapy.Selector(text=data) 
        data_lists = selector.xpath('//table[@align="left"]/tr')
        for data_list in data_lists:
            datas = data_list.xpath('.//td')
            if datas != []:
                item = work3_Item()
                keys = ['name','price1','price2','price3','price4','price5','date']
                str_lists = datas.extract()
                for i in range(len(str_lists)-1):
                    item[keys[i]] = str_lists[i].strip('<td class="pjrq"></td>').strip()
                yield item
# pipelines.py
class work3_Pipeline:

    def open_spider(self,spider):
        try:
            self.db = pymysql.connect(host='127.0.0.1', user='root', passwd='wq1233', port=3306,charset='utf8',database='forex')
            self.cursor = self.db.cursor()
            self.cursor.execute('DROP TABLE IF EXISTS bank')
            sql = """CREATE TABLE bank(Currency varchar(32),p1 varchar(17),p2 varchar(17),p3 varchar(17),p4 varchar(17),p5 varchar(17),Time varchar(32))"""
            self.cursor.execute(sql)
        except Exception as e:
            print(e)

    def process_item(self, item, spider):
        if isinstance(item,work3_Item):
            sql = 'INSERT INTO bank VALUES ("%s","%s","%s","%s","%s","%s","%s")' % (item['name'],item['price1'],item['price2'],
                                                                                                    item['price3'],item['price4'],item['price5'],item['date'])
            self.cursor.execute(sql)
            self.db.commit()
        return item

运行查看MySQL查看外汇数据

作业心得

    1. 使用 XPath 提取数据
      在 Work3Spider 爬虫中,我使用了 XPath 表达式来提取网页中的数据。XPath 是一种非常强大的工具,它允许我们轻松地选择和提取网页中的特定元素。在这个项目中,我使用 selector.xpath('//table[@align="left"]/tr') 来获取所有数据行,并进一步提取每行中的各个数据单元格。
    1. 使用 Scrapy Item
      为了更好地组织和管理抓取到的数据,我使用了 Scrapy 的 Item 类。在 work3_Item 中定义了各个字段,并在爬虫中将提取到的数据赋值给这些字段。这种方法不仅使代码更加清晰,还能确保数据的一致性和完整性。
posted @ 2024-11-11 22:28  KaiInssy  阅读(6)  评论(0编辑  收藏  举报