Hướng dẫn is web scraping in python hard? - Tìm kiếm web trong python có khó không?

Nói tóm lại, nếu bạn không có kiến ​​thức hoặc kinh nghiệm lập trình, điều này sẽ khá khó khăn. Kỹ năng Excel là tuyệt vời, nhưng chúng loại nhạt so với các kỹ năng cần thiết để viết một ứng dụng thực sự. Tuy nhiên, tôi nghĩ rằng việc xây dựng một máy cạo web là một dự án học tập hoàn toàn tuyệt vời! Nếu bạn muốn học, đây sẽ là một điểm khởi đầu tuyệt vời. Bạn có thể mất một vài tháng nếu bạn bắt đầu không có kinh nghiệm, nhưng bạn phải bắt đầu ở đâu đó.

Nếu bạn muốn tự làm điều này, đây là các khái niệm bạn cần học:

-Basic HTML (bao gồm cả DOM, v.v.) -Đây là những gì trang bạn đang cạo được tạo từ. Bạn cần phải hiểu những thứ này trước khi bạn thực sự có thể làm bất cứ điều gì.

-Basic JavaScript và JQuery -Đây là những gì bạn sử dụng để xác định vị trí các yếu tố cụ thể trong trang (tức là bảng dòng), đi qua các phần tử con của chúng (tức là mỗi hàng chứa thông tin người chơi) và trích xuất thông tin cần thiết.

-Ajax (sử dụng jQuery; thực sự điều này có thể được gộp lại với bước trước) -đây là những gì bạn cần sử dụng để truy xuất dữ liệu (tức là trang HTML) từ trang web.

Với các công cụ này, bạn có thể xây dựng một ứng dụng quét web khá cơ bản. Trên đường đi, bạn có thể chọn những thứ khác như kiểu dáng với CSS hoặc tạo phần phụ trợ bằng PHP/Rails/Django hoặc bất cứ thứ gì khác.

Nếu không, nếu bạn nghiêm túc về việc trả tiền cho ai đó để làm điều này cho bạn ... hãy gửi tin nhắn cho tôi.

Scraping là một khái niệm đơn giản trong bản chất của nó, nhưng nó cũng khó khăn cùng một lúc. Nó giống như một trò chơi mèo và chuột giữa chủ sở hữu trang web và nhà phát triển hoạt động trong một khu vực màu xám hợp pháp. Bài viết này làm sáng tỏ một số vật cản mà một lập trình viên có thể phải đối mặt trong khi quét web, và những cách khác nhau để đi xung quanh chúng.

Xin lưu ý rằng tầm quan trọng của việc cạo râu với sự tôn trọng.

Web Scraping là gì?

Xóa web, theo thuật ngữ đơn giản, là hành động trích xuất dữ liệu từ các trang web. Nó có thể là một quy trình thủ công hoặc một quy trình tự động. Tuy nhiên, trích xuất dữ liệu theo cách thủ công từ các trang web có thể là một quy trình tẻ nhạt và dự phòng, điều này biện minh cho toàn bộ hệ sinh thái gồm nhiều công cụ và thư viện được xây dựng để tự động hóa quá trình chiết xuất dữ liệu. Trong việc quét web tự động, thay vì để cho trình duyệt hiển thị các trang cho chúng tôi, chúng tôi sử dụng các tập lệnh tự viết để phân tích phản hồi thô từ máy chủ. Từ bây giờ trở đi trong bài đăng, chúng tôi sẽ chỉ sử dụng thuật ngữ "Scraping Web" để ngụ ý "Xóa web tự động".

Làm thế nào được thực hiện quét web?

Trước khi chúng ta chuyển sang những thứ có thể làm cho việc cạo trở nên khó khăn, hãy chia nhỏ quá trình quét web thành các bước rộng:

  1. Kiểm tra trực quan: Tìm ra những gì để trích xuất
  2. Thực hiện yêu cầu HTTP cho trang web
  3. Phân tích phản hồi HTTP
  4. Tồn tại/sử dụng dữ liệu liên quan

Bước đầu tiên liên quan đến việc sử dụng các công cụ trình duyệt tích hợp (như Chrome Devtools và Firefox Developer Tools) để xác định thông tin chúng tôi cần trên trang web và xác định các cấu trúc/mẫu để trích xuất theo chương trình.

Các bước sau đây liên quan đến việc thực hiện các yêu cầu một cách có phương pháp đến trang web và thực hiện logic để trích xuất thông tin, sử dụng các mẫu chúng tôi đã xác định. Cuối cùng, chúng tôi sử dụng thông tin cho bất kỳ mục đích nào chúng tôi dự định.

Ví dụ: giả sử chúng tôi muốn trích xuất số lượng người đăng ký của PewDiePie và so sánh nó với T-series. Một tìm kiếm đơn giản của Google dẫn tôi đến trang số đăng ký YouTube thời gian thực của Socialblade.

