Hướng dẫn từng bước về web scraping với Python cho người mới bắt đầu

9 tháng 9 2024
10 phút đọc
Tóm tắt được tạo bởi AI:
Web Scraping với Python | Proxy Seller Khám phá cách sử dụng Python để web scraping. Tìm hiểu cách trích xuất và xử lý dữ liệu từ các trang web bằng các thư viện và công cụ mạnh mẽ của Python. Hướng dẫn từng bước về web scraping với Python cho người mới bắt đầu

Python nổi bật là một lựa chọn hàng đầu cho web scraping nhờ các thư viện mạnh mẽ và cú pháp đơn giản. Trong hướng dẫn web scraping với Python này, chúng ta sẽ tìm hiểu những kiến thức cơ bản về trích xuất dữ liệu và hướng dẫn bạn thiết lập môi trường Python để tạo scraper đầu tiên của mình. Chúng tôi cũng sẽ giới thiệu cho bạn những thư viện quan trọng phù hợp cho các tác vụ scraping, bao gồm Beautiful Soup, Playwright và lxml.

Nên dùng thư viện nào

Có rất nhiều thư viện web scraping với Python giúp đơn giản hóa quá trình này. Dưới đây là một số thư viện phổ biến nhất:

  • requests: một thư viện HTTP đơn giản và tiện lợi cho Python, được sử dụng để gửi yêu cầu HTTP để lấy nội dung trang web.
  • Beautiful Soup: tuyệt vời để phân tích nội dung trang. Nó tạo cây phân tích từ mã nguồn trang, giúp việc trích xuất dữ liệu dễ dàng hơn.
  • lxml: nổi tiếng với tốc độ và hiệu quả, lxml rất tốt để phân tích dữ liệu có cấu trúc.
  • Playwright: một công cụ mạnh mẽ để scraping nội dung động và tương tác với các trang web.

Nếu bạn đang thắc mắc làm thế nào để scrape một trang web bằng Python, thì điều đó bắt đầu bằng việc hiểu cách hoạt động của các yêu cầu HTTP.

Giới thiệu về HTTP requests

HTTP (HyperText Transfer Protocol) là một giao thức tầng ứng dụng dùng để truyền dữ liệu trên web. Khi bạn nhập một URL trong trình duyệt, nó sẽ tạo ra một yêu cầu HTTP và gửi tới máy chủ web. Máy chủ sẽ gửi lại phản hồi cho trình duyệt và trình duyệt hiển thị nó thành một trang web. Để web scraping, bạn cần mô phỏng quá trình này và tạo các yêu cầu HTTP từ script của mình để lấy nội dung trang web một cách tự động.

Thiết lập môi trường

Trước tiên, hãy đảm bảo rằng bạn đã cài đặt Python trên hệ thống. Bạn có thể tải xuống từ trang chính thức của Python.

Một môi trường ảo giúp quản lý dependencies. Sử dụng các lệnh sau để 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 cần thiết bằng các lệnh sau:


pip install requests
pip install beautifulsoup4 
pip install lxml

Xây dựng Web Scraper với Beautiful Soup

Hãy bắt đầu với một ví dụ đơn giản về cách sử dụng Python để scrape một trang web bằng thư viện requests để trích xuất nội dung tĩnh.

Tạo HTTP GET request

Loại yêu cầu HTTP phổ biến nhất là GET, được sử dụng để lấy dữ liệu từ một URL cụ thể. Đây là một ví dụ cơ bản về web scraping với Python để thực hiện GET request tới http://example.com.


import requests
url = 'http://example.com'
response = requests.get(url)

Xử lý HTTP responses

Thư viện requests cung cấp nhiều cách để xử lý và xử lý phản hồi:

Kiểm tra mã trạng thái: đảm bảo rằng 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: lấy nội dung văn bản hoặc JSON từ phản hồi.


# Lấy nội dung phản hồi dưới dạng văn bản
page_content = response.text
print(page_content)

# Lấy 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)

Xử lý lỗi HTTP và mạng

