Hướng dẫn asynchronous web scraping python - python quét web không đồng bộ


Kết quả học tập

  • Để hiểu được lợi ích của việc sử dụng Async + đang chờ so với việc chụp web đơn giản với thư viện & nbsp; yêu cầu.
  • Tìm hiểu làm thế nào để tạo một máy cạo web không đồng bộ từ đầu trong Python thuần túy bằng & nbsp; asyncio & nbsp; và & nbsp; aiohttp.
  • Thực hành tải xuống nhiều trang web bằng AIOHTTP + ASYNCIO và phân tích nội dung HTML trên mỗi URL với & nbsp; BeautifulSoup.

Các bản cài đặt Python sau đây dành cho một máy tính xách tay Jupyter, tuy nhiên nếu bạn đang sử dụng một dòng lệnh thì chỉ đơn giản là & nbsp; loại trừ! Biểu tượngexclude the ! symbol

!pip install beautifulsoup4
!pip install requests
!pip install aiohttp
# Library Imports
import aiohttp
from bs4 import BeautifulSoup
import pandas as pd
import requests

Lưu ý: Lý do duy nhất tại sao chúng tôi sử dụng Nest_asyncio là vì hướng dẫn này được viết bằng sổ ghi chép Jupyter, tuy nhiên nếu bạn muốn viết cùng một mã cào web trong tệp python, thì bạn sẽ không cần cài đặt hoặc chạy khối mã sau đây :

!pip install nest-asyncio
import nest_asyncio
nest_asyncio.apply()

Tại sao sử dụng máy quét web asychronous?

Viết các bộ phế liệu web đồng bộ dễ dàng hơn và mã ít phức tạp hơn, tuy nhiên chúng rất chậm.

Điều này là do tất cả các yêu cầu phải chờ yêu cầu hiện tại hoàn thành từng người một. & NBSP; chỉ có thể có một yêu cầu chạy tại một thời điểm nhất định.There can only be one request running at a given time.

Ngược lại, các yêu cầu web không đồng bộ có thể thực thi mà không phụ thuộc vào các yêu cầu trước đó trong hàng đợi hoặc cho Loop. & NBSP; các yêu cầu asychronous xảy ra đồng thời.Asychronous requests happen simultaneously.

Hướng dẫn asynchronous web scraping python - python quét web không đồng bộ

Làm thế nào là web của Asychronous khác nhau khi sử dụng các yêu cầu Python?

Thay vì suy nghĩ về việc tạo một vòng lặp cho các yêu cầu XN, bạn cần suy nghĩ về việc tạo ra một vòng lặp sự kiện. Ví dụ: môi trường cho & nbsp; nodejs, bằng cách thực hiện thiết kế trong một vòng lặp sự kiện duy nhất.

Tuy nhiên, đối với Python, chúng tôi sẽ tự tạo một vòng lặp sự kiện với & nbsp; asyncio.

Bên trong vòng lặp sự kiện của bạn, bạn có thể đặt một số tác vụ sẽ được hoàn thành và mọi nhiệm vụ sẽ được tạo và thực hiện một cách asychronous.


Cách cạo một trang web bằng cách sử dụng Aiohttp

import aiohttp
import asyncio

async def main():

    async with aiohttp.ClientSession() as session:
        async with session.get('http://python.org') as response:

            print("Status:", response.status)
            print("Content-type:", response.headers['content-type'])

            html = await response.text()
            print("Body:", html[:15], "...")

asyncio.run(main())

Đầu tiên chúng tôi xác định một phiên khách với AIOHTTP:

async with aiohttp.ClientSession() as session:

Sau đó, với phiên của chúng tôi, chúng tôi thực hiện phản hồi nhận trên một URL:

async with session.get('http://python.org') as response:     

Thứ ba, hãy chú ý cách chúng tôi sử dụng từ khóa đang chờ đợi trước phản hồi.Text () như thế này:

html = await response.text()

Ngoài ra, lưu ý rằng mọi chức năng không đồng bộ bắt đầu bằng:

async def function_name

Cuối cùng, chúng tôi chạy & nbsp; asyncio.run (main ()), điều này tạo ra một vòng lặp sự kiện và thực hiện tất cả các tác vụ trong đó.asyncio.run(main()), this creates an event loop and executes all tasks within it.