Từ kiểm tra trực quan, chúng tôi thấy rằng số lượng thuê bao nằm trong thẻ

với ID rawCount.

Hãy viết một hàm Python đơn giản để có được giá trị này. Chúng tôi sẽ sử dụng đẹp để phân tích HTML.

import requests
from bs4 import BeautifulSoup

def get_subscribers(url):
  html = requests.get(url).content
  soup = BeautifulSoup(html)
  return soup.select('#rawCount')[0].text

Hãy xem số đếm ngay bây giờ:

>>> get_subscribers('https://socialblade.com/youtube/user/pewdiepie/realtime') #PewDiePie
'80520035'

>>> get_subscribers('https://socialblade.com/youtube/user/tseries/realtime') #T-series
'79965479'

Có vẻ như là một quá trình dễ dàng, phải không? Điều gì có thể sai?

Câu trả lời cho điều này chủ yếu phụ thuộc vào cách lập trình trang web và ý định của chủ sở hữu trang web. Họ có thể cố tình giới thiệu sự phức tạp để làm cho quá trình cạo trở nên khó khăn. Một số phức tạp rất dễ dàng để có được, và một số không.

Hãy liệt kê từng sự phức tạp này từng cái một và xem các giải pháp cho chúng trong phần tiếp theo.

Sự phức tạp của việc quét web

Tải không đồng bộ và kết xuất phía máy khách

Những gì bạn thấy không phải là những gì bạn nhận được.

Đây là một trong những vấn đề phổ biến nhất mà các nhà phát triển phải đối mặt khi cạo một trang web nặng JavaScript. Phản hồi ban đầu mà chúng tôi nhận được từ máy chủ có thể không chứa thông tin mà chúng tôi mong đợi theo kiểm tra trực quan.

Điều này xảy ra bởi vì thông tin mà chúng tôi thực sự đang tìm kiếm được hiển thị ở phía trình duyệt bởi các thư viện như tay lái hoặc phản ứng hoặc tìm nạp bằng cách thực hiện các cuộc gọi AJAX trong tương lai đến máy chủ và sau đó được trình duyệt hiển thị.

Một vài ví dụ về điều này bao gồm:

  • Các trang web có cuộn vô hạn (Twitter, Facebook, v.v.)
  • Trang web có trình tải trước như thanh phần trăm hoặc tải người quay

Xác thực

Nhiều trang web có một số loại xác thực mà chúng ta sẽ phải chăm sóc trong chương trình cạo của chúng ta. Đối với các trang web đơn giản hơn, xác thực có thể dễ dàng như thực hiện yêu cầu POST với tên người dùng và mật khẩu hoặc lưu trữ cookie. Tuy nhiên, cũng có thể có những sự tinh tế nhất định như:

  • Các giá trị ẩn: Cùng với tên người dùng và mật khẩu, bạn có thể cần thêm các trường khác vào tải trọng bài đăng (thường là csrf_token, nhưng cũng có thể là một số dữ liệu kỳ lạ).: Along with username and password, you might need to add other fields to the POST payload (usually CSRF_TOKEN, but can also be some weird data).
  • Đặt tiêu đề: Có thể có một số tiêu đề nhất định mà chúng ta cần đặt (người giới thiệu, ủy quyền, v.v.): There might be certain headers that we need to set (referer, authorization, etc.)

Nếu chúng ta lấy lại mã phản hồi sau từ máy chủ, thì có lẽ đó là một dấu hiệu cho thấy chúng ta cần có quyền xác thực để có thể cạo.

Mã trạng thái HTTPNó có nghĩa là gì
401 Không được phép
403 Cấm
407 Ủy quyền ủy quyền cần thiết

Danh sách đen phía máy chủ

Như chúng tôi đã đề cập trước đó, câu trả lời cho "Điều gì có thể sai trong khi cạo?" Cũng phụ thuộc vào mục đích của chủ sở hữu trang web.

Có thể có các cơ chế chống xẹp được thiết lập ở phía máy chủ để phân tích các mẫu lưu lượng và duyệt đến và chặn các chương trình tự động duyệt trang web của họ.

Những ý tưởng đơn giản để phân tích như vậy bao gồm:

Phân tích tỷ lệ yêu cầu

Nếu máy chủ nhận được quá nhiều yêu cầu trong khung thời gian từ máy khách, thì đó là một lá cờ đỏ mà có trình duyệt của con người ở đầu kia. Thậm chí tệ hơn là nhận được các yêu cầu song song từ một IP.

Một lá cờ đỏ khác là sự lặp lại (khách hàng thực hiện các yêu cầu X mỗi giây). Các máy chủ có thể đo các số liệu như vậy và xác định các ngưỡng vượt quá mà họ có thể đưa vào danh sách khách hàng. Các cơ chế có thể phức tạp hơn nhiều so với điều này, nhưng bạn có ý tưởng. Việc cấm khách hàng thường là tạm thời (có lợi cho Internet miễn phí và mở cho tất cả mọi người), nhưng trong một số trường hợp, nó thậm chí có thể là vĩnh viễn.

