作業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_wait
和execute_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 的容錯和恢復機制,確保在發生故障時能夠快速恢復資料採集。