作業①:Scrapy爬取中國氣象網圖片
1. 作業程式碼與實現步驟
Gitee資料夾連結:https://gitee.com/nongchenc/crawl_project/tree/master/作業3/第一題
步驟詳解
- 單執行緒爬取:
- 使用 Scrapy 的Spider類建立一個爬蟲,指定起始 URL 為中國氣象網首頁。
- 透過 Xpath 選擇器定位到圖片元素,提取圖片的 URL。
- 設定限制總頁數和總下載圖片數量的邏輯,可以透過計數器來實現。
- 將下載的圖片儲存在images子資料夾中,並在控制檯輸出下載的 URL 資訊。
- 多執行緒爬取:
- 配置 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/第二題
步驟詳解
- 資料爬取:
- 使用 Scrapy 建立一個爬蟲,針對東方財富網進行爬取。
- 利用 Xpath 定位到股票資訊的各個元素,如股票程式碼、股票名稱、最新報價等。
- 將提取到的資料封裝成Item物件。
- 資料儲存:
- 建立一個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/第三題
步驟詳解
- 資料爬取:
- 針對中國銀行外匯網站建立 Scrapy 爬蟲。
- 使用 Xpath 提取外匯資料,包括貨幣名稱、買入價、賣出價等。
- 將資料封裝成Item。
- 資料儲存與輸出:
- 在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 的應用有了更全面的認識和提高。