Kiểm tra các tiêu đề yêu cầu cũng là một kỹ thuật được sử dụng bởi một số trang web để phát hiện người dùng không phải người. Ý tưởng là so sánh các trường tiêu đề đến với các trường dự kiến ​​sẽ được gửi bởi người dùng thực.

Ví dụ: một số công cụ và thư viện nhất định gửi một tác nhân người dùng rất khác biệt trong khi thực hiện yêu cầu đến máy chủ, vì vậy các máy chủ có thể chọn chọn lọc chỉ cho phép một vài tác nhân người dùng và lọc phần còn lại. Ngoài ra, một số trang web có thể phục vụ nội dung khác nhau cho các tác nhân người dùng khác nhau, phá vỡ logic cạo của bạn.

Honeypots

Chủ sở hữu của trang web có thể thiết lập các bẫy dưới dạng liên kết trong HTML không hiển thị cho người dùng trên trình duyệt - cách dễ nhất để thực hiện điều này là đặt CSS là display: none - và nếu máy quét web đưa ra yêu cầu cho các liên kết này Máy chủ có thể biết rằng đó là một chương trình tự động và không phải là con người duyệt trang web, cuối cùng nó sẽ chặn cạp.

Phát hiện mẫu

Điều này liên quan đến các mẫu rất xác định theo cách trang web được duyệt (thời gian trong các lần nhấp, vị trí của các nhấp chuột, v.v.). Các mẫu này có thể được phát hiện bằng các cơ chế chống bò ở đầu máy chủ, dẫn đến danh sách đen.

Mã trạng thái phản hồi có thể báo hiệu danh sách đen của máy chủ bao gồm:

Mã trạng thái HTTPNó có nghĩa là gì
503 Dịch vụ Không sẵn có
429 quá nhiều yêu cầu
403 Cấm

Chuyển hướng và captchas

Một số trang web chỉ đơn giản là chuyển hướng ánh xạ liên kết cũ của họ sang các trang mới hơn (như chuyển hướng liên kết HTTP đến https) trả về mã phản hồi 3xx.

Ngoài ra, để lọc các máy khách đáng ngờ, các máy chủ có thể chuyển hướng các yêu cầu đến các trang có chứa captchas kỳ quặc, mà máy cạo web của chúng tôi cần giải quyết để chứng minh rằng "đó là con người".

Các công ty như Cloudflare, nơi cung cấp các dịch vụ chống BOT hoặc DDOS, khiến các bot thậm chí còn khó khăn hơn trong việc đưa nó vào nội dung thực tế.

Sự phức tạp về cấu trúc

Điều hướng phức tạp

Đôi khi thật khó để bò qua tất cả các trang web và thu thập thông tin. Ví dụ, phân trang có thể là khó khăn để có được xung quanh nếu mỗi trang trong phân trang không có URL duy nhất hoặc nếu nó tồn tại, nhưng không có mẫu nào có thể được quan sát để tính toán các URL đó.

HTML không cấu trúc

Đây là khi máy chủ đang gửi HTML nhưng không liên tục cung cấp một mẫu. Ví dụ: các lớp và thuộc tính CSS được tạo động ở đầu máy chủ và là duy nhất mọi lúc. Đôi khi, HTML không cấu trúc cũng là hậu quả của lập trình xấu.

iframe Thẻ

Đôi khi nội dung chúng ta thấy trên trang web là thẻ iframe được hiển thị từ một nguồn bên ngoài khác.

Được rồi! Chúng tôi đã liệt kê sự phức tạp; Bây giờ là lúc để giải quyết các cách giải quyết cho họ.

Cần trợ giúp cạo dữ liệu với Python? Nhận trợ giúp từ các nhà phát triển Python chuyên gia →

Giải quyết sự phức tạp của việc quét web với Python

Chọn đúng công cụ, thư viện và khung

Đầu tiên và quan trọng nhất, tôi không thể nhấn mạnh đủ tiện ích của các công cụ trình duyệt để kiểm tra trực quan. Lập kế hoạch hiệu quả phương pháp quét web của chúng tôi có thể giúp chúng tôi tiết kiệm hàng giờ đầu trầy xước trước. Hầu hết thời gian, các công cụ trình duyệt (gốc) đã tồn tại trước là công cụ duy nhất chúng ta cần để định vị nội dung, xác định các mẫu trong nội dung, xác định sự phức tạp và lập kế hoạch tiếp cận.

Đối với việc quét web trong Python, có nhiều công cụ có sẵn. Chúng tôi sẽ trải qua một vài lựa chọn phổ biến (và tự kiểm tra) và khi nào nên sử dụng. Để nhanh chóng lấy các trang web đơn giản, tôi đã tìm thấy sự kết hợp của các yêu cầu Python (để xử lý các phiên và thực hiện các yêu cầu HTTP) và súp đẹp (để phân tích phản hồi và điều hướng qua nó để trích xuất thông tin) để trở thành cặp hoàn hảo.