Lỗi HTTP và lỗi mạng có thể xảy ra khi tài nguyên không khả dụng, yêu cầu hết thời gian chờ hoặc máy chủ trả về mã trạng thái lỗi (ví dụ: 404 Not Found, 500 Internal Server Error). Chúng ta có thể sử dụng các ngoại lệ do requests sinh ra để xử lý các tình huống này.


import requests

url = 'http://example.com'

try:
    response = requests.get(url, timeout=10)  # Đặt thời gian chờ cho yêu cầu
    response.raise_for_status()  # Kích hoạt lỗi nếu máy chủ phản hồi với mã như 404 hoặc 500

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!')

Trích xuất dữ liệu từ các phần tử HTML

Để trích xuất dữ liệu có cấu trúc, các thư viện như Beautiful Soup và lxml giúp xác định và phân tích các phần cụ thể của trang.

Các trang web bao gồm các phần tử lồng nhau được biểu thị bằng các thẻ, chẳng hạn như <div>, <p>, <a>, etc. Mỗi thẻ có thể có các thuộc tính và chứa văn bản, các thẻ khác hoặc cả hai.

XPath và CSS selectors cung cấp cách để nhắm mục tiêu các phần tử dựa trên thuộc tính hoặc vị trí của chúng trong tài liệu.

Tìm XPath và CSS selectors

Khi scraping, việc trích xuất dữ liệu cụ thể thường yêu cầu xác định đúng XPath hoặc CSS selectors. Đây là cách tìm chúng hiệu quả:

Hầu hết các trình duyệt hiện đại đều có công cụ dành cho nhà 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. Đây là hướng dẫn từng bước về cách sử dụng các công cụ này:

  1. Mở công cụ dành cho nhà phát triển:
    • Trong Chrome: Nhấp chuột phải vào trang và chọn "Inspect" hoặc nhấn Ctrl+Shift+I (Windows/Linux) hoặc Cmd+Opt+I (Mac).
    • Trong Firefox: Nhấp chuột phải vào trang và chọn "Inspect Element" hoặc nhấn
    • Ctrl+Shift+I (Windows/Linux) hoặc Cmd+Opt+I (Mac).
  2. Kiểm tra phần tử:
    • Sử dụng công cụ inspect (biểu tượng con trỏ) để nhấp vào phần tử bạn muốn scrape. Nó sẽ được đánh dấu trong chế độ xem cấu trúc.
  3. Sao chép XPath hoặc CSS selector:
    • Nhấp chuột phải vào phần tử được đánh dấu trong bảng điều khiển dành cho nhà phát triển. Chọn "Copy XPath" hoặc "Copy selector".

1n.png

XPath: /html/body/div/h1

CSS Selector: body > div > h1

Trích xuất bằng Beautiful Soup

Beautiful Soup là một thư viện Python để phân tích nội dung trang. Nó cung cấp các phương thức và thuộc tính để điều hướng và tìm kiếm trong cấu trúc trang.


from bs4 import BeautifulSoup
import requests

# URL của trang web cần scrape
url = 'https://example.com'

# Gửi yêu cầu HTTP GET tới URL
response = requests.get(url)

# Phân tích nội dung HTML của phản hồi bằng Beautiful Soup
soup = BeautifulSoup(response.content, 'html.parser')

# Sử dụng CSS selector để tìm tất cả các thẻ <h1> nằm trong 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> được 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)

Xử lý lỗi parsing

Giống như Beautiful Soup, lxml cho phép bạn bắt và xử lý lỗi một cách linh hoạt bằng cách sử dụng các ngoại lệ như lxml.etree.XMLSyntaxError.

Đoạn “Python web scraping code” được cung cấp thực hiện việc trích xuất dữ liệu trên một trang sản phẩm của Amazon bằng cách sử dụng Playwright và lxml. Nó thiết lập proxy và khởi chạy trình duyệt, điều hướng đến trang sản phẩm, tương tác với các phần tử, chờ tải toàn bộ trang và lấy mã nguồn trang.

