Hướng dẫn này trình bày cách cạo dữ liệu từ Yahoo Finance bằng Python, sử dụng các yêu cầu và thư viện LXML. Yahoo Finance cung cấp dữ liệu tài chính rộng rãi như giá cổ phiếu và xu hướng thị trường, là mấu chốt để phân tích thị trường thời gian thực, mô hình hóa tài chính và chế tạo các chiến lược đầu tư tự động.
Quy trình đòi hỏi phải gửi các yêu cầu HTTP để truy xuất nội dung trang web, phân tích cú pháp HTML nhận được và trích xuất dữ liệu cụ thể bằng cách sử dụng các biểu thức XPath. Cách tiếp cận này cho phép trích xuất dữ liệu hiệu quả và được nhắm mục tiêu, cho phép người dùng truy cập và sử dụng thông tin tài chính một cách linh hoạt.
Chúng tôi sẽ sử dụng các thư viện Python sau:
Trước khi bạn bắt đầu, hãy đảm bảo bạn đã cài đặt các thư viện này:
pip install requests
pip install lxml
Dưới đây, chúng tôi sẽ khám phá quá trình phân tích cú pháp theo từng bước, hoàn thành với các ví dụ mã để rõ ràng và dễ hiểu.
Bước đầu tiên trong việc cạo web là gửi yêu cầu HTTP đến URL đích. Chúng tôi sẽ sử dụng thư viện yêu cầu để làm điều này. Điều quan trọng là bao gồm các tiêu đề thích hợp trong yêu cầu bắt chước một trình duyệt thực, giúp bỏ qua các biện pháp chống BOT cơ bản.
import requests
from lxml import html
# URL mục tiêu
url = "https://finance.yahoo.com/quote/AMZN/"
# Tiêu đề bắt chước một trình duyệt thực
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'accept-language': 'en-IN,en;q=0.9',
'cache-control': 'no-cache',
'dnt': '1',
'pragma': 'no-cache',
'priority': 'u=0, i',
'sec-ch-ua': '"Not)A;Brand";v="99", "Google Chrome";v="127", "Chromium";v="127"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Linux"',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'none',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36',
}
# Gửi yêu cầu HTTP
response = requests.get(url, headers=headers)
Sau khi nhận được nội dung HTML, bước tiếp theo là trích xuất dữ liệu mong muốn bằng XPath. XPath là một ngôn ngữ truy vấn mạnh mẽ để chọn các nút từ tài liệu XML, hoàn hảo để phân tích nội dung HTML.
Tiêu đề và Giá :
Thêm chi tiết:
Dưới đây là các biểu thức XPath chúng ta sẽ sử dụng để trích xuất các phần dữ liệu tài chính khác nhau:
# Phân tích nội dung HTML
parser = html.fromstring(response.content)
# Trích xuất dữ liệu bằng cách sử dụng XPath
title = ' '.join(parser.xpath('//h1[@class="yf-3a2v0c"]/text()'))
live_price = parser.xpath('//fin-streamer[@class="livePrice yf-mgkamr"]/span/text()')[0]
date_time = parser.xpath('//div[@slot="marketTimeNotice"]/span/text()')[0]
open_price = parser.xpath('//ul[@class="yf-tx3nkj"]/li[2]/span[2]/fin-streamer/text()')[0]
previous_close = parser.xpath('//ul[@class="yf-tx3nkj"]/li[1]/span[2]/fin-streamer/text()')[0]
days_range = parser.xpath('//ul[@class="yf-tx3nkj"]/li[5]/span[2]/fin-streamer/text()')[0]
week_52_range = parser.xpath('//ul[@class="yf-tx3nkj"]/li[6]/span[2]/fin-streamer/text()')[0]
volume = parser.xpath('//ul[@class="yf-tx3nkj"]/li[7]/span[2]/fin-streamer/text()')[0]
avg_volume = parser.xpath('//ul[@class="yf-tx3nkj"]/li[8]/span[2]/fin-streamer/text()')[0]
# In dữ liệu được trích xuất
print(f"Title: {title}")
print(f"Live Price: {live_price}")
print(f"Date & Time: {date_time}")
print(f"Open Price: {open_price}")
print(f"Previous Close: {previous_close}")
print(f"Day's Range: {days_range}")
print(f"52 Week Range: {week_52_range}")
print(f"Volume: {volume}")
print(f"Avg. Volume: {avg_volume}")
Các trang web như Yahoo Finance thường sử dụng các biện pháp chống BOT để ngăn chặn sự tự động. Để tránh bị chặn, bạn có thể sử dụng proxy và xoay tiêu đề.
Một máy chủ proxy hoạt động như một trung gian giữa máy của bạn và trang web đích. Nó giúp che dấu địa chỉ IP của bạn, khiến các trang web khó phát hiện ra rằng bạn đang cạo.
# Ví dụ về việc sử dụng proxy với mô hình ủy quyền IP
proxies = {
"http": "http://your.proxy.server:port",
"https": "https://your.proxy.server:port"
}
response = requests.get(url, headers=headers, proxies=proxies)
Xoay tiêu đề tác nhân người dùng là một cách hiệu quả khác để tránh phát hiện. Bạn có thể sử dụng danh sách các chuỗi tác nhân người dùng chung và chọn ngẫu nhiên một chuỗi cho mỗi yêu cầu.
import random
user_agents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0",
# Thêm nhiều chuỗi tác nhân người dùng tại đây
]
headers["user-agent"]: random.choice(user_agents)
response = requests.get(url, headers=headers)
Cuối cùng, bạn có thể lưu dữ liệu bị xóa vào tệp CSV để sử dụng sau. Điều này đặc biệt hữu ích để lưu trữ các bộ dữ liệu lớn hoặc phân tích dữ liệu ngoại tuyến.
import csv
# Dữ liệu sẽ được lưu
data = [
["URL", "Title", "Live Price", "Date & Time", "Open Price", "Previous Close", "Day's Range", "52 Week Range", "Volume", "Avg. Volume"],
[url, title, live_price, date_time, open_price, previous_close, days_range, week_52_range, volume, avg_volume]
]
# Lưu vào tệp CSV
with open("yahoo_finance_data.csv", "w", newline="") as file:
writer = csv.writer(file)
writer.writerows(data)
print("Data saved to yahoo_finance_data.csv")
Dưới đây là tập lệnh Python hoàn chỉnh tích hợp tất cả các bước chúng tôi đã thảo luận. Điều này bao gồm gửi các yêu cầu với các tiêu đề, sử dụng proxy, trích xuất dữ liệu bằng XPath và lưu dữ liệu vào tệp CSV.
import requests
from lxml import html
import random
import csv
# Ví dụ URL để cạo
url = "https://finance.yahoo.com/quote/AMZN/"
# Danh sách các chuỗi tác nhân người dùng cho các tiêu đề xoay
user_agents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0",
# Thêm nhiều chuỗi tác nhân người dùng tại đây
]
# Tiêu đề bắt chước một trình duyệt thực
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'accept-language': 'en-IN,en;q=0.9',
'cache-control': 'no-cache',
'dnt': '1',
'pragma': 'no-cache',
'priority': 'u=0, i',
'sec-ch-ua': '"Not)A;Brand";v="99", "Google Chrome";v="127", "Chromium";v="127"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Linux"',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'none',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'User-agent': random.choice(user_agents),
}
# Ví dụ về việc sử dụng proxy
proxies = {
"http": "http://your.proxy.server:port",
"https": "https://your.proxy.server:port"
}
# Gửi yêu cầu HTTP với các tiêu đề và proxy tùy chọn
response = requests.get(url, headers=headers, proxies=proxies)
# Kiểm tra xem yêu cầu có thành công không
if response.status_code == 200:
# Phân tích nội dung HTML
parser = html.fromstring(response.content)
# Trích xuất dữ liệu bằng cách sử dụng XPath
title = ' '.join(parser.xpath('//h1[@class="yf-3a2v0c"]/text()'))
live_price = parser.xpath('//fin-streamer[@class="livePrice yf-mgkamr"]/span/text()')[0]
date_time = parser.xpath('//div[@slot="marketTimeNotice"]/span/text()')[0]
open_price = parser.xpath('//ul[@class="yf-tx3nkj"]/li[2]/span[2]/fin-streamer/text()')[0]
previous_close = parser.xpath('//ul[@class="yf-tx3nkj"]/li[1]/span[2]/fin-streamer/text()')[0]
days_range = parser.xpath('//ul[@class="yf-tx3nkj"]/li[5]/span[2]/fin-streamer/text()')[0]
week_52_range = parser.xpath('//ul[@class="yf-tx3nkj"]/li[6]/span[2]/fin-streamer/text()')[0]
volume = parser.xpath('//ul[@class="yf-tx3nkj"]/li[7]/span[2]/fin-streamer/text()')[0]
avg_volume = parser.xpath('//ul[@class="yf-tx3nkj"]/li[8]/span[2]/fin-streamer/text()')[0]
# In dữ liệu được trích xuất
print(f"Title: {title}")
print(f"Live Price: {live_price}")
print(f"Date & Time: {date_time}")
print(f"Open Price: {open_price}")
print(f"Previous Close: {previous_close}")
print(f"Day's Range: {days_range}")
print(f"52 Week Range: {week_52_range}")
print(f"Volume: {volume}")
print(f"Avg. Volume: {avg_volume}")
# Lưu dữ liệu vào tệp CSV
data = [
["URL", "Title", "Live Price", "Date & Time", "Open Price", "Previous Close", "Day's Range", "52 Week Range", "Volume", "Avg. Volume"],
[url, title, live_price, date_time, open_price, previous_close, days_range, week_52_range, volume, avg_volume]
]
with open("yahoo_finance_data.csv", "w", newline="") as file:
writer = csv.writer(file)
writer.writerows(data)
print("Data saved to yahoo_finance_data.csv")
else:
print(f"Failed to retrieve data. Status code: {response.status_code}")
Quét dữ liệu tài chính Yahoo bằng Python là một cách mạnh mẽ để tự động hóa việc thu thập dữ liệu tài chính. Bằng cách sử dụng các yêu cầu và thư viện LXML, cùng với các tiêu đề, proxy và các biện pháp chống BOT thích hợp, bạn có thể cạo và lưu trữ dữ liệu chứng khoán một cách hiệu quả để phân tích. Hướng dẫn này bao gồm những điều cơ bản, nhưng hãy nhớ tuân thủ các hướng dẫn pháp lý và đạo đức khi cạo các trang web.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Bình luận: 0