Đối với các dự án cạo lớn hơn (nơi tôi phải thu thập và xử lý nhiều dữ liệu và xử lý các phức tạp không liên quan đến JS), Scraces khá hữu ích.

Scrapy là một khung (không phải là một thư viện), trong đó tóm tắt rất nhiều sự phức tạp để cạo một cách hiệu quả (yêu cầu đồng thời, sử dụng bộ nhớ, v.v.), và cũng cho phép cắm một loạt các phần mềm trung gian (đối với cookie, chuyển hướng, phiên, bộ đệm, v.v. .) Để đối phó với sự phức tạp khác nhau. Scrapy cũng cung cấp một vỏ có thể giúp tạo mẫu nhanh chóng và xác nhận phương pháp cạo của bạn (bộ chọn, phản hồi, v.v.). Khung này khá trưởng thành, mở rộng và có sự hỗ trợ cộng đồng tốt.

Đối với các trang web nặng JavaScript (hoặc các trang web có vẻ quá phức tạp), Selenium thường là con đường để đi. Mặc dù việc cạo bằng selen không hiệu quả so với phế liệu hay súp đẹp, nhưng hầu như nó luôn giúp bạn có được dữ liệu mong muốn (đó là điều duy nhất quan trọng hầu hết thời gian).

Xử lý xác thực

Để xác thực, vì chúng tôi sẽ phải duy trì cookie và tồn tại đăng nhập của chúng tôi, tốt hơn là tạo một phiên sẽ chăm sóc tất cả những điều này. Đối với các trường ẩn, chúng tôi có thể thử đăng nhập thủ công và kiểm tra tải trọng được gửi đến máy chủ bằng các công cụ mạng do trình duyệt cung cấp để xác định thông tin ẩn được gửi (nếu có).

Chúng tôi cũng có thể kiểm tra những tiêu đề nào đang được gửi đến máy chủ bằng các công cụ trình duyệt để chúng tôi cũng có thể sao chép hành vi đó trong mã, chẳng hạn như nếu xác thực phụ thuộc vào các tiêu đề như Authorization

>>> get_subscribers('https://socialblade.com/youtube/user/pewdiepie/realtime') #PewDiePie
'80520035'

>>> get_subscribers('https://socialblade.com/youtube/user/tseries/realtime') #T-series
'79965479'
0). Nếu trang web sử dụng xác thực dựa trên cookie đơn giản (ngày nay rất khó xảy ra), chúng tôi cũng có thể sao chép nội dung cookie và thêm nó vào mã cạp của bạn (một lần nữa, chúng tôi có thể sử dụng các công cụ trình duyệt tích hợp cho việc này).

Xử lý tải không đồng bộ

Phát hiện tải không đồng bộ

Chúng tôi có thể phát hiện tải không đồng bộ trong bước kiểm tra trực quan bằng cách xem nguồn của trang (tùy chọn "Nguồn xem" trong trình duyệt khi nhấp chuột phải) và sau đó tìm kiếm nội dung chúng tôi đang tìm kiếm. Nếu bạn không tìm thấy văn bản trong nguồn, nhưng bạn vẫn có thể nhìn thấy nó trong trình duyệt, thì có lẽ nó được hiển thị bằng JavaScript. Kiểm tra thêm có thể được thực hiện với công cụ mạng của trình duyệt để kiểm tra xem có bất kỳ yêu cầu XHR nào được thực hiện bởi trang web.

Đi xung quanh tải không đồng bộ

Sử dụng trình điều khiển web

Trình điều khiển web giống như mô phỏng trình duyệt với giao diện được điều khiển thông qua các tập lệnh. Nó có khả năng thực hiện các công cụ trình duyệt như kết xuất JavaScript, quản lý cookie và phiên, v.v. Selenium Web Driver là một khung tự động hóa web được thiết kế để kiểm tra UI/UX của các trang web, nhưng nó cũng đã trở thành một tùy chọn phổ biến để cạo các trang web được hiển thị động theo thời gian.

Không cần phải nói, vì trình điều khiển web là một mô phỏng các trình duyệt, chúng rất chuyên sâu về tài nguyên và tương đối chậm hơn khi so sánh với các thư viện như

>>> get_subscribers('https://socialblade.com/youtube/user/pewdiepie/realtime') #PewDiePie
'80520035'

>>> get_subscribers('https://socialblade.com/youtube/user/tseries/realtime') #T-series
'79965479'
1 và
>>> get_subscribers('https://socialblade.com/youtube/user/pewdiepie/realtime') #PewDiePie
'80520035'

>>> get_subscribers('https://socialblade.com/youtube/user/tseries/realtime') #T-series
'79965479'
2.

