Hướng dẫn selenium scraping python - trăn cạo selen

Trong hướng dẫn cuối cùng, chúng tôi đã học cách tận dụng khung Scracy để giải quyết các nhiệm vụ cào web chung. Hôm nay chúng ta sẽ xem Selenium (với Python) trong một hướng dẫn từng bước.

Selenium đề cập đến một số dự án nguồn mở khác nhau được sử dụng để tự động hóa trình duyệt. Nó hỗ trợ các ràng buộc cho tất cả các ngôn ngữ lập trình chính, bao gồm ngôn ngữ yêu thích của chúng tôi: Python.

API Selenium sử dụng giao thức WebDriver để kiểm soát các trình duyệt web như Chrome, Firefox hoặc Safari. Selenium có thể điều khiển cả hai, một phiên bản trình duyệt được cài đặt cục bộ, cũng như một trường hợp chạy trên máy từ xa qua mạng.

Ban đầu (và đó là khoảng 20 năm nay!), Selenium được dành cho trình duyệt chéo, thử nghiệm từ đầu đến cuối (kiểm tra chấp nhận). Tuy nhiên, trong khi đó, nó đã được áp dụng chủ yếu là một nền tảng tự động hóa trình duyệt chung (ví dụ: để chụp ảnh màn hình), tất nhiên, cũng bao gồm mục đích thu thập dữ liệu web và quét web. Hiếm khi bất cứ điều gì tốt hơn trong việc "nói" với một trang web hơn là một trình duyệt thực, đúng, phải không?

Selenium cung cấp một loạt các cách để tương tác với các trang web, chẳng hạn như:

  • Nhấp vào nút
  • Các hình thức điền với dữ liệu
  • Cuộn trang
  • Chụp ảnh màn hình
  • Thực hiện mã JavaScript tùy chỉnh của riêng bạn

Nhưng lập luận mạnh mẽ nhất có lợi là khả năng xử lý các trang web theo cách tự nhiên, giống như bất kỳ trình duyệt nào. Điều này đặc biệt đến với sự tỏa sáng với các trang web ứng dụng một trang nặng JavaScript. Nếu bạn đã loại bỏ một trang web như vậy với sự kết hợp truyền thống giữa máy khách HTTP và trình phân tích cú pháp HTML, bạn chủ yếu có rất nhiều tệp JavaScript, nhưng không quá nhiều dữ liệu để cạo.

Cài đặt

Mặc dù Selenium hỗ trợ một số công cụ trình duyệt, chúng tôi sẽ sử dụng Chrome cho ví dụ sau, vì vậy vui lòng đảm bảo bạn đã cài đặt các gói sau:

  • Trang tải xuống chrome
  • Một nhị phân Chromedriver phù hợp với phiên bản Chrome của bạn
  • Gói liên kết Selenium Python

Để cài đặt gói selenium, như mọi khi, tôi khuyên bạn nên tạo một môi trường ảo (ví dụ: sử dụng VirtualEnv) và sau đó:

Bắt đầu nhanh

Khi bạn đã tải xuống, cả hai, Chrome và Chromedriver và đã cài đặt gói selenium, bạn nên sẵn sàng để khởi động trình duyệt:

from selenium import webdriver

DRIVER_PATH = '/path/to/chromedriver'
driver = webdriver.Chrome(executable_path=DRIVER_PATH)
driver.get('https://google.com')

Vì chúng tôi không định cấu hình rõ ràng chế độ không đầu, điều này thực sự sẽ hiển thị một cửa sổ Chrome thông thường, với một thông báo cảnh báo bổ sung ở trên, nói rằng Chrome đang được Selenium kiểm soát.

Hướng dẫn selenium scraping python - trăn cạo selen


Chế độ không đầu Chrome

Chạy trình duyệt từ Selenium theo cách chúng tôi làm đặc biệt hữu ích trong quá trình phát triển. Nó cho phép bạn quan sát chính xác những gì đang diễn ra và cách trang và trình duyệt hành xử trong bối cảnh mã của bạn. Tuy nhiên, một khi bạn hài lòng với mọi thứ, tuy nhiên, thường nên chuyển sang chế độ không đầu trong sản xuất.

Trong chế độ đó, selen sẽ bắt đầu Chrome trong "nền" mà không có bất kỳ đầu ra trực quan hoặc cửa sổ nào. Hãy tưởng tượng một máy chủ sản xuất, chạy một vài phiên bản chrome cùng một lúc với tất cả các cửa sổ của họ mở. Chà, các máy chủ thường có xu hướng bị bỏ qua khi nói đến việc mọi người "chu đáo" đối với UI của họ - những điều nghèo nàn của họ - nhưng nghiêm túc, không có lý do gì để lãng phí tài nguyên GUI mà không có lý do.

May mắn thay, cho phép chế độ không đầu chỉ mất một vài cờ.

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.headless = True
options.add_argument("--window-size=1920,1200")

driver = webdriver.Chrome(options=options, executable_path=DRIVER_PATH)