Sau khi tất cả các nhiệm vụ đã được hoàn thành thì vòng lặp sự kiện sẽ tự động bị phá hủy.


Cách cạo nhiều trang bằng cách sử dụng aiohttp

Khi cạo nhiều trang với Asyncio và AioHttp, chúng tôi sẽ sử dụng mẫu sau để tạo nhiều tác vụ sẽ được thực hiện một cách mô phỏng trong vòng lặp sự kiện Asyncio:

tasks = []

for url in urls:
    tasks.append(some_function(session, url))

htmls = await asyncio.gather(*tasks)

Để bắt đầu với chúng tôi tạo một danh sách trống và sau đó cho mỗi URL, chúng tôi sẽ đính kèm một chức năng chưa được đặt/không bị hủy, một phiên AIOHTTP và URL vào danh sách.

Asyncio.gather (*nhiệm vụ), về cơ bản nói với Asyncio tiếp tục chạy vòng lặp sự kiện cho đến khi tất cả các chức năng này trong Python đã được hoàn thành. Nó sẽ trả về một danh sách có cùng độ dài với số lượng hàm (trừ khi một trong các hàm trong danh sách đã trả về kết quả bằng không).


Bây giờ chúng ta đã biết cách tạo và thực hiện nhiều nhiệm vụ, hãy để xem điều này trong hành động:

class WebScraper(object):
    def __init__(self, urls):
        self.urls = urls
        # Global Place To Store The Data:
        self.all_data  = []
        self.master_dict = {}
        # Run The Scraper:
        asyncio.run(self.main())

    async def fetch(self, session, url):
        try:
            async with session.get(url) as response:
                text = await response.text()
                return text, url
        except Exception as e:
            print(str(e))

    async def main(self):
        tasks = []
        headers = {
            "user-agent": "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"}
        async with aiohttp.ClientSession(headers=headers) as session:
            for url in self.urls:
                tasks.append(self.fetch(session, url))

            htmls = await asyncio.gather(*tasks)
            self.all_data.extend(htmls)

            # Storing the raw HTML data.
            for html in htmls:
                if html is not None:
                    url = html[1]
                    self.master_dict[url] = {'Raw Html': html[0]}
                else:
                    continue
# Library Imports
import aiohttp
from bs4 import BeautifulSoup
import pandas as pd
import requests
0

Thêm logic phân tích cú pháp HTML vào máy quét web Aiohttp

Cũng như thu thập phản hồi HTML từ nhiều trang web, việc phân tích trang web có thể hữu ích cho phân tích nội dung SEO và HTML.

Do đó, hãy để tạo chức năng thứ hai sẽ phân tích trang HTML và sẽ trích xuất thẻ tiêu đề.

# Library Imports
import aiohttp
from bs4 import BeautifulSoup
import pandas as pd
import requests
1
# Library Imports
import aiohttp
from bs4 import BeautifulSoup
import pandas as pd
import requests
2

Sự kết luận

Việc cạo web không đồng bộ phù hợp hơn khi bạn có số lượng URL lớn hơn cần được xử lý nhanh chóng.

Ngoài ra, hãy chú ý mức độ dễ dàng của việc thêm vào chức năng phân tích cú pháp HTML với BeautifulSoup, cho phép bạn dễ dàng trích xuất các yếu tố cụ thể trên cơ sở mỗi URL.

Phản ứng của bạn là gì?

Trang web này chứa các liên kết đến một số trang web của bên thứ ba được mô tả là liên kết liên kết. Các liên kết liên kết này cho phép chúng tôi có được một khoản hoa hồng nhỏ khi bạn nhấp và mua sản phẩm trên các trang web đó (nó không tốn kém gì thêm!). AttackData.com là người tham gia Chương trình Associates Associates của Amazon Services, một chương trình quảng cáo liên kết được thiết kế để cung cấp phương tiện cho chủ sở hữu trang web để kiếm phí quảng cáo bằng cách quảng cáo và liên kết với Amazon và bất kỳ trang web nào khác có thể liên kết với chương trình AMAZON Service LLC Associates .