Selenium hỗ trợ nhiều ngôn ngữ để viết kịch bản, bao gồm cả Python. Thông thường, nó khởi chạy một thể hiện trình duyệt và chúng ta có thể thấy những thứ như nhấp và nhập dữ liệu trên màn hình, rất hữu ích trong khi thử nghiệm. Nhưng nếu chúng ta quan tâm đến việc chỉ cạo, chúng ta có thể sử dụng "trình duyệt không đầu" không có UI và nhanh hơn về mặt hiệu suất.

Chrome Headless là một lựa chọn phổ biến cho trình điều khiển web không đầu và các tùy chọn khác bao gồm Firefox, Phantomjs, Spynner và HTMLunit không đầu. Một số trong số này có thể yêu cầu bạn cài đặt XVFB và trình bao bọc Python (XVFBWRAPPER hoặc PyVirtualDisplay) để mô phỏng màn hình hiển thị màn hình trong bộ nhớ ảo mà không tạo ra bất kỳ đầu ra thực tế nào trên màn hình.

Kiểm tra các cuộc gọi Ajax

Phương pháp này hoạt động dựa trên ý tưởng "Nếu nó được hiển thị trên trình duyệt, nó phải đến từ đâu đó." Chúng tôi có thể sử dụng các công cụ dành cho nhà phát triển trình duyệt để kiểm tra các cuộc gọi AJAX và cố gắng tìm ra các yêu cầu chịu trách nhiệm tìm nạp dữ liệu mà chúng tôi đang tìm kiếm. Chúng tôi có thể cần đặt tiêu đề

>>> get_subscribers('https://socialblade.com/youtube/user/pewdiepie/realtime') #PewDiePie
'80520035'

>>> get_subscribers('https://socialblade.com/youtube/user/tseries/realtime') #T-series
'79965479'
3 để bắt chước các yêu cầu AJAX trong tập lệnh của bạn.

Xử lý cuộn vô hạn

Chúng ta có thể giải quyết cuộn vô hạn bằng cách tiêm một số logic JavaScript vào selen (xem chủ đề này). Ngoài ra, thông thường cuộn vô hạn bao gồm các cuộc gọi AJAX hơn nữa đến máy chủ mà chúng tôi có thể kiểm tra bằng cách sử dụng các công cụ trình duyệt và sao chép trong chương trình cạo của chúng tôi.

Tìm đúng bộ chọn

Khi chúng tôi xác định vị trí phần tử mà chúng tôi muốn trích xuất trực quan, bước tiếp theo của chúng tôi là tìm một mẫu chọn cho tất cả các phần tử mà chúng tôi có thể sử dụng để trích xuất chúng từ HTML. Chúng tôi có thể lọc các phần tử dựa trên các lớp CSS và thuộc tính của chúng bằng các bộ chọn CSS. Bạn có thể tham khảo bảng gian lận nhanh này để biết các cách khác nhau để chọn các yếu tố dựa trên CSS.

Bộ chọn CSS là một lựa chọn phổ biến để cạo. Tuy nhiên, một kỹ thuật khác để chọn các yếu tố được gọi là XPath (ngôn ngữ truy vấn để chọn các nút trong tài liệu XML) có thể hữu ích trong một số kịch bản nhất định. Nó cung cấp các khả năng linh hoạt hơn, ví dụ:

  • Chọn các yếu tố dựa trên nội dung của họ. Đây không phải là một thực tế được khuyến nghị, nhưng nó tiện dụng cho các trang có cấu trúc kém.. This is not a recommended practice, but it's handy for poorly structured pages.
  • Tìm kiếm theo bất kỳ hướng nào. Chúng ta có thể xây dựng các truy vấn tìm kiếm ông bà, và sau đó tìm kiếm con của họ với các thuộc tính/văn bản nhất định. Điều này là không thể với các bộ chọn CSS.. We can construct queries that search for grandparents, and then search their child with certain attributes/text. This is not possible with CSS selectors.

Một số người cho rằng XPath chậm hơn các bộ chọn CSS, nhưng theo kinh nghiệm cá nhân của tôi, cả hai đều hoạt động tốt như nhau. Mặc dù đôi khi cái này nhanh hơn cái kia, nhưng sự khác biệt là tính bằng mili giây. Ngoài ra, khi cạo các trang web không phức tạp và cấu trúc tốt, tôi chỉ cần sử dụng công cụ lựa chọn của Chrome/Firefox để lấy XPath của phần tử đích, cắm nó vào tập lệnh của mình và tôi tốt khi đi trong vòng vài giây. Phải nói rằng, có một vài kiểm tra có thể có ích trong khi đưa ra các bộ chọn:

  • Tính nhất quán trên các trình duyệt. Các trình duyệt khác nhau có triển khai động cơ khác nhau để đánh giá các bộ chọn CSS và XPath. Vì vậy, trong một số rất ít trường hợp, các bộ chọn bạn sử dụng có thể hoạt động cho một số trình duyệt/phiên bản nhất định chứ không phải cho các trình duyệt khác. May mắn thay, hầu hết các trình duyệt hiện nay đều hỗ trợ đánh giá các truy vấn này trong chính các công cụ trình duyệt để chúng tôi có thể xác minh nhanh chóng.