Chúng tôi chỉ cần khởi tạo một đối tượng

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.headless = True
options.add_argument("--window-size=1920,1200")

driver = webdriver.Chrome(options=options, executable_path=DRIVER_PATH)
7, đặt trường
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.headless = True
options.add_argument("--window-size=1920,1200")

driver = webdriver.Chrome(options=options, executable_path=DRIVER_PATH)
8 của nó thành
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.headless = True
options.add_argument("--window-size=1920,1200")

driver = webdriver.Chrome(options=options, executable_path=DRIVER_PATH)
9 và chuyển nó cho hàm tạo webDriver của chúng tôi. Xong.

Thuộc tính trang webdriver

Dựa trên ví dụ về chế độ không đầu của chúng tôi, hãy đi đầy đủ Mario và xem trang web của Nintendo.

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.headless = True
options.add_argument("--window-size=1920,1200")

driver = webdriver.Chrome(options=options, executable_path=DRIVER_PATH)
driver.get("https://www.nintendo.com/")
print(driver.page_source)
driver.quit()

Khi bạn chạy tập lệnh đó, bạn sẽ nhận được một vài tin nhắn gỡ lỗi liên quan đến trình duyệt và cuối cùng mã HTML của Nintendo.com. Đó là do cuộc gọi

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.headless = True
options.add_argument("--window-size=1920,1200")

driver = webdriver.Chrome(options=options, executable_path=DRIVER_PATH)
driver.get("https://www.nintendo.com/")
print(driver.page_source)
driver.quit()
0 của chúng tôi truy cập vào trường
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.headless = True
options.add_argument("--window-size=1920,1200")

driver = webdriver.Chrome(options=options, executable_path=DRIVER_PATH)
driver.get("https://www.nintendo.com/")
print(driver.page_source)
driver.quit()
1 của trình điều khiển, trong đó chứa tài liệu HTML của trang web mà chúng tôi yêu cầu lần cuối.

Hai trường WebDriver thú vị khác là:

  • from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    
    options = Options()
    options.headless = True
    options.add_argument("--window-size=1920,1200")
    
    driver = webdriver.Chrome(options=options, executable_path=DRIVER_PATH)
    driver.get("https://www.nintendo.com/")
    print(driver.page_source)
    driver.quit()
    
    2, để có được tiêu đề của trang
  • from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    
    options = Options()
    options.headless = True
    options.add_argument("--window-size=1920,1200")
    
    driver = webdriver.Chrome(options=options, executable_path=DRIVER_PATH)
    driver.get("https://www.nintendo.com/")
    print(driver.page_source)
    driver.quit()
    
    3, để có được URL hiện tại (điều này có thể hữu ích khi có chuyển hướng trên trang web và bạn cần URL cuối cùng)

Một danh sách đầy đủ các thuộc tính có thể được tìm thấy trong tài liệu của WebDriver.

Định vị các yếu tố

Để xóa/trích xuất dữ liệu, trước tiên bạn cần biết dữ liệu đó ở đâu. Vì lý do đó, việc định vị các yếu tố trang web là một trong những tính năng chính của việc cạo web. Đương nhiên, selen đi kèm với hộp đó (ví dụ: các trường hợp thử nghiệm cần đảm bảo rằng một yếu tố cụ thể có mặt/vắng mặt trên trang).

Có khá nhiều cách tiêu chuẩn làm thế nào người ta có thể tìm thấy một yếu tố cụ thể trên một trang. Ví dụ, bạn có thể

  • Tìm kiếm theo tên của thẻ
  • Lọc cho một lớp HTML cụ thể hoặc ID HTML
  • hoặc sử dụng bộ chọn CSS hoặc biểu thức XPath

Đặc biệt đối với biểu thức XPath, tôi khuyên bạn nên kiểm tra bài viết của chúng tôi về cách các biểu thức XPath có thể giúp bạn lọc cây Dom. Nếu bạn chưa hoàn toàn quen thuộc với nó, nó thực sự cung cấp phần đầu tiên rất tốt về các biểu thức XPath và cách sử dụng chúng.

Như thường lệ, cách dễ nhất để xác định vị trí một phần tử là mở các công cụ Chrome Dev của bạn và kiểm tra yếu tố mà bạn cần. Một phím tắt thú vị cho điều này là để làm nổi bật phần tử bạn muốn với chuột của mình và sau đó nhấn Ctrl + Shift + C hoặc trên MacOS CMD + Shift + C thay vì phải nhấp chuột phải và chọn

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.headless = True
options.add_argument("--window-size=1920,1200")

driver = webdriver.Chrome(options=options, executable_path=DRIVER_PATH)
driver.get("https://www.nintendo.com/")
print(driver.page_source)
driver.quit()
4 mỗi lần.

Hướng dẫn selenium scraping python - trăn cạo selen

Khi bạn đã tìm thấy phần tử trong cây Dom, bạn có thể thiết lập phương pháp tốt nhất là gì, để giải quyết vấn đề phần tử. Ví dụ: bạn có thể nhấp chuột phải vào phần tử trong trình kiểm tra và sao chép biểu thức XPath tuyệt đối hoặc bộ chọn CSS.

