Giới thiệu về web scraping

Web scraping là kỹ thuật sử dụng các chương trình máy tính để thu thập thông tin từ internet.

Yêu cầu: Tạo một chương trình để mô phỏng hành vi của trình duyệt, truy cập một địa chỉ URL và thu thập nội dung từ địa址 đó.

I. Chương trình cơ bản
# Sử dụng urlopen để lấy dữ liệu
from urllib.request import urlopen
url = "http://www.baidu.com"
response = urlopen(url)
# print(response.read().decode("utf-8"))
with open("mybaidu.html", mode="w", encoding="utf-8") as file:
    file.write(response.read().decode("utf-8"))
print("Hoàn thành")
II. Phân tích quy trình yêu cầu web
1. Server-side rendering

Dữ liệu và HTML được kết hợp lại trên server và gửi về trình duyệt.

Biểu hiện trực quan là khi xem mã nguồn của trang web, bạn có thể thấy toàn bộ nội dung.

Ví dụ: https://www.douban.com/note/809408645/?_i=2050824ZzQJI3Y

2. Client-side rendering

Yêu cầu đầu tiên chỉ nhận được khung HTML, yêu cầu thứ hai mới nhận được dữ liệu, sau đó trình duyệt sẽ渲 heck nội dung.

Biểu hiện trực quan là khi xem mã nguồn của trang web, bạn không thấy dữ liệu.

Do đó, để biết dữ liệu được lấy từ yêu cầu nào, bạn cần熟能生巧 các công cụ bắt gói tin.

Ví dụ: https://movie.douban.com/typerank?type_name=%E5%96%9C%E5%89%A7&type=24&interval_id=100:90&action=

III. HTTP Protocol

HTTP là giao thức cho phép trình duyệt và server trao đổi dữ liệu với nhau.

1. Yêu cầu:

(1) Dòng yêu cầu: Phương thức (GET/POST), URL, phiên bản HTTP. (2) Header yêu cầu: Thông tin thêm như User-Agent, Referrer, Cookie. (3) Body yêu cầu: Các tham số được gửi kèm.

2. Phản hồi:

(1) Dòng trạng thái: Trạng thái của yêu cầu. (2) Header phản hồi: Thông tin thêm như loại nội dung, mã charset. (3) Body phản hồi: Dữ liệu thực tế được trả về (HTML, JSON, v.v.).

3. Các header quan trọng trong yêu cầu (cần thiết cho scraping):

(1) User-Agent: Đánh dấu nhận biết trình duyệt hoặc ứng dụng gửi yêu cầu. (2) Referrer: Địa chỉ URL nguồn của yêu cầu. (3) Cookie: Dữ liệu lưu trên máy tính của người dùng.

4. Các header quan trọng trong phản hồi:

(1) Cookie: Dữ liệu lưu trên máy tính của người dùng. (2) Các token bảo mật: Dùng để chống tấn công và chống scraping.

5. Các phương thức yêu cầu thông thường:

GET: Sử dụng để truy vấn dữ liệu. Tất cả các URL hiển thị trong thanh địa chỉ đều là các yêu cầu GET.

POST: Sử dụng để gửi dữ liệu lên server hoặc thay đổi nội dung server.

IV. Bắt đầu với Requests

Cài đặt: pip install requests

Ví dụ 1: Lấy nội dung trang web của Sougou khi tìm kiếm "薛之谦"

Chúng ta thêm header User-Agent để chống lại các biện pháp chống scraping cơ bản.

import requests
url = 'https://www.sogou.com/web?query=%E8%96%9B%E4%B9%8B%E8%B0%A6'
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0"
}
response = requests.get(url, headers=headers)
print(response)
print(response.text) # Lấy mã nguồn của trang web
response.close()

Ví dụ 2: Lấy dữ liệu gợi ý từ百度翻譯 (POST request)

Qua việc quan sát các gói tin, chúng ta thấy rằng yêu cầu này được gửi đến https://fanyi.baidu.com/sug.

import requests
url = 'https://fanyi.baidu.com/sug'
s = input("Nhập từ tiếng Anh bạn muốn dịch:")
data = {
    "kw": s
}
response = requests.post(url, data=data)
print(response.json()) # Hiển thị dữ liệu dưới dạng JSON

Ví dụ 3: Lấy dữ liệu xếp hạng phim từ Douban (GET request)

Dữ liệu渲 heck client-side thường được trả về trong các yêu cầuXHR, chúng ta có thể lọc và lấy dữ liệu.

import requests
url = "https://movie.douban.com/j/chart/top_list"
params = {
    "type": "24",
    "interval_id": "100:90",
    "action": "",
    "start": "0",
    "limit": "20"
}
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0"
}
response = requests.get(url=url, params=params, headers=headers)
print(response.request.url)
print(response.json())
response.close()

Thẻ: requests http get post JSON

Đăng vào ngày 20 tháng 6 lúc 04:25