Bằng cách nhấn

>>> get_subscribers('https://socialblade.com/youtube/user/pewdiepie/realtime') #PewDiePie
'80520035'

>>> get_subscribers('https://socialblade.com/youtube/user/tseries/realtime') #T-series
'79965479'
4 trong trình kiểm tra DOM, chúng ta có thể sử dụng biểu thức CSS (hoặc XPath) làm truy vấn tìm kiếm. Trình duyệt sẽ đạp xe qua và cho chúng tôi xem tất cả các trận đấu. Đó là một cách nhanh chóng để kiểm tra xem biểu thức có hoạt động không.

  • Chọn các phần tử bằng IDS nhanh hơn, vì vậy chúng ta nên thích ID bất cứ nơi nào có sẵn.
  • Xppath được ghép chặt hơn với cấu trúc HTML so với các bộ chọn CSS, tức là, XPath có nhiều khả năng bị phá vỡ nếu có một số thay đổi trong cách cấu trúc HTML trên một trang.

Xử lý danh sách đen phía máy chủ

Trong phần cuối cùng, chúng tôi đã thảo luận về một số máy chủ kỹ thuật sử dụng để phát hiện bot tự động và điều tiết chúng. Có một vài điều mà chúng ta có thể làm để ngăn chặn cào của chúng ta bị phát hiện:

  1. Sử dụng máy chủ proxy và xoay IP. Đối với máy chủ, có vẻ như có nhiều người dùng duyệt trang web. Có nhiều trang web mà bạn có thể tìm thấy một danh sách các proxy miễn phí để sử dụng (như thế này). Cả

    >>> get_subscribers('https://socialblade.com/youtube/user/pewdiepie/realtime') #PewDiePie
    '80520035'
    
    >>> get_subscribers('https://socialblade.com/youtube/user/tseries/realtime') #T-series
    '79965479'
    
    5 và
    >>> get_subscribers('https://socialblade.com/youtube/user/pewdiepie/realtime') #PewDiePie
    '80520035'
    
    >>> get_subscribers('https://socialblade.com/youtube/user/tseries/realtime') #T-series
    '79965479'
    
    2 đều có chức năng để sử dụng các proxy xoay. Một vài điều cần ghi nhớ trong khi sử dụng proxy là:
    . To the server, it'll look like there are multiple users browsing the site. There are multiple sites where you can find a list of free proxies to use (like this). Both
    >>> get_subscribers('https://socialblade.com/youtube/user/pewdiepie/realtime') #PewDiePie
    '80520035'
    
    >>> get_subscribers('https://socialblade.com/youtube/user/tseries/realtime') #T-series
    '79965479'
    
    5 and
    >>> get_subscribers('https://socialblade.com/youtube/user/pewdiepie/realtime') #PewDiePie
    '80520035'
    
    >>> get_subscribers('https://socialblade.com/youtube/user/tseries/realtime') #T-series
    '79965479'
    
    2 have functionalities to use rotating proxies. A couple of things to keep in mind while using proxies are:

    • Địa chỉ proxy miễn phí thường là tạm thời; Họ sẽ bắt đầu đưa ra lỗi kết nối sau một thời gian. Vì vậy, tốt hơn là cung cấp các proxy một cách linh hoạt. Chúng ta có thể loại bỏ danh sách các proxy hoạt động (vâng, cạo để lấy thêm) từ các trang web liệt kê proxy hoặc sử dụng một số loại API (một vài dịch vụ proxy cao cấp có chức năng này).
    • Một số proxy đặt và gửi tiêu đề
      >>> get_subscribers('https://socialblade.com/youtube/user/pewdiepie/realtime') #PewDiePie
      '80520035'
      
      >>> get_subscribers('https://socialblade.com/youtube/user/tseries/realtime') #T-series
      '79965479'
      
      7 hoặc
      >>> get_subscribers('https://socialblade.com/youtube/user/pewdiepie/realtime') #PewDiePie
      '80520035'
      
      >>> get_subscribers('https://socialblade.com/youtube/user/tseries/realtime') #T-series
      '79965479'
      
      8 (hoặc cả hai) mà máy chủ có thể sử dụng để phát hiện rằng chúng tôi đang sử dụng proxy (và thậm chí là địa chỉ IP thực). Vì vậy, nên sử dụng proxy Elite (proxy gửi cả hai trường tiêu đề này là trống).
  2. Giả mạo tác nhân người dùng và xoay vòng. Ý tưởng là chuyển trường tiêu đề của tác nhân người dùng (hoặc nhiều tác nhân người dùng khác nhau trong vòng quay) để đánh lừa máy chủ. Một danh sách các tác nhân người dùng khác nhau có sẵn ở đây. Tác nhân người dùng giả mạo có thể không phải lúc nào cũng hoạt động vì các trang web có thể đưa ra các phương thức JS phía máy khách để xác định xem tác nhân có phải là người yêu cầu không. Chúng ta cũng nên nhớ rằng các tác nhân người dùng xoay mà không cần xoay địa chỉ IP theo Tandem có thể báo hiệu một lá cờ đỏ đến máy chủ.. The idea is to pass a different user-agent (or multiple different user-agents in rotation) header field to fool the server. A list of different possible User-agents is available here. Spoofing user-agent may not always work because websites can come up with client-side JS methods to identify if the agent is what it is claiming. We should also keep in mind that rotating User agents without rotating IP address in tandem may signal a red flag to the server.

  3. Giảm tốc độ thu thập dữ liệu bằng cách thêm thời gian ngẫu nhiên chờ đợi giữa các hành động (như thực hiện yêu cầu, nhập dữ liệu, nhấp vào các yếu tố, v.v.). Điều này sẽ chọn ngẫu nhiên mẫu duyệt và làm cho máy chủ khó phân biệt giữa Scrape của chúng tôi và người dùng trong thế giới thực. by adding random time waits between actions (like making requests, entering data, clicking elements, etc.). This will randomize the browsing pattern and make it harder for the server to differentiate between our scrape and a real-world user.

    Scrapy có một phần mở rộng tự động để đi xung quanh với điều chỉnh. Nó có một loạt các cài đặt có thể định cấu hình để mô phỏng các mẫu duyệt trong thế giới thực.