Các phương pháp Find_element

WebDriver cung cấp hai phương pháp chính để tìm các yếu tố.

  • from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    
    options = Options()
    options.headless = True
    options.add_argument("--window-size=1920,1200")
    
    driver = webdriver.Chrome(options=options, executable_path=DRIVER_PATH)
    driver.get("https://www.nintendo.com/")
    print(driver.page_source)
    driver.quit()
    
    5
  • from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    
    options = Options()
    options.headless = True
    options.add_argument("--window-size=1920,1200")
    
    driver = webdriver.Chrome(options=options, executable_path=DRIVER_PATH)
    driver.get("https://www.nintendo.com/")
    print(driver.page_source)
    driver.quit()
    
    6

Chúng khá giống nhau, với sự khác biệt mà phần trước tìm kiếm một yếu tố duy nhất mà nó trả về, trong khi cái sau sẽ trả về một danh sách tất cả các yếu tố được tìm thấy.

Cả hai phương thức đều hỗ trợ tám loại tìm kiếm khác nhau, được biểu thị bằng lớp

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.headless = True
options.add_argument("--window-size=1920,1200")

driver = webdriver.Chrome(options=options, executable_path=DRIVER_PATH)
driver.get("https://www.nintendo.com/")
print(driver.page_source)
driver.quit()
7.

Loại hìnhSự mô tảMẫu DOMThí dụ
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.headless = True
options.add_argument("--window-size=1920,1200")

driver = webdriver.Chrome(options=options, executable_path=DRIVER_PATH)
driver.get("https://www.nintendo.com/")
print(driver.page_source)
driver.quit()
8
Tìm kiếm các yếu tố dựa trên ID HTML của họHTML ID
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.headless = True
options.add_argument("--window-size=1920,1200")

driver = webdriver.Chrome(options=options, executable_path=DRIVER_PATH)
driver.get("https://www.nintendo.com/")
print(driver.page_source)
driver.quit()
9
<html>
    <head>
        ... some stuff
    </head>
    <body>
        <h2 class="someclass" id="greatID">Super title</h2>
    </body>
</html>
0
<html>
    <head>
        ... some stuff
    </head>
    <body>
        <h2 class="someclass" id="greatID">Super title</h2>
    </body>
</html>
1
Tìm kiếm các yếu tố dựa trên thuộc tính tên của chúngname attribute
<html>
    <head>
        ... some stuff
    </head>
    <body>
        <h2 class="someclass" id="greatID">Super title</h2>
    </body>
</html>
2
<html>
    <head>
        ... some stuff
    </head>
    <body>
        <h2 class="someclass" id="greatID">Super title</h2>
    </body>
</html>
3
<html>
    <head>
        ... some stuff
    </head>
    <body>
        <h2 class="someclass" id="greatID">Super title</h2>
    </body>
</html>
4
Tìm kiếm các yếu tố dựa trên biểu thức XPathXPath expression
<html>
    <head>
        ... some stuff
    </head>
    <body>
        <h2 class="someclass" id="greatID">Super title</h2>
    </body>
</html>
5
<html>
    <head>
        ... some stuff
    </head>
    <body>
        <h2 class="someclass" id="greatID">Super title</h2>
    </body>
</html>
6
<html>
    <head>
        ... some stuff
    </head>
    <body>
        <h2 class="someclass" id="greatID">Super title</h2>
    </body>
</html>
7
Tìm kiếm các phần tử neo dựa trên sự phù hợp của nội dung văn bản của họmatch of their text content
<html>
    <head>
        ... some stuff
    </head>
    <body>
        <h2 class="someclass" id="greatID">Super title</h2>
    </body>
</html>
8
<html>
    <head>
        ... some stuff
    </head>
    <body>
        <h2 class="someclass" id="greatID">Super title</h2>
    </body>
</html>
9
h2 = driver.find_element(By.NAME, 'h2')
h2 = driver.find_element(By.CLASS_NAME, 'someclass')
h2 = driver.find_element(By.XPATH, '//h2')
h2 = driver.find_element(By.XPATH, '/html/body/h2')
h2 = driver.find_element(By.ID, 'greatID')
0
Tìm kiếm các phần tử neo dựa trên một chuỗi phụ của nội dung văn bản của họsub-string match of their text content
<html>
    <head>
        ... some stuff
    </head>
    <body>
        <h2 class="someclass" id="greatID">Super title</h2>
    </body>
</html>
8
<html>
    <head>
        ... some stuff
    </head>
    <body>
        <h2 class="someclass" id="greatID">Super title</h2>
    </body>
