資料採集與融合技術-第四次實踐作業

PZn發表於2024-11-16

作業1

要求:

▪ 熟練掌握 Selenium 查詢 HTML 元素、爬取 Ajax 網頁資料、等待 HTML 元素等內
容。
▪ 使用 Selenium 框架+ MySQL 資料庫儲存技術路線爬取“滬深 A 股”、 “上證 A 股”、
“深證 A 股”3 個板塊的股票資料資訊。
o 候選網站: 東方財富網:
http://quote.eastmoney.com/center/gridlist.html#hs_a_board
o 輸出資訊: MYSQL 資料庫儲存和輸出格式如下,表頭應是英文命名例如:序號
id,股票程式碼: bStockNo……,由同學們自行定義設計表頭:
• Gitee 資料夾連結

–務必控制總下載的圖片數量(學號尾數後2位)限制爬取的措施。

Gitee連結
https://gitee.com/xiaoaibit/102202131_LX/blob/master/homework4/demo1.py

爬蟲程式碼

import sqlite3
import time

from selenium import webdriver
from selenium.webdriver.common.by import By

# 建立資料庫連線
conn = sqlite3.connect('stock_data.db')  # 'stock_data.db' 是資料庫檔名
cursor = conn.cursor()
# 建立表
cursor.execute('''
CREATE TABLE IF NOT EXISTS stocks (
    id TEXT,
    stock_code TEXT,
    stock_name TEXT,
    latest_price TEXT,
    change_percent TEXT,
    change_amount TEXT,
    volume TEXT,
    turnover TEXT,
    amplitude TEXT,
    highest TEXT,
    lowest TEXT,
    open_price TEXT,
    last_close TEXT
)
''')

# 初始化Selenium WebDriver
driver = webdriver.Edge()
driver.get("https://quote.eastmoney.com/center/gridlist.html#hs_a_board")
time.sleep(2)

# 獲取資料
ts = driver.find_elements(By.XPATH, "//tbody//tr")
for t in ts:
    id = t.find_element(By.XPATH, ".//td[1]").text
    stock_code = t.find_element(By.XPATH, ".//td[2]").text
    stock_name = t.find_element(By.XPATH, ".//td[3]").text
    latest_price = t.find_element(By.XPATH, ".//td[5]").text
    change_percent = t.find_element(By.XPATH, ".//td[6]").text
    change_amount = t.find_element(By.XPATH, ".//td[7]").text
    volume = t.find_element(By.XPATH, ".//td[8]").text
    turnover = t.find_element(By.XPATH, ".//td[9]").text
    amplitude = t.find_element(By.XPATH, ".//td[10]").text
    highest = t.find_element(By.XPATH, ".//td[11]").text
    lowest = t.find_element(By.XPATH, ".//td[12]").text
    open_price = t.find_element(By.XPATH, ".//td[13]").text
    last_close = t.find_element(By.XPATH, ".//td[14]").text


    cursor.execute('''
    INSERT INTO stocks (id, stock_code, stock_name, latest_price, change_percent, change_amount, volume, turnover, amplitude, highest, lowest, open_price, last_close)
    VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    ''', (id, stock_code, stock_name, latest_price, change_percent, change_amount, volume, turnover, amplitude, highest, lowest, open_price, last_close))
button1 = driver.find_element(By.XPATH,'//*[@id="nav_sh_a_board"]/a')
button1.click()
time.sleep(2)


