Cách cạo Yelp bằng cách sử dụng Python

Bình luận: 0

Dữ liệu cạo từ Yelp có thể cung cấp những hiểu biết có giá trị về các nhà hàng địa phương, bao gồm các chi tiết như tên, URL, ẩm thực và xếp hạng. Sử dụng các yêu cầu và thư viện Python LXML, hướng dẫn này sẽ chỉ ra cách cạo các kết quả tìm kiếm Yelp. Một số kỹ thuật sẽ được đề cập bao gồm sử dụng proxy, xử lý các tiêu đề và trích xuất dữ liệu bằng XPath.

Bước 1: Thiết lập môi trường

Trước khi bắt đầu quá trình cạo, đảm bảo bạn đã cài đặt Python và các thư viện cần thiết:

pip install requests
pip install lxml

Các thư viện này sẽ giúp chúng tôi gửi các yêu cầu HTTP đến Yelp, phân tích nội dung HTML và trích xuất dữ liệu chúng tôi cần.

Bước 2: Gửi yêu cầu đến Yelp

Đầu tiên, chúng tôi cần gửi yêu cầu GET đến trang kết quả tìm kiếm Yelp để tìm nạp nội dung HTML. Đây là cách làm điều đó:

import requests

# URL trang tìm kiếm Yelp
url = "https://www.yelp.com/search?find_desc=restaurants&find_loc=San+Francisco%2C+CA"

# Gửi yêu cầu nhận nội dung HTML
response = requests.get(url)

# Kiểm tra xem yêu cầu có thành công không
if response.status_code == 200:
    print("Successfully fetched the page content")
else:
    print("Failed to retrieve the page content")

Hiểu các tiêu đề HTTP

Khi đưa ra yêu cầu đến một trang web, điều cần thiết là bao gồm các tiêu đề HTTP phù hợp. Các tiêu đề có thể chứa siêu dữ liệu về yêu cầu, chẳng hạn như tác nhân người dùng, xác định trình duyệt hoặc công cụ thực hiện yêu cầu. Bao gồm các tiêu đề này có thể giúp tránh chặn hoặc điều chỉnh bởi trang web mục tiêu.

Đây là cách bạn có thể thiết lập tiêu đề:

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',
}

response = requests.get(url, headers=headers)

Thực hiện xoay proxy

Khi cạo một khối lượng lớn các trang, có nguy cơ địa chỉ IP của bạn bị chặn bởi trang web mục tiêu. Để ngăn chặn điều này, sử dụng các máy chủ proxy được khuyến nghị. Đối với hướng dẫn này, nên sử dụng các máy chủ proxy động có tính năng xoay tự động. Bằng cách này, bạn chỉ cần thiết lập cài đặt máy chủ proxy một lần và vòng quay sẽ giúp duy trì quyền truy cập bằng cách thay đổi định kỳ địa chỉ IP, giảm khả năng bị chặn.

proxies = {
    'http': 'http://username:password@proxy-server:port',
    'https': 'https://username:password@proxy-server:port'
}

response = requests.get(url, headers=headers, proxies=proxies)

Bước 3: Phân tích nội dung HTML với LXML

Khi chúng ta có nội dung HTML, bước tiếp theo là phân tích nó và trích xuất dữ liệu liên quan. Chúng tôi sẽ sử dụng thư viện LXML cho mục đích này.

from lxml import html

# Phân tích nội dung HTML bằng LXML
parser = html.fromstring(response.content)

Xác định các yếu tố để cạo

Chúng tôi cần nhắm mục tiêu danh sách nhà hàng cá nhân trên trang kết quả tìm kiếm. Các yếu tố này có thể được xác định bằng cách sử dụng các biểu thức XPath. Đối với Yelp, các danh sách thường được bọc trong một phần tử DIV với một thuộc tính dữ liệu cụ thể.

# Trích xuất các yếu tố nhà hàng cá nhân
elements = parser.xpath('//div[@data-testid="serp-ia-card"]')[2:-1]

Sử dụng XPath để trích xuất dữ liệu

XPath là một công cụ mạnh mẽ để điều hướng và chọn các nút từ tài liệu HTML. Trong hướng dẫn này, chúng tôi sẽ sử dụng các biểu thức XPath để trích xuất tên nhà hàng, url, ẩm thực và xếp hạng từ mỗi yếu tố nhà hàng.

Dưới đây là các XPath cụ thể cho từng điểm dữ liệu:

  1. Tên nhà hàng: .//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/text()
  2. URL nhà hàng: .//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/@href
  3. Ẩm thực: .//div[@class="priceCategory__09f24___4Wsg iaPriceCategory__09f24__x9YrM y-css-2hdccn"]/div/div/div/a/button/span/text()
  4. Xếp hạng: .//div[@class="y-css-9tnml4"]/@aria-label