</html>
9
h2 = driver.find_element(By.NAME, 'h2')
h2 = driver.find_element(By.CLASS_NAME, 'someclass')
h2 = driver.find_element(By.XPATH, '//h2')
h2 = driver.find_element(By.XPATH, '/html/body/h2')
h2 = driver.find_element(By.ID, 'greatID')
0
Tìm kiếm các phần tử neo dựa trên một chuỗi phụ của nội dung văn bản của họtag name
h2 = driver.find_element(By.NAME, 'h2')
h2 = driver.find_element(By.CLASS_NAME, 'someclass')
h2 = driver.find_element(By.XPATH, '//h2')
h2 = driver.find_element(By.XPATH, '/html/body/h2')
h2 = driver.find_element(By.ID, 'greatID')
2
h2 = driver.find_element(By.NAME, 'h2')
h2 = driver.find_element(By.CLASS_NAME, 'someclass')
h2 = driver.find_element(By.XPATH, '//h2')
h2 = driver.find_element(By.XPATH, '/html/body/h2')
h2 = driver.find_element(By.ID, 'greatID')
3
Tìm kiếm các yếu tố dựa trên tên thẻ của họ
h2 = driver.find_element(By.NAME, 'h2')
h2 = driver.find_element(By.CLASS_NAME, 'someclass')
h2 = driver.find_element(By.XPATH, '//h2')
h2 = driver.find_element(By.XPATH, '/html/body/h2')
h2 = driver.find_element(By.ID, 'greatID')
4HTML classes
h2 = driver.find_element(By.NAME, 'h2')
h2 = driver.find_element(By.CLASS_NAME, 'someclass')
h2 = driver.find_element(By.XPATH, '//h2')
h2 = driver.find_element(By.XPATH, '/html/body/h2')
h2 = driver.find_element(By.ID, 'greatID')
5
h2 = driver.find_element(By.NAME, 'h2')
h2 = driver.find_element(By.CLASS_NAME, 'someclass')
h2 = driver.find_element(By.XPATH, '//h2')
h2 = driver.find_element(By.XPATH, '/html/body/h2')
h2 = driver.find_element(By.ID, 'greatID')
6
Tìm kiếm các yếu tố dựa trên các lớp HTML của họ
h2 = driver.find_element(By.NAME, 'h2')
h2 = driver.find_element(By.CLASS_NAME, 'someclass')
h2 = driver.find_element(By.XPATH, '//h2')
h2 = driver.find_element(By.XPATH, '/html/body/h2')
h2 = driver.find_element(By.ID, 'greatID')
7CSS selector
<html>
    <head>
        ... some stuff
    </head>
    <body>
        <h2 class="someclass" id="greatID">Super title</h2>
    </body>
</html>
5
<html>
    <head>
        ... some stuff
    </head>
    <body>
        <h2 class="someclass" id="greatID">Super title</h2>
    </body>
</html>
6

<html>
    <head>
        ... some stuff
    </head>
    <body>
        <h2 class="someclass" id="greatID">Super title</h2>
    </body>
</html>
7

Tìm kiếm các phần tử neo dựa trên sự phù hợp của nội dung văn bản của họ

<html>
    <head>
        ... some stuff
    </head>
    <body>
        <h2 class="someclass" id="greatID">Super title</h2>
    </body>
</html>
8

<html>
    <head>
        ... some stuff
    </head>
    <body>
        <h2 class="someclass" id="greatID">Super title</h2>
    </body>
</html>

<html>
    <head>
        ... some stuff
    </head>
    <body>
        <h2 class="someclass" id="greatID">Super title</h2>
    </body>
</html>
9

h2 = driver.find_element(By.NAME, 'h2')
h2 = driver.find_element(By.CLASS_NAME, 'someclass')
h2 = driver.find_element(By.XPATH, '//h2')
h2 = driver.find_element(By.XPATH, '/html/body/h2')
h2 = driver.find_element(By.ID, 'greatID')

h2 = driver.find_element(By.NAME, 'h2')
h2 = driver.find_element(By.CLASS_NAME, 'someclass')
h2 = driver.find_element(By.XPATH, '//h2')
h2 = driver.find_element(By.XPATH, '/html/body/h2')
h2 = driver.find_element(By.ID, 'greatID')
0

all_links = driver.find_elements(By.TAG_NAME, 'a')

Tìm kiếm các phần tử neo dựa trên một chuỗi phụ của nội dung văn bản của họ

h2 = driver.find_element(By.NAME, 'h2')
h2 = driver.find_element(By.CLASS_NAME, 'someclass')
h2 = driver.find_element(By.XPATH, '//h2')
h2 = driver.find_element(By.XPATH, '/html/body/h2')
h2 = driver.find_element(By.ID, 'greatID')
2

h2 = driver.find_element(By.NAME, 'h2') h2 = driver.find_element(By.CLASS_NAME, 'someclass') h2 = driver.find_element(By.XPATH, '//h2') h2 = driver.find_element(By.XPATH, '/html/body/h2') h2 = driver.find_element(By.ID, 'greatID') 3

Tìm kiếm các yếu tố dựa trên tên thẻ của họ

