Khi nói đến kế hoạch du lịch, phân tích cạnh tranh hoặc mục đích nghiên cứu, thông tin liên quan đến chuyến bay từ các chuyến bay của Google có thể mang lại những hiểu biết đáng kể. Dưới đây là một hướng dẫn từng bước về cách cạo thông tin chuyến bay bằng các thư viện Python, Playwright và LXML.
Trước khi lặn vào quy trình cạo, đảm bảo bạn đã cài đặt các thư viện Python cần thiết:
pip install playwright
Pip install lxml
Để sử dụng nhà viết kịch, bạn cũng cần cài đặt các nhị phân trình duyệt:
playwright install chromium
Chúng tôi sẽ tập trung vào việc trích xuất dữ liệu chuyến bay từ trang kết quả tìm kiếm của Google Flys.
Để xóa dữ liệu từ các chuyến bay của Google một cách hiệu quả, bạn phải làm quen với cấu trúc HTML của trang web. Đây là cách bạn có thể sử dụng Chrome Devtools để kiểm tra các yếu tố và truy xuất các biểu thức XPath cần thiết để cạo:
Danh sách các biểu thức XPath được sử dụng:
From Location: //input[@aria-label="Where from?"]/@value
To Location: //input[@aria-label="Where to?"]/@value
Departure Date: //input[@placeholder="Departure"]/@value
Return Date: //input[@placeholder="Return"]/@value
Lưu ý: XPath này trả về nhiều yếu tố, mỗi phần tử tương ứng với một chuyến bay riêng lẻ.
Flight Elements: //li[@class="pIav2d"]
Airway: .//div[@class="sSHqwe tPgKwe ogfYpf"]/span/text()
Details: .//span[@class="mv1WYe"]/@aria-label
Departure Time: .//span[@aria-describedby="gEvJbfc1583"]/span/text()
Arrival Time: .//span[@aria-describedby="gEvJbfc1584"]/span/text()
Travel Time: .//div[@class="gvkrdb AdWm1c tPgKwe ogfYpf"]/text()
Price: .//div[@class="YMlIz FpEdX"]/span/text()
Chúng tôi sử dụng nhà viết kịch để tương tác với trang web và trích xuất nội dung của nó. Cách tiếp cận này giúp xử lý nội dung động mà JavaScript có thể tải.
Sử dụng nhà viết kịch giúp xử lý nội dung động được tải bởi JavaScript. Nó khởi chạy một trình duyệt không đầu, điều hướng đến URL và trích xuất nội dung trang.
from playwright.sync_api import sync_playwright
# URL cho trang tìm kiếm chuyến bay của Google
url = "https link"
def get_page_content(url):
"""Tìm nạp nội dung HTML của URL đã cho bằng cách sử dụng nhà viết kịch."""
with sync_playwright() as p:
browser = p.chromium.launch(headless=True) # Trình duyệt khởi chạy ở chế độ không đầu
context = browser.new_context() # Tạo bối cảnh trình duyệt mới
page = context.new_page() # Mở một trang mới
page.goto(url) # Điều hướng đến URL được chỉ định
content = page.content() # Nhận nội dung trang
browser.close() # Đóng trình duyệt
return content
# Tìm nạp nội dung trang
page_content = get_page_content(url)
Tiếp theo, chúng tôi phân tích nội dung HTML của phản hồi bằng LXML để trích xuất các chi tiết chuyến bay phổ biến như khởi hành và ngày trả lại.
from lxml import html
# Tạo trình phân tích cú pháp
tree = html.fromstring(page_content)
# Trích xuất các chi tiết chuyến bay phổ biến bằng cách sử dụng XPath
from_location = tree.xpath('//input[@aria-label="Where from?"]/@value')[0] # Nhận vị trí 'từ'
to_location = tree.xpath('//input[@aria-label="Where to?"]/@value')[0] # Nhận vị trí 'đến'
departure_date = tree.xpath('//input[@placeholder="Departure"]/@value')[0] # Nhận ngày khởi hành
return_date = tree.xpath('//input[@placeholder="Return"]/@value')[0] # Nhận ngày trả lại
Sau đó, chúng tôi phân tích nội dung HTML để trích xuất thông tin chuyến bay cụ thể dựa trên các biểu thức XPath được xác định.
# Khởi tạo một danh sách trống để lưu trữ chi tiết chuyến bay
flights = []
# Trích xuất các yếu tố bay từ HTML phân tích cú pháp bằng cách sử dụng XPath
flight_elements = tree.xpath('//li[@class="pIav2d"]')
# Vòng lặp qua từng yếu tố chuyến bay và chi tiết chi tiết
for flight in flight_elements:
# Trích xuất tên hàng không
airway = flight.xpath('.//div[@class="sSHqwe tPgKwe ogfYpf"]/span/text()')[0].strip()
# Trích xuất các chi tiết chuyến bay như LayoVers
details = flight.xpath('.//span[@class="mv1WYe"]/@aria-label')[0]
# Trích xuất thời gian khởi hành
departure = flight.xpath('.//span[@jscontroller="cNtv4b"]/span/text()')[0].strip()
# Trích xuất thời gian đến
arrival = flight.xpath('.//span[@jscontroller="cNtv4b"]/span/text()')[1].strip()
# Trích xuất tổng thời gian di chuyển
travel_time = flight.xpath('.//div[@class="gvkrdb AdWm1c tPgKwe ogfYpf"]/text()')[0].strip()
# Trích xuất giá của chuyến bay
price = flight.xpath('.//div[@class="U3gSDe"]/div/div[2]/span/text()')[0].strip()
# Nối các chi tiết được trích xuất vào danh sách các chuyến bay như một từ điển
flights.append({
'Airway': airway,
'Details': details,
'Departure': departure,
'Arrival': arrival,
'Travel Time': travel_time,
'Price': price,
'From': from_location,
'To': to_location,
'Departure Date': departure_date,
'Return Date': return_date
})
Cuối cùng, chúng tôi sử dụng mô-đun CSV tích hợp của Python để lưu dữ liệu được trích xuất vào tệp CSV để phân tích thêm.
import csv
# Xác định đường dẫn tệp CSV
csv_file = 'google_flights.csv'
# Xác định tên trường CSV
fieldnames = ['Airway', 'Details', 'Departure', 'Arrival', 'Travel Time', 'Price', 'From', 'To', 'Departure Date', 'Return Date']
# Viết dữ liệu vào tệp CSV
with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
writer = csv.DictWriter(file, fieldnames=fieldnames)
writer.writeheader()
for flight in flights:
writer.writerow(flight)
print(f"Data saved to {csv_file}")
from playwright.sync_api import sync_playwright
from lxml import html
import csv
# URL cho trang tìm kiếm chuyến bay của Google
url = "https link"
def get_page_content(url):
"""Tìm nạp nội dung HTML của URL đã cho bằng cách sử dụng nhà viết kịch."""
with sync_playwright() as p:
browser = p.chromium.launch(headless=False) # Khởi chạy trình duyệt ở chế độ headful
context = browser.new_context() # Tạo bối cảnh trình duyệt mới
page = context.new_page() # Mở một trang mới
page.goto(url) # Điều hướng đến URL được chỉ định
page.wait_for_timeout(10000) # Chờ 10 giây để đảm bảo tải trang hoàn toàn
content = page.content() # Nhận nội dung trang
browser.close() # Đóng trình duyệt
return content
# Tìm nạp nội dung trang
page_content = get_page_content(url)
# Phân tích nội dung HTML bằng LXML
tree = html.fromstring(page_content)
# Trích xuất chi tiết tìm kiếm chuyến bay
from_location = tree.xpath('//input[@aria-label="Where from?"]/@value')[0]
to_location = tree.xpath('//input[@aria-label="Where to?"]/@value')[0]
departure_date = tree.xpath('//input[@placeholder="Departure"]/@value')[0]
return_date = tree.xpath('//input[@placeholder="Return"]/@value')[0]
# Khởi tạo một danh sách để lưu trữ chi tiết chuyến bayils
flights = []
# Trích xuất các yếu tố bay từ HTML phân tích cú pháp
flight_elements = tree.xpath('//li[@class="pIav2d"]')
for flight in flight_elements:
airway = flight.xpath('.//div[@class="sSHqwe tPgKwe ogfYpf"]/span/text()')[0].strip()
details = flight.xpath('.//span[@class="mv1WYe"]/@aria-label')[0]
departure = flight.xpath('.//span[@jscontroller="cNtv4b"]/span/text()')[0].strip()
arrival = flight.xpath('.//span[@jscontroller="cNtv4b"]/span/text()')[1].strip()
travel_time = flight.xpath('.//div[@class="gvkrdb AdWm1c tPgKwe ogfYpf"]/text()')[0].strip()
price = flight.xpath('.//div[@class="U3gSDe"]/div/div[2]/span/text()')[0].strip()
# Phụ lục chi tiết chuyến bay vào danh sách
flights.append({
'Airway': airway,
'Details': details,
'Departure': departure,
'Arrival': arrival,
'Travel Time': travel_time,
'Price': price,
'From': from_location,
'To': to_location,
'Departure Date': departure_date,
'Return Date': return_date
})
# Xác định đường dẫn tệp CSV
csv_file = 'google_flights.csv'
# Xác định tên trường CSV
fieldnames = ['Airway', 'Details', 'Departure', 'Arrival', 'Travel Time', 'Price', 'From', 'To', 'Departure Date', 'Return Date']
# Viết chi tiết chuyến bay được trích xuất vào tệp CSV
with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
writer = csv.DictWriter(file, fieldnames=fieldnames)
writer.writeheader() # Viết hàng tiêu đề
for flight in flights:
writer.writerow(flight) # Viết chi tiết của mỗi chuyến bay
print(f"Data saved to {csv_file}")
Để giảm nguy cơ phát hiện trong khi cạo dữ liệu, nên kết hợp sự chậm trễ giữa các yêu cầu và sử dụng proxy. Việc thực hiện sự chậm trễ giúp bắt chước sự tương tác của con người, khiến các trang web khó phát hiện các hoạt động cạo tự động hơn. Đối với lựa chọn proxy, các proxy động dân cư được khuyến nghị vì chúng cung cấp mức độ tin cậy cao và ít có khả năng bị chặn do tính chất động của chúng. Ngoài ra, bạn có thể sử dụng một nhóm proxy ISP tĩnh, cung cấp kết nối ổn định và nhanh chóng, tăng cường độ tin cậy của quá trình trích xuất dữ liệu của bạn. Các chiến lược này giúp trốn tránh các biện pháp bảo vệ mà các trang web sử dụng để xác định và chặn bot cào.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Bình luận: 0