Bước 4: Trích xuất dữ liệu từ mỗi danh sách nhà hàng

Bây giờ chúng tôi có nội dung HTML và đã xử lý chặn IP tiềm năng, chúng tôi có thể trích xuất dữ liệu cần thiết từ mỗi danh sách nhà hàng.

restaurants_data = []

# Lặp lại từng yếu tố nhà hàng
for element in elements:
    # Trích xuất tên nhà hàng
    name = element.xpath('.//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/text()')[0]

    # Trích xuất URL nhà hàng
    url = element.xpath('.//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/@href')[0]

    # Trích xuất các món ăn
    cuisines = element.xpath('.//div[@class="priceCategory__09f24___4Wsg iaPriceCategory__09f24__x9YrM y-css-2hdccn"]/div/div/div/a/button/span/text()')

    # Trích xuất xếp hạng
    rating = element.xpath('.//div[@class="y-css-9tnml4"]/@aria-label')[0]

    # Tạo một từ điển để lưu trữ dữ liệu
    restaurant_info = {
        "name": name,
        "url": url,
        "cuisines": cuisines,
        "rating": rating
    }

    # Thêm thông tin nhà hàng vào danh sách
    restaurants_data.append(restaurant_info)

Bước 5: Lưu dữ liệu dưới dạng JSON

Sau khi trích xuất dữ liệu, chúng ta cần lưu nó theo định dạng có cấu trúc. JSON là một định dạng được sử dụng rộng rãi cho mục đích này.

import json

# Lưu dữ liệu vào tệp JSON
with open('yelp_restaurants.json', 'w') as f:
    json.dump(restaurants_data, f, indent=4)

print("Data extraction complete. Saved to yelp_restaurants.json")

Hoàn thành Mã

import requests
from lxml import html
import json

# URL trang tìm kiếm Yelp
url = "https://www.yelp.com/search?find_desc=restaurants&find_loc=San+Francisco%2C+CA"

# Thiết lập tiêu đề để bắt chước yêu cầu trình duyệt
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Accept-Language': 'en-US,en;q=0.5'
}

# Thiết lập proxy nếu được yêu cầu
proxies = {
    'http': 'http://username:password@proxy-server:port',
    'https': 'https://username:password@proxy-server:port'
}

# Gửi yêu cầu nhận nội dung HTML
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:
    print("Successfully fetched the page content")
else:
    print("Failed to retrieve the page content")

# Phân tích nội dung HTML bằng LXML
parser = html.fromstring(response.content)

# Trích xuất các yếu tố nhà hàng cá nhân
elements = parser.xpath('//div[@data-testid="serp-ia-card"]')[2:-1]

# Khởi tạo một danh sách để giữ dữ liệu được trích xuất
restaurants_data = []

# Lặp lại từng yếu tố nhà hàng
for element in elements:
    # Trích xuất tên nhà hàng
    name = element.xpath('.//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/text()')[0]

    # Trích xuất URL nhà hàng
    url = element.xpath('.//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/@href')[0]

    # Trích xuất các món ăn
    cuisines = element.xpath('.//div[@class="priceCategory__09f24___4Wsg iaPriceCategory__09f24__x9YrM y-css-2hdccn"]/div/div/div/a/button/span/text()')

    # Trích xuất xếp hạng
    rating = element.xpath('.//div[@class="y-css-9tnml4"]/@aria-label')[0]

    # Tạo một từ điển để lưu trữ dữ liệu
    restaurant_info = {
        "name": name,
        "url": url,
        "cuisines": cuisines,
        "rating": rating
    }

    # Thêm thông tin nhà hàng vào danh sách
    restaurants_data.append(restaurant_info)

# Lưu dữ liệu vào tệp JSON
with open('yelp_restaurants.json', 'w') as f:
    json.dump(restaurants_data, f, indent=4)

print("Data extraction complete. Saved to yelp_restaurants.json")

Điều quan trọng đối với người dùng là cấu hình đúng các tiêu đề HTTP và sử dụng các proxy để phá vỡ các hạn chế và tránh chặn. Để có trải nghiệm cạo được tối ưu hóa và an toàn hơn, hãy xem xét tự động xoay IP. Sử dụng các proxy dân cư hoặc di động động có thể tăng cường đáng kể quá trình này, giảm khả năng bị phát hiện và chặn.

Bình luận:

0 Bình luận