h2 = driver.find_element(By.NAME, 'h2')
h2 = driver.find_element(By.CLASS_NAME, 'someclass')
h2 = driver.find_element(By.XPATH, '//h2')
h2 = driver.find_element(By.XPATH, '/html/body/h2')
h2 = driver.find_element(By.ID, 'greatID')
4

  • h2 = driver.find_element(By.NAME, 'h2')
    h2 = driver.find_element(By.CLASS_NAME, 'someclass')
    h2 = driver.find_element(By.XPATH, '//h2')
    h2 = driver.find_element(By.XPATH, '/html/body/h2')
    h2 = driver.find_element(By.ID, 'greatID')
    
    5
  • h2 = driver.find_element(By.NAME, 'h2')
    h2 = driver.find_element(By.CLASS_NAME, 'someclass')
    h2 = driver.find_element(By.XPATH, '//h2')
    h2 = driver.find_element(By.XPATH, '/html/body/h2')
    h2 = driver.find_element(By.ID, 'greatID')
    
    6
  • Tìm kiếm các yếu tố dựa trên các lớp HTML của họ
  • h2 = driver.find_element(By.NAME, 'h2')
    h2 = driver.find_element(By.CLASS_NAME, 'someclass')
    h2 = driver.find_element(By.XPATH, '//h2')
    h2 = driver.find_element(By.XPATH, '/html/body/h2')
    h2 = driver.find_element(By.ID, 'greatID')
    
    7

h2 = driver.find_element(By.NAME, 'h2')
h2 = driver.find_element(By.CLASS_NAME, 'someclass')
h2 = driver.find_element(By.XPATH, '//h2')
h2 = driver.find_element(By.XPATH, '/html/body/h2')
h2 = driver.find_element(By.ID, 'greatID')
8

<input type="hidden" id="custId" name="custId" value="">

h2 = driver.find_element(By.NAME, 'h2')
h2 = driver.find_element(By.CLASS_NAME, 'someclass')
h2 = driver.find_element(By.XPATH, '//h2')
h2 = driver.find_element(By.XPATH, '/html/body/h2')
h2 = driver.find_element(By.ID, 'greatID')
9

Tìm kiếm các yếu tố dựa trên bộ chọn CSS

Một mô tả đầy đủ về các phương pháp có thể được tìm thấy ở đây.

Find_element ví dụ

Hướng dẫn selenium scraping python - trăn cạo selen

Giả sử, chúng tôi có tài liệu HTML sau đây ....

.... và chúng tôi muốn chọn phần tử

h2 = driver.find_element(By.NAME, 'h2')
h2 = driver.find_element(By.CLASS_NAME, 'someclass')
h2 = driver.find_element(By.XPATH, '//h2')
h2 = driver.find_element(By.XPATH, '/html/body/h2')
h2 = driver.find_element(By.ID, 'greatID')
4. Ở đây, năm ví dụ sau đây sẽ giống hệt nhau trong những gì họ trở lại

  • Một ví dụ khác có thể là, để chọn tất cả các thẻ neo/liên kết trong trang. Vì chúng tôi muốn có nhiều yếu tố, chúng tôi sẽ sử dụng
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    
    options = Options()
    options.headless = True
    options.add_argument("--window-size=1920,1200")
    
    driver = webdriver.Chrome(options=options, executable_path=DRIVER_PATH)
    driver.get("https://www.nintendo.com/")
    print(driver.page_source)
    driver.quit()
    
    6 tại đây (xin lưu ý số nhiều)
  • Một số yếu tố không dễ dàng truy cập với ID hoặc một lớp đơn giản và đó là khi bạn cần biểu thức XPath. Bạn cũng có thể có nhiều yếu tố với cùng một lớp và đôi khi thậm chí ID, mặc dù phần sau được cho là duy nhất.
  • XPath là cách yêu thích của tôi để định vị các yếu tố trên một trang web. Đó là một cách mạnh mẽ để trích xuất bất kỳ yếu tố nào trên một trang, dựa trên vị trí tuyệt đối của nó trong DOM hoặc so với yếu tố khác.
  • Selenium Webelement

A

all_links = driver.find_elements(By.TAG_NAME, 'a')
4 là một đối tượng selen đại diện cho một phần tử HTML.

driver.get("https://news.ycombinator.com/login")

login = driver.find_element_by_xpath("//input").send_keys(USERNAME)
password = driver.find_element_by_xpath("//input[@type='password']").send_keys(PASSWORD)
submit = driver.find_element_by_xpath("//input[@value='login']").click()

Có nhiều hành động mà bạn có thể thực hiện trên các đối tượng đó, đây là hữu ích nhất:

Chúng tôi có thể thử một vài điều:

  • Kiểm tra thông báo lỗi (như "sai mật khẩu")
  • Kiểm tra một phần tử trên trang chỉ được hiển thị khi đăng nhập.

Vì vậy, chúng tôi sẽ kiểm tra nút Đăng xuất. Nút Đăng xuất có ID

<input type="hidden" id="custId" name="custId" value="">
7 (dễ dàng)!

Chúng ta không thể kiểm tra xem phần tử là

<input type="hidden" id="custId" name="custId" value="">
8 vì
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.headless = True
options.add_argument("--window-size=1920,1200")