Xử lý chuyển hướng và captchas

Các thư viện hiện đại như

>>> get_subscribers('https://socialblade.com/youtube/user/pewdiepie/realtime') #PewDiePie
'80520035'

>>> get_subscribers('https://socialblade.com/youtube/user/tseries/realtime') #T-series
'79965479'
5 đã chăm sóc các chuyển hướng HTTP bằng cách theo dõi chúng (duy trì lịch sử) và trả lại trang cuối cùng. Scrapy cũng có một phần mềm trung gian chuyển hướng để xử lý chuyển hướng. Chuyển hướng không phải là một rắc rối miễn là cuối cùng chúng tôi được chuyển hướng đến trang chúng tôi tìm kiếm. Nhưng nếu chúng ta chuyển hướng đến một captcha, thì nó sẽ trở nên khó khăn.

Captchas dựa trên văn bản rất đơn giản có thể được giải quyết bằng OCR (có một thư viện Python có tên PyTesseract cho việc này). Captchas dựa trên văn bản là những con dốc trơn trượt để thực hiện những ngày này với sự ra đời của các kỹ thuật OCR tiên tiến (dựa trên việc học sâu, như thế này), vì vậy việc tạo ra hình ảnh có thể đánh bại máy móc nhưng không phải là khó khăn hơn.

Ngoài ra, trong trường hợp chúng tôi không muốn chịu chi phí giải quyết Captchas, có nhiều dịch vụ có sẵn cung cấp API cho cùng, bao gồm Death by Captcha, Antigate và Anti Captcha. Một số dịch vụ này sử dụng những người thực sự được trả tiền để giải quyết Captcha cho bạn. Tuy nhiên, bạn có thể tránh được captchas ở một mức độ nào đó bằng cách sử dụng proxy và xoay IP.

Xử lý các thẻ iframe và các phản hồi không cấu trúc

Đối với các thẻ iframe, nó chỉ là vấn đề yêu cầu URL phù hợp để lấy lại dữ liệu mà bạn muốn. Chúng tôi phải yêu cầu trang bên ngoài, sau đó tìm iframe và sau đó thực hiện một yêu cầu HTTP khác cho thuộc tính iframe tựa

2. Ngoài ra, không có gì nhiều mà chúng ta có thể làm về các mẫu HTML hoặc URL không có cấu trúc bên cạnh việc phải đưa ra các hack (đưa ra các truy vấn XPath phức tạp, sử dụng regexes, v.v.).

Các công cụ và thư viện tuyệt vời khác

