資料採集與融合技術實踐作業三

whj112發表於2024-11-11

作業①: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 的應用有了更全面的認識和提高。

相關文章