ts = driver.find_elements(By.XPATH, "//tbody//tr")
for t in ts:
    id = t.find_element(By.XPATH, ".//td[1]").text
    stock_code = t.find_element(By.XPATH, ".//td[2]").text
    stock_name = t.find_element(By.XPATH, ".//td[3]").text
    latest_price = t.find_element(By.XPATH, ".//td[5]").text
    change_percent = t.find_element(By.XPATH, ".//td[6]").text
    change_amount = t.find_element(By.XPATH, ".//td[7]").text
    volume = t.find_element(By.XPATH, ".//td[8]").text
    turnover = t.find_element(By.XPATH, ".//td[9]").text
    amplitude = t.find_element(By.XPATH, ".//td[10]").text
    highest = t.find_element(By.XPATH, ".//td[11]").text
    lowest = t.find_element(By.XPATH, ".//td[12]").text
    open_price = t.find_element(By.XPATH, ".//td[13]").text
    last_close = t.find_element(By.XPATH, ".//td[14]").text


    cursor.execute('''
    INSERT INTO stocks (id, stock_code, stock_name, latest_price, change_percent, change_amount, volume, turnover, amplitude, highest, lowest, open_price, last_close)
    VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    ''', (id, stock_code, stock_name, latest_price, change_percent, change_amount, volume, turnover, amplitude, highest, lowest, open_price, last_close))

button1 = driver.find_element(By.XPATH,'//*[@id="nav_sz_a_board"]/a')
button1.click()
time.sleep(2)


ts = driver.find_elements(By.XPATH, "//tbody//tr")
for t in ts:
    id = t.find_element(By.XPATH, ".//td[1]").text
    stock_code = t.find_element(By.XPATH, ".//td[2]").text
    stock_name = t.find_element(By.XPATH, ".//td[3]").text
    latest_price = t.find_element(By.XPATH, ".//td[5]").text
    change_percent = t.find_element(By.XPATH, ".//td[6]").text
    change_amount = t.find_element(By.XPATH, ".//td[7]").text
    volume = t.find_element(By.XPATH, ".//td[8]").text
    turnover = t.find_element(By.XPATH, ".//td[9]").text
    amplitude = t.find_element(By.XPATH, ".//td[10]").text
    highest = t.find_element(By.XPATH, ".//td[11]").text
    lowest = t.find_element(By.XPATH, ".//td[12]").text
    open_price = t.find_element(By.XPATH, ".//td[13]").text
    last_close = t.find_element(By.XPATH, ".//td[14]").text


    cursor.execute('''
    INSERT INTO stocks (id, stock_code, stock_name, latest_price, change_percent, change_amount, volume, turnover, amplitude, highest, lowest, open_price, last_close)
    VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    ''', (id, stock_code, stock_name, latest_price, change_percent, change_amount, volume, turnover, amplitude, highest, lowest, open_price, last_close))

# 提交事務
conn.commit()

# 關閉資料庫連線
cursor.close()
conn.close()

# 關閉WebDriver
driver.quit()

結果

心得體會

1. 精確的元素定位

  • 在使用 Selenium 進行網頁元素定位時,精確的 XPath 或 CSS 選擇器至關重要。這直接影響到資料抓取的準確性和效率。

2. 等待元素載入

  • time.sleep() 是一種簡單的等待頁面載入的方法,但在實際應用中,使用 Selenium 提供的顯式等待(如 WebDriverWait)更為高效和可靠。

3. 多執行緒或非同步處理

  • 對於需要抓取大量頁面的情況,可以考慮使用多執行緒或非同步 IO 來提高效率。多執行緒或非同步處理
  • 對於需要抓取大量頁面的情況,可以考慮使用多執行緒或非同步 IO 來提高效率。

作業2

要求:

▪ 熟練掌握 Selenium 查詢 HTML 元素、實現使用者模擬登入、爬取 Ajax 網頁資料、
等待 HTML 元素等內容。
▪ 使用 Selenium 框架+MySQL 爬取中國 mooc 網課程資源資訊(課程號、課程名
稱、學校名稱、主講教師、團隊成員、參加人數、課程進度、課程簡介)
o 候選網站: 中國 mooc 網: https://www.icourse163.org
o 輸出資訊: MYSQL 資料庫儲存和輸出格式
• Gitee 資料夾連結https://www.eastmoney.com/輸出資訊:MySQL資料庫儲存和輸出格式如下:表頭英文命名例如:序號id,股票程式碼:bStockNo……,由同學們自行定義設計

Gitee連結
https://gitee.com/xiaoaibit/102202131_LX/blob/master/homework4/demo2.py

爬蟲程式碼

