Hướng dẫn về dữ liệu chuyến bay của Google với Python

Bình luận: 0

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.

Thiết lập môi trường của bạn

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

Quá trình cạo từng bước

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.

Bước 1. Hiểu cấu trúc của trang web

Để 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:

  1. Mở Chrome Devtools bằng cách nhấp chuột phải vào trang Google FLIGHTS và chọn "Kiểm tra" hoặc sử dụng phím tắt Ctrl+Shift+I (Windows/Linux) hoặc CMD+Tùy chọn+I (Mac).
  2. Kiểm tra các yếu tố bằng cách di chuột qua các phần khác nhau của trang. Điều này sẽ làm nổi bật cấu trúc HTML trong các devtools. Nhấp vào các yếu tố cụ thể để xem các thuộc tính của chúng, rất quan trọng để tạo các biểu thức XPath chính xác.
  3. Truy xuất các biểu thức XPath bằng cách nhấp chuột phải vào phần tử mong muốn trong bảng phần tử, chọn "Sao chép" và sau đó chọn "Sao chép XPath". Điều này sao chép biểu thức XPath trực tiếp vào bảng tạm của bạn, sẵn sàng sử dụng trong tập lệnh cạo của bạn.

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()

Bước 2. Gửi các yêu cầu HTTP và trích xuất nội dung trang với nhà viết kịch

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)

Bước 3. Trích xuất các chi tiết chung bằng cách sử dụng XPath

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

Bước 4. Trích xuất dữ liệu chuyến bay cụ thể bằng LXML

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
    })

Bước 5. Lưu dữ liệu vào CSV

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}")

Đặt mọi thứ lại với nhau

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.

Bình luận:

0 Bình luận