資料採集作業四
作業①:
要求:
熟練掌握 Selenium 查詢HTML元素、爬取Ajax網頁資料、等待HTML元素等內容。
使用Selenium框架+ MySQL資料庫儲存技術路線爬取“滬深A股”、“上證A股”、“深證A股”3個板塊的股票資料資訊。
候選網站:東方財富網:http://quote.eastmoney.com/center/gridlist.html#hs_a_board
輸出資訊:MYSQL資料庫儲存和輸出格式如下,表頭應是英文命名例如:序號id,股票程式碼:bStockNo……,由同學們自行定義設計表頭
(1)程式碼如下:
import mysql.connector
def establish_db_connection_and_create_schema():
# 連線到MySQL資料庫
conn = mysql.connector.connect(
host="host",
user="username",
passwd="password"
)
cursor = conn.cursor()
# 定義資料庫和表名
db_name = "stock_market_data"
table_name = "shenzhen_stocks"
# 建立資料庫(如果不存在)
create_db_query = f"CREATE DATABASE IF NOT EXISTS {db_name}"
cursor.execute(create_db_query)
# 使用建立的資料庫
use_db_query = f"USE {db_name}"
cursor.execute(use_db_query)
# 定義表的建立語句
create_table_query = f"""
CREATE TABLE IF NOT EXISTS {table_name} (
record_id INT AUTO_INCREMENT PRIMARY KEY,
stock_number VARCHAR(255),
stock_name VARCHAR(255),
last_trade_price VARCHAR(255),
percentage_change VARCHAR(255),
change_amount VARCHAR(255),
trading_volume VARCHAR(255),
total_trading_amount VARCHAR(255),
price_range VARCHAR(255),
daily_high VARCHAR(255),
daily_low VARCHAR(255),
opening_price VARCHAR(255),
previous_close VARCHAR(255)
)
"""
# 執行表的建立語句
cursor.execute(create_table_query)
# 提交更改
conn.commit()
# 關閉遊標和連線
cursor.close()
conn.close()
# 呼叫函式以建立資料庫和表
establish_db_connection_and_create_schema()
爬取“滬深A股”、“上證A股”、“深證A股”
點選檢視程式碼
(2)執行結果
結果如下:
(3)感悟
透過這次實踐,我藉助 Selenium 精準定位 HTML 元素、處理 Ajax 載入、模擬使用者操作,有效應對複雜網頁的資料提取需求。同時,將爬取的資料儲存到 MySQL 資料庫中,不僅考驗了資料結構設計能力,還強化了對資料庫操作的理解。在這一過程中,我學會了從問題分析到程式碼實現的完整流程,提升了程式碼的魯棒性和複用性,也對網頁爬蟲技術與資料庫儲存有了更深入的認識,為後續的資料分析與開發實踐奠定了紮實的基礎。
作業②:
要求:
熟練掌握 Selenium 查詢HTML元素、實現使用者模擬登入、爬取Ajax網頁資料、等待HTML元素等內容。
使用Selenium框架+MySQL爬取中國mooc網課程資源資訊(課程號、課程名稱、學校名稱、主講教師、團隊成員、參加人數、課程進度、課程簡介)
候選網站:中國mooc網:https://www.icourse163.org
輸出資訊:MYSQL資料庫儲存和輸出格式
(1)程式碼如下:
import time
import mysql.connector
from selenium import webdriver
from selenium.webdriver.common.by import By
# 初始化資料庫連線
db = mysql.connector.connect(
host="host",
user="user",
password="password",
database="database"
)
cursor = db.cursor()
# 初始化WebDriver
driver = webdriver.Chrome() # 確保已安裝ChromeDriver
def wait_for_page_load():
time.sleep(5) # 等待頁面載入,這裡可以使用更先進的等待方法,如WebDriverWait
def scrape_course_details(course_element):
course_name = course_element.find_element(By.XPATH, './/h3').text
college_name = course_element.find_element(By.XPATH, './/p[@class="_2lZi3"]').text
teacher_name = course_element.find_element(By.XPATH, './/div[@class="_1Zkj9"]').text
participant_count = course_element.find_element(By.XPATH, './/div[@class="jvxcQ"]/span').text
progress = course_element.find_element(By.XPATH, './/div[@class="jvxcQ"]/div').text
return course_name, college_name, teacher_name, participant_count, progress
def scrape_teacher_team(driver):
teacher_names = []
next_button_xpath = '//div[@class="um-list-slider_next f-pa"]'
teacher_item_xpath = '//div[@class="um-list-slider_con_item"]/h3[@class="f-fc3"]'
while True:
teachers = driver.find_elements(By.XPATH, teacher_item_xpath)
for teacher in teachers:
teacher_names.append(teacher.text.strip())
next_button = driver.find_element(By.XPATH, next_button_xpath)
if not next_button:
break
next_button.click()
wait_for_page_load()
return ','.join(teacher_names)
def scrape_course_brief(driver):
brief_xpath = '//*[@id="j-rectxt2"]'
content_section_xpath = '//*[@id="content-section"]/div[4]/div//*'
brief = driver.find_element(By.XPATH, brief_xpath).text
if not brief:
elements = driver.find_elements(By.XPATH, content_section_xpath)
brief = ' '.join(element.text for element in elements)
# 轉義引號
brief = brief.replace('"', r'\"').replace("'", r"\'")
return brief.strip()
def scrape_and_save_course_data(course_url):
driver.get(course_url)
wait_for_page_load()
course_elements = driver.find_elements(By.XPATH, '//*[@id="channel-course-list"]/div/div/div[2]/div[1]/div')
for course_element in course_elements:
course_name, college_name, teacher_name, participant_count, progress = scrape_course_details(course_element)
course_element.click()
wait_for_page_load()
# 切換到新標籤頁
new_tab = [handle for handle in driver.window_handles if handle != driver.current_window_handle][0]
driver.switch_to.window(new_tab)
course_brief = scrape_course_brief(driver)
teacher_team = scrape_teacher_team(driver)
# 關閉新標籤頁並返回原頁面
driver.close()
driver.switch_to.window(driver.window_handles[0])
try:
cursor.execute('INSERT INTO courseMessage (course_name, college_name, teacher_name, teacher_team, participant_count, progress, brief) VALUES (%s, %s, %s, %s, %s, %s, %s)', (
course_name, college_name, teacher_name, teacher_team, participant_count, progress, course_brief))
db.commit()
except mysql.connector.Error as e:
print("資料庫插入資料失敗:", e)
# 使用示例(假設有一個課程列表頁面的URL)
course_list_url = "your_course_list_url_here"
scrape_and_save_course_data(course_list_url)
# 關閉資料庫連線和WebDriver
cursor.close()
db.close()
driver.quit()
(2)結果如下
(3)感悟
結合 MySQL 資料庫對爬取的資料進行儲存和管理,鍛鍊了我在設計表結構、處理資料完整性和提高查詢效率方面的能力。整個過程中,我學會了分析複雜網頁結構、應對動態載入的挑戰,以及如何高效地組織和持久化大規模資料,為後續更復雜的資料採集和分析任務積累了寶貴的經驗。
3.華為雲_大資料實時分析處理實驗手冊-Flume日誌採集實驗
任務一:Python指令碼生成測試資料
執行指令碼測試
使用more命令檢視生成的資料
任務二:下載安裝並配置Kafka
安裝Kafka執行環境
安裝Kafka客戶端
任務三:安裝Flume客戶端
安裝Flume執行環境
安裝Flume客戶端
任務四:配置Flume採集資料
修改配置檔案
建立消費者消費kafka中的資料
感悟
透過本次實驗,進一步鞏固了我對分散式資料處理的理解。這次實踐讓我深刻認識到流式資料處理在大資料實時分析中的重要性,同時強化了我在配置環境、處理錯誤、最佳化資料流管道等方面的能力,為日後複雜的大資料專案開發提供了寶貴的經驗。