import time
import sqlite3
from selenium import webdriver
from selenium.webdriver.common.by import By
# 建立資料庫連線
conn = sqlite3.connect('courses.db')
cursor = conn.cursor()
# 建立表
cursor.execute('''
CREATE TABLE IF NOT EXISTS courses (
    Id TEXT,
    cCourse TEXT,
    cCollege TEXT,
    cTeacher TEXT,
    cTeam TEXT,
    cCount TEXT,
    cProcess TEXT,
    cBrief TEXT
)
''')
# 初始化Selenium WebDriver
driver = webdriver.Edge()
driver.get("https://www.icourse163.org/channel/2001.htm")  # 修復了URL
driver.implicitly_wait(20)
driver.execute_script("window.scrollTo(0, 0);")
# 獲取課程列表
courses = driver.find_elements(By.XPATH, '//ul[@class="_2mEuw"][position()=1]/div')
i = 1
for course in courses:
    window_handles = driver.window_handles
    driver.switch_to.window(window_handles[0])
    if i == 6:
        break
    course.click()
    window_handles = driver.window_handles
    driver.switch_to.window(window_handles[i])
    i += 1
    driver.implicitly_wait(20)
    Id = i - 1
    cCourse = driver.find_element(By.XPATH, '//span[@class="course-title f-ib f-vam"]').text
    cCollege = driver.find_element(By.XPATH, "//img[@class='u-img']").get_attribute('alt')
    cTeacher = driver.find_element(By.XPATH, "//div[@class='cnt f-fl']").text
    cTeam = driver.find_element(By.XPATH, "//div[@class='cnt f-fl']").text
    cCount = driver.find_element(By.XPATH, "//span[@class='count']").text
    cProcess = driver.find_element(By.XPATH, "//div[@class='course-enroll-info_course-info_term-info_term-time']").text
    cBrief = driver.find_element(By.XPATH, "//div[@class='f-richEditorText']").text
    # 插入資料到資料庫
    cursor.execute('''
    INSERT INTO courses (Id, cCourse, cCollege, cTeacher, cTeam, cCount, cProcess, cBrief)
    VALUES (?, ?, ?, ?, ?, ?, ?, ?)
    ''', (Id, cCourse, cCollege, cTeacher, cTeam, cCount, cProcess, cBrief))
# 提交事務
conn.commit()
# 關閉Cursor和Connection
cursor.close()
conn.close()
# 關閉WebDriver
driver.quit()

結果

1. 精確的 XPath 定位

  • 使用 XPath 定位元素時,需要確保路徑的準確性。錯誤的路徑會導致元素無法被正確識別,從而影響資料抓取。

2. 等待頁面載入

  • 使用 implicitly_waitexecute_script 來確保頁面載入完成,避免因頁面未完全載入而導致的資料抓取不準確。

3. 多視窗處理

  • 在處理新標籤頁或彈窗時,需要使用 switch_to.window 來切換視窗,確保在正確的視窗中進行元素操作。

作業3

要求:

掌握大資料相關服務,熟悉 Xshell 的使用

完成文件 華為雲_大資料實時分析處理實驗手冊-Flume 日誌採集實驗(部分)v2.docx 中的任務,即為下面 5 個任務,具體操作見文件。

環境搭建:

任務一:開通 MapReduce 服務

實時分析開發實戰:

任務一:Python 指令碼生成測試資料

任務二:配置 Kafka

任務三: 安裝 Flume 客戶端

任務四:配置 Flume 採集資料

環境搭建:

任務一:開通 MapReduce 服務

實時分析開發實戰:

任務一:Python 指令碼生成測試資料

執行指令碼測試
執行Python命令,測試生成100條資料
使用more命令檢視生成的資料(enter鍵向下一行,space鍵向下一屏,b向上一屏,q鍵退出)。

任務二:配置 Kafka

進入MRS Manager叢集管理

下載Kafka客戶端

校驗下載的客戶端檔案包
使用PuTTY登入到master節點伺服器上,進入/tmp/FusionInsight-Client/目錄。