driver = webdriver.Chrome(options=options, executable_path=DRIVER_PATH)
driver.get("https://www.nintendo.com/")
print(driver.page_source)
driver.quit()
5 sẽ tăng một ngoại lệ, nếu phần tử không được tìm thấy trong DOM. Vì vậy, chúng tôi phải sử dụng thử/ngoại trừ khối và bắt được ngoại lệ
driver.get("https://news.ycombinator.com/login")

login = driver.find_element_by_xpath("//input").send_keys(USERNAME)
password = driver.find_element_by_xpath("//input[@type='password']").send_keys(PASSWORD)
submit = driver.find_element_by_xpath("//input[@value='login']").click()
0:

# dont forget from selenium.common.exceptions import NoSuchElementException
try:
    logout_button = driver.find_element_by_id("logout")
    print('Successfully logged in')
except NoSuchElementException:
    print('Incorrect login/password')

Rực rỡ, làm việc.

Chụp ảnh màn hình

Vẻ đẹp của các phương pháp tiếp cận trình duyệt, như selenium, là chúng tôi không chỉ lấy dữ liệu và cây Dom, mà là - là một trình duyệt - nó còn hiển thị đúng và hoàn toàn hiển thị toàn bộ trang. Điều này, tất nhiên, cũng cho phép ảnh chụp màn hình và selen được chuẩn bị đầy đủ ở đây.

driver.save_screenshot('screenshot.png')

Hướng dẫn selenium scraping python - trăn cạo selen

Một cuộc gọi duy nhất và chúng tôi có một ảnh chụp màn hình của trang của chúng tôi. Bây giờ, nếu điều đó không tuyệt!

Xin lưu ý, một vài điều vẫn có thể sai hoặc cần điều chỉnh, khi bạn chụp ảnh màn hình với selen. Đầu tiên, bạn phải đảm bảo rằng kích thước cửa sổ được đặt chính xác. Sau đó, bạn cần đảm bảo rằng mọi cuộc gọi HTTP không đồng bộ được thực hiện bởi mã JavaScript Frontend đã kết thúc và trang được hiển thị hoàn toàn.

Trong trường hợp tin tức tin tức của chúng tôi, nó rất đơn giản và chúng tôi không phải lo lắng về những vấn đề này.

Bạn có biết, ScrapingBee cung cấp API ảnh chụp màn hình chuyên dụng không? Điều đó đặc biệt thuận tiện, khi bạn muốn chụp ảnh màn hình ở quy mô. Không có gì Cozier hơn là gửi các yêu cầu ảnh chụp màn hình của bạn đến API và ngồi lại và thưởng thức một ca cao nóng.screenshots at scale. Nothing cosier than sending your screenshot requests to the API and sit back and enjoy a hot cocoa ☕.

Chờ đợi một yếu tố có mặt

Xử lý một trang web sử dụng nhiều JavaScript để hiển thị nội dung của nó có thể là khó khăn. Ngày nay, ngày càng có nhiều trang web sử dụng các khung như Angular, React và Vue.js cho mặt trước của chúng. Các khung phía trước này rất phức tạp để đối phó vì chúng không chỉ phục vụ mã HTML, nhưng bạn có một bộ mã JavaScript khá phức tạp có liên quan, điều này thay đổi cây Dom trên đường và gửi nhiều thông tin không đồng bộ trong Bối cảnh thông qua Ajax.

Điều đó có nghĩa là, chúng tôi không thể gửi một yêu cầu và ngay lập tức xóa dữ liệu, nhưng chúng tôi có thể phải đợi cho đến khi JavaScript hoàn thành công việc của mình. Thông thường có hai cách để tiếp cận điều đó:

  • Sử dụng
    driver.get("https://news.ycombinator.com/login")
    
    login = driver.find_element_by_xpath("//input").send_keys(USERNAME)
    password = driver.find_element_by_xpath("//input[@type='password']").send_keys(PASSWORD)
    submit = driver.find_element_by_xpath("//input[@value='login']").click()
    
    1 trước khi chụp ảnh màn hình.
  • Sử dụng một đối tượng
    driver.get("https://news.ycombinator.com/login")
    
    login = driver.find_element_by_xpath("//input").send_keys(USERNAME)
    password = driver.find_element_by_xpath("//input[@type='password']").send_keys(PASSWORD)
    submit = driver.find_element_by_xpath("//input[@value='login']").click()
    
    2.

Nếu bạn sử dụng

driver.get("https://news.ycombinator.com/login")

login = driver.find_element_by_xpath("//input").send_keys(USERNAME)
password = driver.find_element_by_xpath("//input[@type='password']").send_keys(PASSWORD)
submit = driver.find_element_by_xpath("//input[@value='login']").click()
1, bạn sẽ phải sử dụng độ trễ hợp lý nhất cho trường hợp sử dụng của bạn. Vấn đề là, bạn đang chờ quá lâu hoặc không đủ dài và cũng không lý tưởng. Ngoài ra, trang web có thể tải chậm hơn trên kết nối ISP dân cư của bạn so với khi mã của bạn đang chạy trong sản xuất trong một trung tâm dữ liệu. Với
driver.get("https://news.ycombinator.com/login")