Nội dung này được phân tích bằng lxml để tạo cây phần tử, và XPath được sử dụng để trích xuất tiêu đề sản phẩm. Script xử lý các trường hợp phần tử không tìm thấy hoặc parsing thất bại. Sau khi scraping xong, nó đóng đúng cách phiên trình duyệt.


from bs4 import BeautifulSoup
import requests

# URL an leathanaigh ghréasáin le scrabhadh
url = 'https://example.com'

# Seol iarratas HTTP GET chuig an URL
response = requests.get(url)

try:
    # Parsáil ábhar HTML an fhreagra ag úsáid Beautiful Soup
    soup = BeautifulSoup(response.content, 'html.parser')

    # Úsáid an roghnóir CSS chun gach clib <h1> a aimsiú atá laistigh de chlibeanna <div>
    # atá ina leanaí díreacha den chlib <body>
    h1_tags = soup.select('body > div > h1')

    # Déan athchleachtadh ar liosta na gclibeanna <h1> a aimsíodh agus priontáil a n-ábhar téacs
    for tag in h1_tags:
        print(tag.text)
except AttributeError as attr_err:
    # Láimhseáil cásanna ina bhféadfadh AttributeError tarlú (m.sh., má tá response.content None)
    print(f'Earráid tréithe tarlaithe: {attr_err}')
except Exception as parse_err:
    # Láimhseáil aon eisceachtaí eile a d'fhéadfadh tarlú le linn an pharsála
    print(f'Earráid agus HTML á pharsáil: {parse_err}')

Eastóscadh ag úsáid lxml

Is leabharlann eile atá coitianta chun ábhar a pharsáil í lxml. Cé go bhfuil BeautifulSoup cairdiúil don úsáideoir, tá lxml níos tapúla agus níos solúbtha, rud a fhágann go bhfuil sí oiriúnach do thascanna ríthábhachtacha feidhmíochta.


from lxml.html import fromstring
import requests

# URL an leathanaigh ghréasáin le scrabhadh
url = 'https://example.com'

# Seol iarratas HTTP GET chuig an URL
response = requests.get(url)

# Parsáil ábhar HTML an fhreagra ag úsáid mhodh fromstring de lxml
parser = fromstring(response.text)

# Úsáid XPath chun ábhar téacs na chéad chlibe <h1> a aimsiú
# atá laistigh de chlib <div>, atá ina leanbh díreach den chlib <body>
title = parser.xpath('/html/body/div/h1/text()')[0]

# Priontáil an teideal
print(title)

Ag láimhseáil earráidí parsála

Cosúil le Beautiful Soup, ceadaíonn lxml duit earráidí parsála a láimhseáil go séimh trí eisceachtaí ar nós lxml.etree.XMLSyntaxError a ghabháil.


from lxml.html import fromstring
from lxml import etree
import requests

# URL an leathanaigh ghréasáin le scrabhadh
url = 'https://example.com'

# Seol iarratas HTTP GET chuig an URL
response = requests.get(url)

try:
    # Parsáil ábhar HTML an fhreagra ag úsáid mhodh fromstring de lxml
    parser = fromstring(response.text)

    # Úsáid XPath chun ábhar téacs na chéad chlibe <h1> a aimsiú
    # atá laistigh de chlib <div>, atá ina leanbh díreach den chlib <body>
    title = parser.xpath('/html/body/div/h1/text()')[0]

    # Priontáil an teideal
    print(title)
except IndexError:
    # Láimhseáil an cás nach dtabharfaidh an fiosrúchán XPath aon toradh ar ais
    print('Níor aimsíodh clib <h1> san áit sonraithe.')
except etree.XMLSyntaxError as parse_err:
    # Láimhseáil earráidí comhréire XML le linn an pharsála
    print(f'Earráid agus HTML á pharsáil: {parse_err}')
except Exception as e:
    # Láimhseáil aon eisceachtaí eile
    print(f'Thárla earráid gan choinne: {e}')

Sonraí eastósctha a shábháil

