Python nổi bật như một lựa chọn hàng đầu để quét web do các thư viện mạnh mẽ và cú pháp đơn giản. Trong bài viết này, chúng tôi sẽ khám phá các nguyên tắc cơ bản của việc cạo web và hướng dẫn bạn thông qua việc thiết lập môi trường Python của bạn để tạo máy cạo web đầu tiên của bạn. Chúng tôi sẽ giới thiệu cho bạn các thư viện Python chính phù hợp với các nhiệm vụ cào, bao gồm súp đẹp, nhà viết kịch và LXML.
Python cung cấp một số thư viện để làm cho việc cạo web dễ dàng hơn. Dưới đây là một số trong những cái được sử dụng phổ biến nhất:
HTTP (Giao thức chuyển siêu văn bản) là giao thức lớp ứng dụng để truyền dữ liệu trên web. Bạn nhập URL vào trình duyệt và nó tạo yêu cầu HTTP và gửi nó đến máy chủ web. Sau đó, máy chủ web gửi lại phản hồi HTTP cho trình duyệt mà nó hiển thị cho bạn dưới dạng trang HTML. Để quét web, bạn cần bắt chước quá trình này và tạo các yêu cầu HTTP từ tập lệnh của bạn để lấy nội dung HTTP của các trang web được lập trình.
Đầu tiên, đảm bảo bạn đã cài đặt Python trên hệ thống của mình. Bạn có thể tải xuống từ trang web chính thức của Python.
Một môi trường ảo giúp quản lý các phụ thuộc. Sử dụng các lệnh này để tạo và kích hoạt môi trường ảo:
python -m venv scraping_env
source scraping_env/bin/activate
Tiếp theo, cài đặt các gói yêu cầu bằng các lệnh sau:
pip install requests
pip install beautifulsoup4
pip install lxml
Hãy để bắt đầu với một máy cạo web đơn giản bằng cách sử dụng yêu cầu cạo nội dung HTML tĩnh.
Loại yêu cầu HTTP phổ biến nhất là yêu cầu GET, được sử dụng để lấy dữ liệu từ một URL được chỉ định. Dưới đây là một ví dụ cơ bản về cách thực hiện yêu cầu nhận được http://example.com.
import requests
url = 'http://example.com'
response = requests.get(url)
Thư viện yêu cầu cung cấp một số cách để xử lý và xử lý phản hồi:
Kiểm tra Mã trạng thái: Đảm bảo yêu cầu thành công.
if response.status_code == 200:
print('Request was successful!')
else:
print('Request failed with status code:', response.status_code)
Trích xuất nội dung: Trích xuất nội dung văn bản hoặc JSON từ phản hồi.
# Nhận nội dung phản hồi làm văn bản
page_content = response.text
print(page_content)
# Nhận nội dung phản hồi dưới dạng JSON (nếu phản hồi ở định dạng JSON)
json_content = response.json()
print(json_content)
HTTP và các lỗi mạng có thể xảy ra khi không thể truy cập được tài nguyên, yêu cầu hết thời gian hoặc máy chủ trả về trạng thái HTTP lỗi (ví dụ: không tìm thấy 404, 500 lỗi máy chủ nội bộ). Chúng ta có thể sử dụng các đối tượng ngoại lệ được nêu ra bởi các yêu cầu để xử lý các tình huống này.
import requests
url = 'http://example.com'
try:
response = requests.get(url, timeout=10) # Set a timeout for the request
response.raise_for_status() # Raises an HTTPError for bad responses
except requests.exceptions.HTTPError as http_err:
print(f'HTTP error occurred: {http_err}')
except requests.exceptions.ConnectionError:
print('Failed to connect to the server.')
except requests.exceptions.Timeout:
print('The request timed out.')
except requests.exceptions.RequestException as req_err:
print(f'Request error: {req_err}')
else:
print('Request was successful!')
Để quét web, chúng ta thường cần trích xuất dữ liệu từ nội dung HTML. Phần này sẽ nói về cách xác định vị trí và trích xuất dữ liệu từ các phần tử HTML với một số thư viện như Súp đẹp hoặc LXML.
HTML (Ngôn ngữ đánh dấu HyperText) là ngôn ngữ đánh dấu chuẩn để tạo ra các trang web. Nó bao gồm các phần tử lồng nhau được đại diện bởi các thẻ, chẳng hạn như <div>, <p>, <a>, v.v. Mỗi thẻ có thể có thuộc tính và chứa văn bản, các thẻ khác, hoặc cả hai.
Bộ chọn XPath và CSS cung cấp một cách đa năng để chọn các phần tử HTML dựa trên các thuộc tính của chúng hoặc vị trí của chúng trong tài liệu.
Khi quét web, trích xuất dữ liệu cụ thể từ các trang web thường yêu cầu xác định các bộ chọn XPath hoặc CSS chính xác để nhắm mục tiêu các phần tử HTML. Đây là cách bạn có thể tìm thấy các bộ chọn này một cách hiệu quả:
Hầu hết các trình duyệt web hiện đại đi kèm với các công cụ phát triển tích hợp cho phép bạn kiểm tra cấu trúc HTML của các trang web. Tại đây, một hướng dẫn từng bước về cách sử dụng các công cụ này:
XPath: /html/body/div/h1
CSS Selector: body > div > h1
Súp đẹp là thư viện Python để phân tích các tài liệu HTML và XML. Nó cung cấp các phương thức và thuộc tính đơn giản để điều hướng và tìm kiếm thông qua cấu trúc HTML.
from bs4 import BeautifulSoup
import requests
# URL của trang web để cạo
url = 'https://example.com'
# Gửi HTTP Nhận yêu cầu đến URL
response = requests.get(url)
# Phân tích nội dung HTML của phản hồi bằng cách sử dụng súp đẹp
soup = BeautifulSoup(response.content, 'html.parser')
# Sử dụng bộ chọn CSS để tìm tất cả các thẻ <h1> nằm trong các thẻ <div>
# là con trực tiếp của thẻ <body>.
h1_tags = soup.select('body > div > h1')
# Lặp qua danh sách các thẻ <h1> đã tìm thấy và in nội dung văn bản của chúng.
for tag in h1_tags:
print(tag.text)
Lỗi phân tích cú pháp xảy ra khi cấu trúc HTML hoặc XML không như mong đợi, gây ra các vấn đề trong trích xuất dữ liệu. Chúng có thể được quản lý bằng cách xử lý các trường hợp ngoại lệ như thuộc tính.
from bs4 import BeautifulSoup
import requests
# URL của trang web để cạo
url = 'https://example.com'
# Gửi HTTP Nhận yêu cầu đến URL
response = requests.get(url)
try:
# Phân tích nội dung HTML của phản hồi bằng cách sử dụng súp đẹp
soup = BeautifulSoup(response.content, 'html.parser')
# Sử dụng bộ chọn CSS để tìm tất cả các thẻ <h1> nằm trong các thẻ <div>
# là con trực tiếp của thẻ <body>.
h1_tags = soup.select('body > div > h1')
# Lặp qua danh sách các thẻ <h1> đã tìm thấy và in nội dung văn bản của chúng.
for tag in h1_tags:
print(tag.text)
except AttributeError as attr_err:
# Xử lý các trường hợp có thể xảy ra một thuộc tính (ví dụ: nếu phản hồi.
print(f'Attribute error occurred: {attr_err}')
except Exception as parse_err:
# Xử lý bất kỳ trường hợp ngoại lệ nào khác có thể xảy ra trong quá trình phân tích cú pháp
print(f'Error while parsing HTML: {parse_err}')
Ngoài súp đẹp, một thư viện phổ biến khác để phân tích các tài liệu HTML và XML trong Python là LXML. Mặc dù BeautifulSoup tập trung vào việc cung cấp một giao diện thuận tiện để điều hướng và điều khiển dữ liệu phân tích cú pháp, LXML được biết đến với tốc độ và tính linh hoạt của nó, khiến nó trở thành một lựa chọn ưa thích cho các nhiệm vụ quan trọng hiệu suất.
from lxml.html import fromstring
import requests
# URL của trang web để cạo
url = 'https://example.com'
# Gửi HTTP Nhận yêu cầu đến URL
response = requests.get(url)
# Phân tích nội dung HTML của phản hồi bằng phương pháp FromString của LXML
parser = fromstring(response.text)
# Sử dụng XPath để tìm nội dung văn bản của thẻ <h1> đầu tiên
# nằm trong thẻ <div>, là con trực tiếp của thẻ <body>.
title = parser.xpath('/html/body/div/h1/text()')[0]
# In tiêu đề
print(title)
Tương tự như súp đẹp, LXML cho phép bạn xử lý các lỗi phân tích cú pháp một cách duyên dáng bằng cách bắt các ngoại lệ như lxml.etree.xmlsyntaxerror.
from lxml.html import fromstring
from lxml import etree
import requests
# URL của trang web để cạo
url = 'https://example.com'
# Gửi HTTP Nhận yêu cầu đến URL
response = requests.get(url)
try:
# Phân tích nội dung HTML của phản hồi bằng phương pháp FromString của LXML
parser = fromstring(response.text)
# Sử dụng XPath để tìm nội dung văn bản của thẻ <h1> đầu tiên
# nằm trong thẻ <div>, là con trực tiếp của thẻ <body>.
title = parser.xpath('/html/body/div/h1/text()')[0]
# In tiêu đề
print(title)
except IndexError:
# Xử lý trường hợp truy vấn XPath không trả về bất kỳ kết quả nào
print('No <h1> tag found in the specified location.')
except etree.XMLSyntaxError as parse_err:
# Xử lý các lỗi cú pháp XML trong quá trình phân tích cú pháp
print(f'Error while parsing HTML: {parse_err}')
except Exception as e:
# Xử lý bất kỳ trường hợp ngoại lệ nào khác
print(f'An unexpected error occurred: {e}')
Khi bạn đã trích xuất thành công dữ liệu từ các phần tử HTML, bước tiếp theo là lưu dữ liệu này. Python cung cấp một số tùy chọn để lưu dữ liệu bị xóa, bao gồm lưu vào các tệp CSV, tệp JSON và cơ sở dữ liệu. Ở đây, một cái nhìn tổng quan về cách lưu dữ liệu được trích xuất bằng các định dạng khác nhau:
CSV (giá trị phân tách bằng dấu phẩy) là một định dạng đơn giản và được sử dụng rộng rãi để lưu trữ dữ liệu bảng. Mô -đun CSV trong Python giúp dễ dàng ghi dữ liệu vào các tệp CSV.
import csv
# Dữ liệu mẫu
data = {
'title': 'Example Title',
'paragraphs': ['Paragraph 1', 'Paragraph 2', 'Paragraph 3']
}
# Lưu dữ liệu vào tệp CSV
with open('scraped_data.csv', mode='w', newline='', encoding='utf-8') as file:
writer = csv.writer(file)
writer.writerow(['Title', 'Paragraph'])
for paragraph in data['paragraphs']:
writer.writerow([data['title'], paragraph])
print('Data saved to scraped_data.csv')
JSON (Ký hiệu đối tượng JavaScript) là một định dạng-interchange dữ liệu nhẹ, dễ đọc và viết. Mô -đun JSON trong Python cung cấp các phương thức để lưu dữ liệu ở định dạng JSON.
import json
# Dữ liệu mẫu
data = {
'title': 'Example Title',
'paragraphs': ['Paragraph 1', 'Paragraph 2', 'Paragraph 3']
}
# Lưu dữ liệu vào tệp JSON
with open('scraped_data.json', mode='w', encoding='utf-8') as file:
json.dump(data, file, ensure_ascii=False, indent=4)
print('Data saved to scraped_data.json')
Nhà viết kịch là một công cụ mạnh mẽ để cạo nội dung động và tương tác với các yếu tố web. Nó có thể xử lý các trang web nặng JavaScript mà các trình phân tích cú pháp HTML tĩnh không thể.
Cài đặt nhà viết kịch và thiết lập nó:
pip install playwright
playwright install
Nhà viết kịch cho phép bạn tương tác với các thành phần web như điền vào các biểu mẫu và nhấp vào các nút. Nó có thể chờ đợi các yêu cầu AJAX hoàn thành trước khi tiến hành, làm cho nó lý tưởng để lấy nội dung động.
Mã được cung cấp thực hiện quét web trên trang sản phẩm Amazon bằng Playwright và LXML. Ban đầu, các mô -đun cần thiết được nhập khẩu. Một hàm chạy được xác định để gói gọn logic cạo. Hàm bắt đầu bằng cách thiết lập một máy chủ proxy và khởi chạy một thể hiện trình duyệt mới với proxy và ở chế độ không đầu, cho phép chúng tôi quan sát các hành động của trình duyệt. Trong bối cảnh trình duyệt, một trang mới được mở và điều hướng đến URL sản phẩm Amazon được chỉ định, với thời gian chờ là 60 giây để đảm bảo trang tải đầy đủ.
Kịch bản sau đó tương tác với trang để chọn kiểu sản phẩm cụ thể từ menu thả xuống và tùy chọn sản phẩm bằng cách sử dụng trình định vị và khớp văn bản. Sau khi đảm bảo các tương tác này hoàn tất và trang đã được tải hoàn toàn trở lại, nội dung HTML của trang được ghi lại.
Nội dung HTML sau đó được phân tích cú pháp bằng phương pháp FromString của LXML để tạo một cây phần tử. Truy vấn XPath được sử dụng để trích xuất nội dung văn bản của tiêu đề sản phẩm từ một yếu tố cụ thể với sản phẩm ID. Kịch bản bao gồm xử lý lỗi để quản lý các trường hợp trong đó truy vấn XPath không trả về kết quả, trong đó có lỗi cú pháp XML trong quá trình phân tích cú pháp hoặc bất kỳ trường hợp ngoại lệ bất ngờ nào khác. Cuối cùng, tiêu đề sản phẩm được trích xuất Tlxml'she được in và bối cảnh và trình duyệt của trình duyệt được đóng để kết thúc phiên.
Hàm Run được thực thi trong phiên viết kịch được bắt đầu bởi Sync_PlayWright, đảm bảo rằng toàn bộ quá trình được quản lý và thực thi trong một môi trường được kiểm soát. Cấu trúc này đảm bảo sự mạnh mẽ và khả năng phục hồi lỗi trong khi thực hiện nhiệm vụ cạo web.
from playwright.sync_api import Playwright, sync_playwright
from lxml.html import fromstring, etree
def run(playwright: Playwright) -> None:
# Xác định máy chủ proxy
proxy = {"server": "https://IP:PORT", "username": "LOGIN", "password": "PASSWORD"}
# Khởi chạy một phiên bản trình duyệt mới với proxy được chỉ định và ở chế độ không đầu
browser = playwright.chromium.launch(
headless=False,
proxy=proxy,
slow_mo=50,
args=['--ignore-certificate-errors'],
)
# Tạo bối cảnh trình duyệt mới
context = browser.new_context(ignore_https_errors=True)
# Mở một trang mới trong bối cảnh trình duyệt
page = context.new_page()
# Điều hướng đến trang sản phẩm Amazon được chỉ định
page.goto(
"https://www.amazon.com/A315-24P-R7VH-Display-Quad-Core-Processor-Graphics/dp/B0BS4BP8FB/",
timeout=10000,
)
# Chờ trang tải đầy đủ
page.wait_for_load_state("load")
# Chọn một kiểu sản phẩm cụ thể từ menu thả xuống
page.locator("#dropdown_selected_style_name").click()
# Chọn một tùy chọn sản phẩm cụ thể
page.click('//*[@id="native_dropdown_selected_style_name_1"]')
page.wait_for_load_state("load")
# Nhận nội dung HTML của trang được tải
html_content = page.content()
try:
# Phân tích nội dung HTML bằng phương pháp FromString của LXML
parser = fromstring(html_content)
# Sử dụng XPath để trích xuất nội dung văn bản của tiêu đề sản phẩm
product_title = parser.xpath('//span[@id="productTitle"]/text()')[0].strip()
# In tiêu đề sản phẩm được trích xuất
print({"Product Title": product_title})
except IndexError:
# Xử lý trường hợp truy vấn XPath không trả về bất kỳ kết quả nào
print('Product title not found in the specified location.')
except etree.XMLSyntaxError as parse_err:
# Xử lý các lỗi cú pháp XML trong quá trình phân tích cú pháp
print(f'Error while parsing HTML: {parse_err}')
except Exception as e:
# Xử lý bất kỳ trường hợp ngoại lệ nào khác
print(f'An unexpected error occurred: {e}')
# Đóng bối cảnh trình duyệt và trình duyệt
context.close()
browser.close()
# Sử dụng Sync_PlayWright để bắt đầu phiên viết kịch và chạy tập lệnh
with sync_playwright() as playwright:
run(playwright)
Web Scraping với Python là một phương pháp mạnh mẽ để thu hoạch dữ liệu từ các trang web. Các công cụ được thảo luận tạo điều kiện cho việc trích xuất, xử lý và lưu trữ dữ liệu web cho các mục đích khác nhau. Trong quá trình này, việc sử dụng các máy chủ proxy để thay thế các địa chỉ IP và thực hiện sự chậm trễ giữa các yêu cầu là rất quan trọng để phá vỡ các khối. Súp đẹp thân thiện với người dùng cho người mới bắt đầu, trong khi LXML phù hợp để xử lý các bộ dữ liệu lớn nhờ hiệu quả của nó. Đối với các nhu cầu cào nâng cao hơn, đặc biệt là với các trang web JavaScript được tải động, nhà viết kịch chứng tỏ có hiệu quả cao.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Bình luận: 0