Tactics Web Scraping Tacting nâng cao

Bình luận: 0

Thu hoạch dữ liệu khỏi một trang web không chỉ là thu hoạch nội dung của nó; Có rất nhiều thứ đi vào nó. Để bỏ qua các giới hạn, khoảng trống và các khối tinh vi khác, vô số phương pháp bổ sung phải được sử dụng như quét dữ liệu Python.

Đối với bài viết này, chúng tôi sẽ xác định những gì là Python Scraping và biện minh cho lý do tại sao nó là công cụ tối ưu cho nhiệm vụ. Và cũng phác thảo các chiến thuật sử dụng các khả năng cạo dữ liệu Python. Tất cả điều này sẽ giúp lấy thông tin ngay cả từ các trang web an toàn nhất.

Tại sao Python là lý tưởng cho việc cạo web

Công cụ này được thiết kế đặc biệt để phục vụ như một nguồn tài nguyên tuyệt vời để thu hoạch dữ liệu từ các trang web. Ngoài khả năng sử dụng của nó, các thư viện của Python như Scrapy, Selenium và BeautifulSoup rất mạnh mẽ. Ngoài ra, có một cộng đồng mới tích cực tiếp tục phát triển các tập lệnh và cung cấp hỗ trợ cho người dùng mới. Đó là lý do tại sao Python được sử dụng để quét web ngày nay. Vì vậy, hãy để nhấn mạnh các chiến lược chính có sẵn tại thời điểm này.

Chiến thuật cào bằng Python

Khối này sẽ chỉ cho người dùng cách cạo các trang web phức tạp bằng cách sử dụng các kỹ thuật tinh vi hơn được tích hợp vào Python. Người dùng sẽ học cách:

  • Tránh bị chặn bởi bảo vệ bot - xử lý captcha, honeypots và dấu vân tay TLS.
  • Hoạt động như một người dùng thực tế để ngăn chặn bị chặn.
  • Kiểm soát cookie và phiên để giữ xác thực trong khi truy cập các trang bị hạn chế.
  • Quản lý dữ liệu thu được từ API và xử lý dữ liệu được tải không đồng bộ.
  • Shield script khỏi các sửa đổi trên trang và tinh chỉnh logic cho các tài nguyên động.

Các phương pháp này sẽ giúp làm cho việc loại bỏ dữ liệu Python hiệu quả trong khi giảm thiểu cơ hội bị chặn hoặc từ chối truy cập từ máy chủ.

Bây giờ, hãy để tiến hành các chiến thuật về cách thực hiện cào trong Python một cách hiệu quả.

Chiến thuật 1: Xử lý Captchas và các biện pháp chống bot

Rất nhiều trang web thực hiện các hệ thống bảo mật CAPTCHA như một tuyến phòng thủ của Sterling để bảo vệ thông tin của họ khỏi bị loại bỏ dữ liệu từ Python. Các hệ thống như vậy có thể được đánh bại bằng nhiều phương tiện, sử dụng các dịch vụ nhận dạng tự động, như 2Captcha hoặc Anti-Captcha hoặc sử dụng máy học để xác định nhận thức hình ảnh. Một khả năng khác là giảm số lượng truy vấn xuống mức mà tòa án không liên kết với kỳ vọng thu thập thông tin.

Chiến thuật 2: Mô phỏng hành vi của con người

Để làm cho các truy vấn bớt thù địch hơn, người dùng phải hành động theo cách gần với hành vi bình thường hơn. Giới thiệu thời gian ngẫu nhiên giữa các hành động, chuyển đổi tác nhân người dùng, cuộn trang, di chuyển con trỏ chuột, mô phỏng việc viết và thậm chí nhiều hơn nữa. Việc sử dụng selen hoặc nhà viết kịch làm công cụ cạo Python mang lại cho tự động hóa các tính năng giống con người hơn nhiều để có thể tránh được các khối.

  • Thay đổi tác nhân người dùng:
    
    import random
    import requests
    
    url = 'https://google.com'
    
    user_agents = [
       'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
       'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
       'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
    ]
    headers = {
       'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
       'accept-language': 'en-IN,en;q=0.9',
       'dnt': '1',
       'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
       'sec-ch-ua-mobile': '?0',
       'sec-ch-ua-platform': '"Linux"',
       'sec-fetch-dest': 'document',
       'sec-fetch-mode': 'navigate',
       'sec-fetch-site': 'none',
       'sec-fetch-user': '?1',
       'upgrade-insecure-requests': '1',
    }
    
    
    headers['user-agent'] = random.choice(user_agents)
    response = requests.get(url=url, headers=headers)
    
    
  • Chuyển động con trỏ:
    
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.action_chains import ActionChains
    
    options = webdriver.ChromeOptions()
    options.add_argument("--headless")  # Chạy trình duyệt không có giao diện đồ họa
    driver = webdriver.Chrome(options=options)
    
    driver.get("https://google.com")
    
    # Tìm một phần tử của XPath
    element = driver.find_element(By.XPATH, "//button[text()=Confirm]")
    
    # Sử dụng hành động để di chuyển con trỏ
    actions = ActionChains(driver)
    actions.move_to_element(element).perform()
    
    # Đóng trình duyệt
    driver.quit()
    
    