login = driver.find_element_by_xpath("//input").send_keys(USERNAME)
password = driver.find_element_by_xpath("//input[@type='password']").send_keys(PASSWORD)
submit = driver.find_element_by_xpath("//input[@value='login']").click()
2, bạn không thực sự phải tính đến điều đó. Nó sẽ chỉ chờ đợi miễn là cần thiết cho đến khi phần tử mong muốn hiển thị (hoặc nó đạt thời gian chờ).

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.headless = True
options.add_argument("--window-size=1920,1200")

driver = webdriver.Chrome(options=options, executable_path=DRIVER_PATH)
0

Điều này sẽ đợi cho đến khi phần tử có ID HTML

driver.get("https://news.ycombinator.com/login")

login = driver.find_element_by_xpath("//input").send_keys(USERNAME)
password = driver.find_element_by_xpath("//input[@type='password']").send_keys(PASSWORD)
submit = driver.find_element_by_xpath("//input[@value='login']").click()
5 xuất hiện hoặc thời gian chờ của năm giây đã đạt được. Có khá nhiều loại điều kiện ngoại trừ khác:

  • driver.get("https://news.ycombinator.com/login")
    
    login = driver.find_element_by_xpath("//input").send_keys(USERNAME)
    password = driver.find_element_by_xpath("//input[@type='password']").send_keys(PASSWORD)
    submit = driver.find_element_by_xpath("//input[@value='login']").click()
    
    6
  • driver.get("https://news.ycombinator.com/login")
    
    login = driver.find_element_by_xpath("//input").send_keys(USERNAME)
    password = driver.find_element_by_xpath("//input[@type='password']").send_keys(PASSWORD)
    submit = driver.find_element_by_xpath("//input[@value='login']").click()
    
    7
  • driver.get("https://news.ycombinator.com/login")
    
    login = driver.find_element_by_xpath("//input").send_keys(USERNAME)
    password = driver.find_element_by_xpath("//input[@type='password']").send_keys(PASSWORD)
    submit = driver.find_element_by_xpath("//input[@value='login']").click()
    
    8
  • driver.get("https://news.ycombinator.com/login")
    
    login = driver.find_element_by_xpath("//input").send_keys(USERNAME)
    password = driver.find_element_by_xpath("//input[@type='password']").send_keys(PASSWORD)
    submit = driver.find_element_by_xpath("//input[@value='login']").click()
    
    9

Tất nhiên, một danh sách đầy đủ các sự chờ đợi và các điều kiện dự kiến ​​của nó có thể được tìm thấy trong tài liệu của selen.

Nhưng, có một công cụ trình duyệt đầy đủ theo ý của chúng tôi, không chỉ có nghĩa là chúng ta có thể, ít nhiều, dễ dàng xử lý mã JavaScript do trang web chạy, điều đó cũng có nghĩa là chúng ta có khả năng chạy JavaScript tùy chỉnh của riêng mình. Hãy kiểm tra điều đó tiếp theo.

Thực hiện JavaScript

Cũng giống như với ảnh chụp màn hình, chúng tôi có thể sử dụng đầy đủ công cụ JavaScript của trình duyệt. Điều đó có nghĩa là, chúng ta có thể tiêm và thực thi mã tùy ý và chạy nó trong bối cảnh của trang web. Bạn muốn chụp ảnh màn hình của một phần nằm ở một chút trên trang? Dễ dàng,

# dont forget from selenium.common.exceptions import NoSuchElementException
try:
    logout_button = driver.find_element_by_id("logout")
    print('Successfully logged in')
except NoSuchElementException:
    print('Incorrect login/password')
0 và
# dont forget from selenium.common.exceptions import NoSuchElementException
try:
    logout_button = driver.find_element_by_id("logout")
    print('Successfully logged in')
except NoSuchElementException:
    print('Incorrect login/password')
1 giúp bạn được bảo hiểm.

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.headless = True
options.add_argument("--window-size=1920,1200")

driver = webdriver.Chrome(options=options, executable_path=DRIVER_PATH)
1

Hoặc bạn muốn làm nổi bật tất cả các thẻ neo bằng đường viền? Miếng bánh 🍰

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.headless = True
options.add_argument("--window-size=1920,1200")

driver = webdriver.Chrome(options=options, executable_path=DRIVER_PATH)
2

Một lợi ích bổ sung của

# dont forget from selenium.common.exceptions import NoSuchElementException
try:
    logout_button = driver.find_element_by_id("logout")
    print('Successfully logged in')
except NoSuchElementException:
    print('Incorrect login/password')
1 là, nó trả về giá trị của biểu thức bạn đã vượt qua. Nói tóm lại, mã sau sẽ chuyển tiêu đề tài liệu của chúng tôi thẳng đến biến
# dont forget from selenium.common.exceptions import NoSuchElementException
try:
    logout_button = driver.find_element_by_id("logout")
    print('Successfully logged in')
except NoSuchElementException:
    print('Incorrect login/password')