Nuair a bhain tú sonraí amach go rathúil, is é an chéad chéim eile iad a shábháil. Soláthraíonn Python roinnt roghanna chun sonraí scriosta a shábháil, lena n-áirítear i gcomhaid CSV, i gcomhaid JSON, agus i mbunachair sonraí. Seo forbhreathnú ar conas sonraí eastósctha a shábháil ag baint úsáide as formáidí éagsúla:

Sonraí a shábháil i gcomhad CSV

Is formáid shimplí agus forleathan é CSV (Comma-Separated Values) chun sonraí táblaí a stóráil. Déanann an modúl CSV i Python é éasca sonraí a scríobh i gcomhaid CSV.


import csv

# Sampla sonraí
data = {
    'title': 'Teideal Samplach',
    'paragraphs': ['Mír 1', 'Mír 2', 'Mír 3']
}

# Sábháil sonraí i gcomhad CSV
with open('scraped_data.csv', mode='w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file)
    writer.writerow(['Teideal', 'Mír'])
    for paragraph in data['paragraphs']:
        writer.writerow([data['title'], paragraph])

print('Sábháladh na sonraí i scraped_data.csv')

Sonraí a shábháil i gcomhad JSON

Is formáid éadrom malartaithe sonraí é JSON (JavaScript Object Notation) atá éasca a léamh agus a scríobh. Soláthraíonn an modúl JSON i Python modhanna chun sonraí a shábháil i bhformáid JSON.


import json

# Sampla sonraí
data = {
    'title': 'Teideal Samplach',
    'paragraphs': ['Mír 1', 'Mír 2', 'Mír 3']
}

# Sábháil sonraí i gcomhad JSON
with open('scraped_data.json', mode='w', encoding='utf-8') as file:
    json.dump(data, file, ensure_ascii=False, indent=4)

print('Sábháladh na sonraí i scraped_data.json')

Teicnící Ard-Scriosta Gréasáin ag Úsáid Playwright i Python

Is uirlis chumhachtach é Playwright chun ábhar dinimiciúil a scrabhadh agus idirghníomhú le heilimintí gréasáin. Is féidir leis láithreáin ghréasáin troma JavaScript a láimhseáil nach féidir le parsálaithe HTML statacha a láimhseáil.

Suiteáil Playwright agus socraigh é:


pip install playwright
playwright install

Ábhar dinimiciúil a scrabhadh

Ligeann Playwright duit idirghníomhú le heilimintí gréasáin cosúil le foirmeacha a líonadh agus cnaipí a chliceáil. Is féidir leis fanacht go gcríochnóidh iarratais AJAX sula leanfaidh sé ar aghaidh, rud a fhágann go bhfuil sé oiriúnach d’ábhar dinimiciúil a scrabhadh.

2n.png

Déanann an cód web scraping Python a cuireadh ar fáil eastóscadh sonraí ar leathanach táirge Amazon ag baint úsáide as Playwright agus lxml. Ar dtús, allmhairítear na modúil riachtanacha. Sainmhínítear feidhm run chun an loighic scriosta a chuimsiú. Tosaíonn an fheidhm le seachfhreastalaí a shocrú agus cás nua brabhsálaí a sheoladh leis an seachfhreastalaí agus i mód neamh-headless, rud a chuireann ar ár gcumas gníomhartha an bhrabhsálaí a bhreathnú. Laistigh den chomhthéacs brabhsálaí, osclaítear leathanach nua agus déantar nascleanúint chuig an URL táirge Amazon sonraithe, le teorainn ama 60 soicind chun a chinntiú go luchtáiltear an leathanach go hiomlán.

Sau đó, script sẽ tương tác với trang để chọn một kiểu sản phẩm cụ thể từ menu thả xuống và một tùy chọn sản phẩm bằng cách sử dụng bộ định vị và khớp văn bản. Khi các thao tác này hoàn tất và trang được tải đầy đủ, nội dung của trang sẽ được thu thập.

Nội dung này sau đó được phân tích bằng phương thức fromstring trong lxml để tạo một cây phần tử. Mộ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 phần tử cụ thể có ID productTitle. Script được thiết kế để xử lý các tình huống khi truy vấn XPath có thể không trả về kết quả, khi xảy ra sự cố cú pháp XML trong quá trình phân tích, hoặc khi có sự cố bất ngờ khác. Cuối cùng, tiêu đề sản phẩm được trích xuất bằng lxml sẽ được in ra, và cả ngữ cảnh trình duyệt lẫn trình duyệt đều được đóng đúng cách để kết thúc phiên.

Hàm run được thực thi trong một phiên Playwright được khởi chạy bởi sync_playwright, đảm bảo rằng toàn bộ quá trình được quản lý và thực hiện trong một môi trường có kiểm soát. Cấu trúc này đảm bảo tính mạnh mẽ và khả năng chống lỗi khi thực hiện tác vụ web scraping.


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 đã chỉ định và ở chế độ không headless
   browser = playwright.chromium.launch(
       headless=False,
       proxy=proxy,
       slow_mo=50,
       args=['--ignore-certificate-errors'],
   )

   # Tạo một ngữ cảnh trình duyệt mới
   context = browser.new_context(ignore_https_errors=True)

   # Mở một trang mới trong ngữ 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 được 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")

   # Lấy nội dung HTML của trang đã tải
   html_content = page.content()

   try:
       # Sử dụng fromstring của lxml để chuyển đổi HTML thô thành cây phần tử
       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 đã 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ề kết quả nào
       print('Không tìm thấy tiêu đề sản phẩm tại vị trí đã chỉ định.')
   except etree.XMLSyntaxError as parse_err:
       # Xử lý lỗi cú pháp XML trong quá trình phân tích
       print(f'Lỗi khi phân tích HTML: {parse_err}')
   except Exception as e:
       # Xử lý bất kỳ ngoại lệ nào khác
       print(f'Đã xảy ra lỗi bất ngờ: {e}')

   # Đóng ngữ 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 Playwright và chạy script
with sync_playwright() as playwright:
   run(playwright)

Web scraping với Python là một phương pháp mạnh mẽ để thu thập dữ liệu từ các trang web. Các công cụ đã thảo luận giúp việc trích xuất, xử lý và lưu trữ dữ liệu web cho nhiều mục đích khác nhau trở nên dễ dàng. Trong quá trình này, việc sử dụng máy chủ proxy để thay đổi địa chỉ IP và áp dụng độ trễ giữa các yêu cầu là rất quan trọng để tránh bị chặn. Beautiful Soup thân thiện với người mới bắt đầu, trong khi lxml phù hợp để xử lý các tập dữ liệu lớn nhờ hiệu suất cao. Với các nhu cầu scraping nâng cao hơn, đặc biệt là với các trang web sử dụng JavaScript động, Playwright tỏ ra cực kỳ hiệu quả.

Kết luận

Hướng dẫn web scraping bằng Python này trình bày các phương pháp thực tiễn để tự động trích xuất dữ liệu bằng các thư viện như Beautiful Soup, lxml và Playwright. Về mặt kỹ thuật, web scraping Python đề cập đến việc sử dụng các công cụ dựa trên Python để có hệ thống lấy và xử lý dữ liệu có cấu trúc từ các trang web.

Dù bạn đang làm việc với nội dung tĩnh hay các trang được render bằng JavaScript, luôn có một công cụ Python phù hợp cho công việc. Bằng cách học cách gửi HTTP requests, làm chủ kỹ thuật parsing và hiểu cách trích xuất dữ liệu, bạn sẽ sẵn sàng xây dựng các scraper đáng tin cậy.

Khi tiến bộ, hãy nhớ tuân thủ các nguyên tắc scraping hợp đạo đức – tôn trọng robots.txt, tránh làm quá tải máy chủ, và luôn xử lý dữ liệu một cách có trách nhiệm. Với nền tảng vững chắc, bạn có thể tự tin bắt đầu phát triển các dự án scraping của riêng mình và khai thác tối đa tiềm năng của dữ liệu web.

Nội dung của bài viết:

Các bài viết gần đây

Quay lại blog
Quay lại blog