Quét web nhanh: Không đồng bộ, luồng và quy trình trong Python

Python, hướng dẫn, cạo, Apr-19-20245 phút đọc

Web scraping là một kỹ thuật vô giá cho các nhà phát triển, cho phép trích xuất dữ liệu từ các trang web một cách tự động. Tuy nhiên, nó đi kèm với một loạt thách thức riêng, bao gồm quản lý các hoạt động I / O hiệu quả, xử lý giới hạn tốc độ và bỏ qua các biện pháp chống cạo. Trong blog này, chúng tôi sẽ khám phá ba phương pháp mạnh mẽ để nâng cao hiệu quả quét web của bạn: async (lập trình không đồng bộ), đa luồng và đa xử lý và cách tận dụng các phương pháp này có thể tăng tốc đáng kể các tác vụ trích xuất dữ liệu của bạn.

Lập trình không đồng bộ là một mô hình cho phép các hoạt động I / O chạy đồng thời mà không chặn việc thực thi chương trình của bạn. Không giống như thực thi đồng bộ, nơi các tác vụ được hoàn thành lần lượt, async cho phép ứng dụng của bạn xử lý nhiều hoạt động cùng một lúc.

Sử dụng async trong Python để quét web có một số lợi thế, chủ yếu là do các hoạt động I / O không chặn của nó. Điều này có nghĩa là trong khi một tác vụ chờ phản hồi từ máy chủ, các tác vụ khác có thể tiếp tục chạy, cải thiện đáng kể tốc độ tổng thể của các hoạt động cạo của bạn.

Dưới đây là một ví dụ đơn giản sử dụng asyncio và aiohttp để thực hiện quét web không đồng bộ:

Nhập Asyncio
Nhập AIOHTTP

async def fetch (url, phiên):
    async với session.get(url) dưới dạng phản hồi:
        return await response.text ()

async def main (URL):
    async với AIOHTTP. ClientSession() dưới dạng session:
        Nhiệm vụ = [Tìm nạp (URL, phiên) cho URL trong URL]
        trở lại chờ đợi asyncio.gather(*nhiệm vụ)

URL = ['http://example.com', 'https://example.org']
vòng lặp = asyncio.get_event_loop()
kết quả = loop.run_until_complete(main(urls))

Đa luồng là một hình thức thực thi đồng thời trong đó nhiều luồng được sinh ra trong cùng một quy trình để thực hiện các tác vụ đồng thời. Nó đặc biệt hữu ích trong các tác vụ I/O-bound, nơi chương trình dành một lượng thời gian đáng kể để chờ đợi các phản hồi bên ngoài.

Lợi ích chính của đa luồng trong quét web là cải thiện thông lượng. Bằng cách chạy song song một số luồng, bạn có thể thực hiện nhiều yêu cầu HTTP đồng thời, giảm tổng thời gian chờ đợi phản hồi.

Dưới đây là cách bạn có thể sử dụng mô-đun phân luồng để quét web đồng thời:

Nhập luồng
Yêu cầu nhập khẩu
 
Tìm nạp def (URL):
    in(yêu cầu.get(url).text)
 
chủ đề = []
URL = ['http://example.com', 'https://example.org']
 
Đối với URL trong URL:
    chủ đề = luồng. Chủ đề(target=fetch, args=(url,))
    Chủ đề. nối thêm (chủ đề)
    chỉ. start()
 
Đối với thread in threads:
    chỉ. tham gia()

Đa xử lý liên quan đến việc sử dụng nhiều quy trình, thay vì luồng, để thực hiện các tác vụ song song. Phương pháp này lý tưởng cho các tác vụ bị ràng buộc bởi CPU, trong đó bản thân tính toán là nút cổ chai.

Chọn đa xử lý thay vì đa luồng khi các tác vụ quét web của bạn liên quan đến xử lý dữ liệu nặng có thể được hưởng lợi từ việc trải rộng trên nhiều lõi CPU.

Đa xử lý có thể tăng tốc đáng kể các tác vụ ràng buộc CPU trong web scraping bằng cách tận dụng nhiều lõi để trích xuất dữ liệu song song.

Sử dụng mô-đun đa xử lý của Python để trích xuất dữ liệu song song trông như thế này:

từ nhóm nhập đa xử lý
Yêu cầu nhập khẩu 
 
Tìm nạp def (URL):
    return requests.get(url).text
 
với Hồ bơi(5) như p:
    print(p.map(tìm nạp, ['http://example.com', 'https://example.org']))

Lựa chọn giữa async, multithreading và multiprocessing phụ thuộc vào nhu cầu quét web cụ thể của bạn:

Thử nghiệm với không đồng bộ, đa luồng và đa xử lý có thể dẫn đến những cải tiến đáng kể về hiệu suất của các dự án quét web của bạn. Mỗi phương pháp cung cấp những ưu điểm và hạn chế riêng, vì vậy hiểu các yêu cầu của dự án là chìa khóa để lựa chọn phương pháp phù hợp nhất. Hãy nhớ rằng, kết hợp proxy từ các dịch vụ như ProxyScrape có thể tối ưu hóa hơn nữa hoạt động cạo của bạn bằng cách đảm bảo độ tin cậy và tránh bị cấm IP. Chúc bạn cạo vui vẻ!