Các công cụ sau đây có thể có ích cho bạn cho một số trường hợp cụ thể.

  • Báo: Báo3K là một thư viện cho các bài báo. Nó hỗ trợ nhiều ngôn ngữ, cung cấp API để có được thông tin meta như chi tiết tác giả và ngày xuất bản và các tính năng NLP như trích xuất tóm tắt và từ khóa, trích xuất tác giả.
  • PYAUTOGUI: PYAUTOGUI là mô -đun tự động hóa GUI cho phép bạn điều khiển bàn phím và chuột. Một tính năng đẹp mà Pyautogui cung cấp là định vị một hình ảnh trên màn hình. Tôi đã quan sát một vài người sử dụng Pyautogui để điều hướng qua trang web.
  • EDITThiscookie Trình duyệt mở rộng khá hữu ích khi bạn chơi xung quanh với cookie và nội dung của chúng.
  • CloudFlare-scrape: Tôi đã sử dụng mô-đun này trong quá khứ để xem xét kiểm tra chống BOT của Cloudflare. Một điều tốt đẹp về hệ sinh thái cạo trong Python là có rất nhiều chức năng mà bạn sẽ tìm thấy có nguồn mở hoặc dưới dạng đoạn trích trên Stack Overflow.
  • TCPDUMP: Bạn có thể sử dụng TCPDUMP để so sánh tiêu đề của hai yêu cầu (một cái mà cạp của bạn đang gửi và cái còn lại mà trình duyệt của bạn đang gửi trong khi thực sự lướt web)
  • Burp Suite: Burp Suite rất hữu ích cho việc chặn các yêu cầu trình duyệt thực hiện trên trang web và phân tích chúng.
  • STEM: Chỉ trong trường hợp bạn muốn thực hiện các yêu cầu bằng Python trên Tor.
  • Các dịch vụ cạo trực quan như Octopars, Portia (nguồn mở và được xây dựng bởi nhóm Scrapy), Parsehub, Dext và FMiner.
  • Các tiện ích mở rộng của trình duyệt như cào web, cào dữ liệu và agenty (cho chrome).

Cào với sự tôn trọng

Trong bài đăng này, chúng tôi đã đề cập đến những phức tạp điển hình liên quan đến việc cạo các trang web, cách giải quyết có thể của chúng và các công cụ và thư viện mà chúng tôi có thể sử dụng với Python trong tâm trí.

Như đã đề cập ngay từ đầu, việc cạo giống như một trò chơi mèo và chuột hoạt động trong một khu vực màu xám hợp pháp và có thể gây rắc rối cho cả hai bên nếu không được thực hiện một cách tôn trọng. Vi phạm bản quyền và lạm dụng thông tin có thể mời các hậu quả pháp lý. Một vài trường hợp gây ra tranh cãi là bản phát hành dữ liệu OK Cupid của các nhà nghiên cứu và HIQ Labs sử dụng dữ liệu LinkedIn cho các sản phẩm nhân sự.

Tiêu chuẩn loại trừ robot được thiết kế để truyền đạt ý định của các chủ sở hữu trang web hướng tới việc được lập chỉ mục/thu thập thông tin. Lý tưởng nhất, cào web của chúng tôi nên tuân theo các hướng dẫn trong tệp

3. Ngay cả khi

3 cho phép cạo, thực hiện nó có thể áp đảo máy chủ, gây ra sự cố hiệu suất hoặc khủng hoảng tài nguyên trên đầu máy chủ (thậm chí lỗi).

Thật tốt khi bao gồm thời gian quay lại nếu máy chủ bắt đầu mất nhiều thời gian hơn để trả lời. Ngoài ra, một ý kiến ​​ít phổ biến hơn là liên hệ trực tiếp với các chủ sở hữu trang web cho API và dữ liệu trước khi cạo để cả hai bên đều hạnh phúc.

Có phải chúng tôi đã bỏ lỡ bất kỳ lời khuyên quét web nào cho các nhà phát triển Python? Nếu vậy, hãy cho chúng tôi biết trong phần bình luận dưới đây!

Tìm hiểu Python bằng cách xây dựng các dự án miễn phí! Duyệt các dự án trong thế giới thực bây giờ →

Mất bao lâu để học Scraping Web trong Python?

Tùy thuộc vào kiến thức Python của bạn và bạn phân bổ bao nhiêu thời gian để học kỹ năng này, có thể mất từ hai ngày đến hai năm.two days to two years.

Tại sao việc cạo web là khó khăn?

Sự khác biệt duy nhất là, việc cạo dữ liệu được sử dụng để là một quá trình thủ công trước đó.Quét dữ liệu thủ công chắc chắn đã lỗi thời vì nó tẻ nhạt và tốn thời gian và dễ bị lỗi của con người.Ngoài ra, một số trang web có hàng ngàn trang web hiện không thể loại bỏ thủ công bởi các bộ phế liệu web tùy chỉnh.Manual data scraping is definitely obsolete now as its tedious and time consuming and prone to human errors. Also, some websites has thousands of web pages now which makes it impossible to manually scrape by custom web scrapers.

Python có tốt nhất cho việc cạo web không?

Python là một lựa chọn tuyệt vời cho các nhà phát triển để xây dựng các bộ phế liệu web vì nó bao gồm các thư viện gốc được thiết kế dành riêng cho việc cạo web.Dễ dàng hiểu- đọc một mã Python tương tự như đọc một tuyên bố tiếng Anh, làm cho cú pháp Python đơn giản để học. because it includes native libraries designed exclusively for web scraping. Easy to Understand- Reading a Python code is similar to reading an English statement, making Python syntax simple to learn.

Mất bao lâu để học Scraping Web?

Có, bạn có thể hoàn thành việc cạo web miễn phí này với món súp tuyệt đẹp trong khóa học cơ bản của Python trong vòng 90 ngày.90 days.