Chiến thuật 3: Tránh bẫy honeypot

Một số trang web nhất định nhúng các yếu tố bổ sung được thiết kế cho người dùng thường xuyên vô hình, nhưng bot có thể vô tình kích hoạt chúng. Các yếu tố này bao gồm các biểu mẫu được che giấu, nhấp và gửi chúng sẽ dẫn đến việc trang web cấm truy cập của bot. Trước khi thu thập dữ liệu, sử dụng các kiểu và thuộc tính CSS như hiển thị: Không có hoặc Opacity: 0 và không tham gia vào các kiểu đó.

Chiến thuật 4: Quản lý cookie và phiên

Nếu các yêu cầu được thực hiện mà không có cookie chính xác hoặc cấu hình phiên, một số trang web sẽ chặn các yêu cầu lặp lại được coi là quá đơn giản. Để giải quyết vấn đề này, sử dụng các yêu cầu.session (), sử dụng cookie đã lưu và hoạt động như một người dùng chính hãng. Thay đổi tiêu đề tác nhân người dùng cũng cần phải được thực hiện vì bot sẽ được họ nhận ra.

Chiến thuật 5: Thực hiện backoff theo cấp số nhân để thử lại cho việc thử lại dữ liệu Python

Trong trường hợp máy chủ không trả lời hoặc trả về một lỗi tạm thời, hãy tạm dừng trước khi đổ thêm các nỗ lực để lặp lại lệnh. Backoff theo cấp số nhân được ưu tiên hơn - nó đề cập đến việc tăng thời gian chờ đợi sau mỗi lần thử không thành công. Chẳng hạn, người ta có thể tăng nó thêm 1 giây, 2 giây, sau đó 4 giây, v.v. Điều này làm giảm khả năng bị chặn trong khi giảm thiểu giới hạn trang web và giảm bớt khối lượng công việc cạo dữ liệu với Python.


import time
import requests


def fetch_with_backoff(url, max_retries=5):
   retries = 0
   wait_time = 1  # Độ trễ 1 giây

   while retries < max_retries:
       try:
           response = requests.get(url)

           # Nếu yêu cầu thành công, hãy trả lại kết quả
           if response.status_code == 200:
               return response.text

           print(f"Error {response.status_code}. Retrying in {wait_time} sec.")

       except requests.exceptions.RequestException as e:
           print(f"Connection error: {e}. Retrying in {wait_time} sec.")

       # Chờ trước khi thử lại
       time.sleep(wait_time)

       # Tăng độ trễ
       wait_time *= 2
       retries += 1

   return None


url = "https://google.com"
html = fetch_with_backoff(url)

Chiến thuật 6: Sử dụng các trình duyệt không đầu cho các tương tác phức tạp

Một số trang web có thể tải nội dung trong các giai đoạn hoặc chúng có thể chỉ hoạt động khi nhận được một số đầu vào từ người dùng. Trong những trường hợp như vậy, các thư viện như BeautifulSoup khó có thể giúp đỡ. Trong trường hợp này, việc quét web với selenium, puppeteer và nhà viết kịch sẽ giúp ích. Chúng cho phép bạn mở các trang như người dùng bình thường, có nghĩa là họ có thể nhấp vào các nút, nhập văn bản và nếu không tham gia vào các phần tử trên trang.

Chiến thuật 7: Dữ liệu Python lấy từ tải không đồng bộ