執行以下命令,解壓壓縮包獲取校驗檔案與客戶端配置包

執行命令,校驗檔案包。

安裝Kafka執行環境
解壓“MRS_Flume_ClientConfig.tar”檔案。

檢視解壓後檔案

安裝客戶端執行環境到目錄“/opt/Kafka_env”(安裝時自動生成目錄)。

執行命令配置環境變數。

安裝Kafka客戶端
安裝Kafka到目錄“/opt/KafkaClient”(安裝時自動生成目錄,-d:表示Kafka客戶端安裝路徑)。

設定環境變數
使用Putty登入MRS的master節點伺服器後,首先使用source命令進行環境變數的設定使得相關命令可用。

在kafka中建立topic
執行如下命令建立topic(--bootstrap-server替換成你的kafka的IP,如何獲取IP請參見附錄步驟)。

檢視topic資訊

任務三: 安裝 Flume 客戶端

下載Flume客戶端

校驗下載的客戶端檔案包
使用PuTTY登入到master節點伺服器上,進入/tmp/FusionInsight-Client/目錄。

執行以下命令,解壓壓縮包獲取校驗檔案與客戶端配置包

執行命令,校驗檔案包。

安裝Flume執行環境
解壓“MRS_Flume_ClientConfig.tar”檔案。

檢視解壓後檔案。

安裝客戶端執行環境到目錄“/opt/Flume_env”(安裝時自動生成目錄)。

執行命令配置環境變數。

安裝Flume客戶端
安裝Flume到目錄“/opt/FlumeClient”(安裝時自動生成目錄,-d:表示Flume客戶端安裝路徑)。

重啟Flume服務
執行以下命令重啟Flume的服務。

任務四:配置 Flume 採集資料

修改配置檔案
進入Flume安裝目錄

在conf目錄下編輯檔案properties.properties


建立消費者消費kafka中的資料
使用PuTTY登入master節點後,執行命令(此處bootstrap-server的ip對應的是Kafka的Broker的IP):

執行以上命令後,需要新開一個PuTTY會話視窗。
點選PuTTY標題欄左側的圖示,在彈出的選單中選擇“Duplicate Session”複製會話。
進入Python指令碼所在目錄,執行python指令碼,再生成一份資料。

檢視原視窗,可以看到已經消費出了資料:

心得體會

開通 MapReduce 服務

  • 理解 MapReduce 原理:在實際操作之前,深入理解 MapReduce 的工作原理對於後續的配置和最佳化至關重要。
  • 環境配置的重要性:正確配置 Hadoop 環境是成功執行 MapReduce 作業的前提。這包括合理設定記憶體、儲存等資源。
  • 監控與除錯:在 MapReduce 服務執行過程中,實時監控作業的執行情況,並學會如何除錯常見的問題。

Python 指令碼生成測試資料

  • 資料多樣性:生成測試資料時,要確保資料的多樣性和覆蓋面,以模擬真實場景下的各種情況。
  • 效能考量:在生成大量資料時,需要考慮指令碼的執行效率,避免成為整個資料處理流程的瓶頸。

配置 Kafka

  • 叢集與分割槽:合理規劃 Kafka 的叢集架構和分割槽數量,以滿足資料吞吐量和負載均衡的需求。
  • 訊息永續性:配置 Kafka 的訊息持久化策略,確保資料的可靠性和一致性。

安裝 Flume 客戶端

  • 依賴管理:安裝 Flume 時,需要注意其依賴的 Java 環境和其他庫的版本相容性。
  • 配置檔案編寫:Flume 的配置檔案編寫需要細緻,確保資料來源、處理器和資料儲存的配置正確無誤。

任務五:配置 Flume 採集資料

  • 資料來源適配:根據資料來源的不同,選擇合適的 Flume 源介面卡,以實現高效的資料採集。
  • 資料轉換:在資料採集過程中,可能需要對資料進行格式化或轉換,以適配下游的處理系統。
  • 容錯與恢復:配置 Flume 的容錯和恢復機制,確保在發生故障時能夠快速恢復資料採集。

相關文章