3 của chúng tôi.

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.headless = True
options.add_argument("--window-size=1920,1200")

driver = webdriver.Chrome(options=options, executable_path=DRIVER_PATH)
3

Không tệ, phải không?

Có thể trả về giá trị,

# dont forget from selenium.common.exceptions import NoSuchElementException
try:
    logout_button = driver.find_element_by_id("logout")
    print('Successfully logged in')
except NoSuchElementException:
    print('Incorrect login/password')
1 là đồng bộ trong tự nhiên. Nếu bạn không cần phải chờ một giá trị, tất nhiên, bạn cũng có thể sử dụng đối tác không đồng bộ
# dont forget from selenium.common.exceptions import NoSuchElementException
try:
    logout_button = driver.find_element_by_id("logout")
    print('Successfully logged in')
except NoSuchElementException:
    print('Incorrect login/password')
5 của nó.

Sử dụng proxy với dây selen

Thật không may, xử lý proxy Selenium là khá cơ bản. Ví dụ, nó không thể xử lý xác thực proxy ra khỏi hộp.

Để giải quyết vấn đề này, bạn có thể sử dụng dây selen. Gói này mở rộng các ràng buộc của Selenium và cho phép bạn truy cập vào tất cả các yêu cầu cơ bản do trình duyệt thực hiện. Nếu bạn cần sử dụng selenium với proxy với xác thực thì đây là gói bạn cần.

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.headless = True
options.add_argument("--window-size=1920,1200")

driver = webdriver.Chrome(options=options, executable_path=DRIVER_PATH)
4

Đoạn mã này chỉ cho bạn cách nhanh chóng sử dụng trình duyệt không đầu của bạn phía sau proxy.

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.headless = True
options.add_argument("--window-size=1920,1200")

driver = webdriver.Chrome(options=options, executable_path=DRIVER_PATH)
5

Chặn hình ảnh và javascript

Có toàn bộ tập hợp các tính năng trình duyệt tiêu chuẩn trong đầu ngón tay của chúng tôi, thực sự đưa cào lên cấp độ tiếp theo. Chúng tôi có các trang được hiển thị đầy đủ, cho phép chúng tôi chụp ảnh màn hình, JavaScript của trang web được thực hiện đúng trong bối cảnh phù hợp và hơn thế nữa.

Tuy nhiên, đôi khi, chúng tôi thực sự không cần tất cả các tính năng này. Ví dụ: nếu chúng ta không chụp ảnh màn hình, có rất ít điểm trong việc tải xuống tất cả các hình ảnh. May mắn thay, Selenium và WebDriver cũng đã bảo vệ chúng tôi ở đây.

Bạn có nhớ lớp

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.headless = True
options.add_argument("--window-size=1920,1200")

driver = webdriver.Chrome(options=options, executable_path=DRIVER_PATH)
7 từ trước không? Lớp đó cũng chấp nhận một đối tượng Tùy chọn, trong đó có thể kích hoạt và tắt các tính năng riêng lẻ. Ví dụ: nếu chúng tôi muốn vô hiệu hóa việc tải hình ảnh và thực hiện mã JavaScript, chúng tôi sẽ sử dụng các tùy chọn sau:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.headless = True
options.add_argument("--window-size=1920,1200")

driver = webdriver.Chrome(options=options, executable_path=DRIVER_PATH)
6

Sự kết luận

Tôi hy vọng bạn thích bài viết trên blog này! Bây giờ bạn nên có một sự hiểu biết tốt về cách API Selenium hoạt động trong Python. Nếu bạn muốn biết thêm về cách cạo web với Python, đừng ngần ngại xem hướng dẫn cào web Python chung của chúng tôi.

Một bài đọc thú vị khác là hướng dẫn của chúng tôi về Puppeteer với Python. Puppeteer là API để kiểm soát Chrome, nó khá mạnh hơn Selenium (nó được duy trì trực tiếp bởi nhóm Google).

Selenium thường là cần thiết để trích xuất dữ liệu từ các trang web bằng nhiều JavaScript. Vấn đề là việc chạy nhiều trường hợp chrome selen/không đầu ở quy mô là khó khăn. Đây là một trong những điều chúng tôi giải quyết với ScrapingBee, API quét web của chúng tôi. API của chúng tôi là một nền tảng xẹp SaaS, cho phép dễ dàng mở rộng quy mô các công việc thu thập thông tin của bạn nhưng cũng biết cách xử lý các chủ đề liên quan đến các loại bỏ các chủ đề liên quan khác, như proxy và quản lý kết nối và yêu cầu điều chỉnh.

Selenium cũng là một công cụ tuyệt vời để tự động hóa hầu hết mọi thứ trên web.

Nếu bạn thực hiện các tác vụ lặp đi lặp lại, như điền vào các biểu mẫu hoặc kiểm tra thông tin đằng sau biểu mẫu đăng nhập nơi trang web không có API, có lẽ nên tự động hóa nó bằng selenium, hãy đừng quên truyện tranh XKCD này:

Hướng dẫn selenium scraping python - trăn cạo selen