Có một số trang web sẽ không sử dụng JavaScript để hiển thị dữ liệu cho đến khi người dùng truy cập trang web. Với điều này, một yêu cầu HTTP tiêu chuẩn sẽ không tìm nạp tất cả các thông tin cần thiết. Selenium có thể được sử dụng để thu thập thông tin đó hoặc các yêu cầu mạng có thể được xem xét kỹ lưỡng bằng cách sử dụng trình duyệt devtools. Điều này hỗ trợ trong việc phát hiện các điểm cuối API được che giấu, sau này có thể được sử dụng để truy xuất thông tin với rắc rối tối thiểu.

Chiến thuật 8: Phát hiện và tránh dấu vân tay TLS

Phần lớn các trang web truyền tải các yêu cầu tự động cho máy chủ để xử lý thêm. Người ta biết rằng một số trang web xác minh dấu vân tay của TLS như một phương tiện để phân biệt các yêu cầu tự động. Điều đó có nghĩa là máy chủ nghiên cứu các thuộc tính kết nối khác nhau như sự chú ý của TLS/SSL bằng công nghệ, mật mã và các kết nối tinh vi khác. Đạt được điều đó có thể được thực hiện bằng cách trộn các thuộc tính kết nối trong các yêu cầu sử dụng các tiêu đề và proxy tùy chỉnh.

  • Tích hợp proxy:
    
    import requests
    
    url = 'username:password@your-proxy'
    
    proxy = 'your-proxy'
    proxies = {
       "http": f"http://{proxy}",
       "https": f"https://{proxy}",
    }
    response = requests.get(url=url, proxies=proxies)
    
    

Chiến thuật 9: Tận dụng các điểm cuối API khi có sẵn

Nếu một trang web cung cấp API công khai, nên sử dụng nó thay vì dùng đến việc cạo. Cách tiếp cận này nhanh hơn, đáng tin cậy hơn và ít có khả năng bị chặn. Một điểm khởi đầu tốt để tìm điểm cuối API là kiểm tra các yêu cầu mà trang web thực hiện, có thể nhìn thấy trong devtools. Trong trường hợp không có API, bạn sẽ phải làm việc với mã HTML.

Chiến thuật 10: Theo dõi các thay đổi trong cấu trúc trang web

Các trang web có thể sửa đổi mã của họ, có thể trì hoãn việc cạo chúng. Là một quầy, hãy xem xét những điều sau đây:

  • Chuyển từ sử dụng bộ chọn CSS sang XPath;
  • Sử dụng các thử nghiệm tự động để theo dõi định kỳ cấu trúc trang;
  • Tạo mã thông minh có thể xử lý các thay đổi có thể xảy ra. Một cách là tìm kiếm các yếu tố theo nội dung của chúng hơn là các đường dẫn được xác định trước.

Chiến thuật 11: Đảm bảo tuân thủ các điều khoản dịch vụ trang web

Trong một số trường hợp, việc quét web với Python từ các trang web có thể vi phạm các điều khoản sử dụng của họ hoặc thậm chí được coi là bất hợp pháp trong các khu vực pháp lý nhất định. Bắt buộc phải kiểm tra cả robot.txt và các điều khoản dịch vụ cùng với chính sách trang web trước khi cạo dữ liệu. Nó cũng tốt nhất để sử dụng API công khai nếu có sẵn. Hơn nữa, đặt giới hạn theo số yêu cầu để giảm thiểu biến dạng trên máy chủ.

Cạo dữ liệu Python: Kết luận

Khai thác web nâng cao với Python đi kèm với những lợi thế của riêng nó, nhưng làm đúng cách cũng quan trọng không kém. Chúng tôi đã thảo luận về các khía cạnh quan trọng của quá trình như vậy liên quan đến việc bỏ qua CAPTCHA, mô phỏng các hành động của người dùng, quản lý cookie và phiên, xử lý honeypots và kiểm tra dữ liệu trong các ứng dụng web không đồng bộ.

Ngoài ra, hãy nhớ rằng khía cạnh đạo đức và thỏa thuận liên quan của trang web đã sử dụng. Sử dụng các điểm cuối API khi có sẵn và nếu phân tích cú pháp HTML là không thể tránh khỏi, hãy làm theo tất cả các hướng dẫn để giảm cơ hội bị chặn và có biến chứng pháp lý.

Với việc sử dụng các phương pháp hướng dẫn quét web này với Python, tiềm năng rủi ro có thể giảm đáng kể, trong khi hiệu quả có thể được tăng lên tối đa.

Bình luận:

0 Bình luận