Đây là phần 2 trong quá trình khám phá selen của tôi khi cố gắng tìm nạp các câu chuyện từ NY Times [[với tư cách là người đăng ký]
Khi chúng tôi rời đi, tôi đang học kiến thức cơ bản về Selenium để lấy các câu chuyện [với tư cách là người đăng ký] từ New York Times. Tìm nạp các câu chuyện đang hoạt động bình thường và tất cả những gì còn lại là đưa nó vào một tập lệnh tự động, sau đó chuyển nó đến một máy chủ nơi nó có thể chạy tự động mà không cần bật máy tính để bàn của tôi
Thật không may, điều đó hóa ra lại là phần khó khăn nhất của vấn đề
Cài đặt Selenium và Firefox mà không cần máy tính để bàn
Vấn đề là bạn cần chạy một trình duyệt hoàn chỉnh [tôi đang sử dụng Firefox] trên web hoặc máy chủ tệp không cài đặt X hoặc máy tính để bàn
Nếu bạn chỉ apt install python3-selenium firefox-esr
[hoặc tương đương cho bản phân phối của bạn; firefox-esr là Bản phát hành hỗ trợ mở rộng, gói Firefox duy nhất trong kho Debian tiêu chuẩn. nó ổn định hơn một chút so với Firefox tiên tiến và thay đổi ít thường xuyên hơn] và cho phép cài đặt 156 gói kết quả. Nhưng tôi muốn giữ cho các máy chủ gọn gàng nhất có thể, chỉ cài đặt những gói tôi thực sự cần
Nó giúp khá nhiều để tắt các gói được đề xuất và đề xuất. apt install --no-install-recommends --no-install-suggests python3-selenium
đưa số lượng gói mới được cài đặt xuống còn 31
Hoặc bạn có thể tải Firefox từ mozilla. org [bản phát hành ESR là]. Tất nhiên, bạn vẫn sẽ cần những phần phụ thuộc khác, bao gồm X11 [mặc dù bạn sẽ không chạy máy chủ X] cùng với các thư viện như GTK;
Bạn cũng sẽ cần geckodriver, thứ mà Firefox cần để chạy không đầu. Ubuntu có gói firefox-geckodriver, nhưng Debian thì không -- mặc dù cài đặt Selenium trên Debian gợi ý cài đặt firefoxdriver, hóa ra nó không tồn tại. Nếu máy chủ của bạn không có gói geckodriver, bạn có thể lấy nó từ github của Mozilla. github. com/mozilla/geckodriver/bản phát hành. Thật kỳ lạ là nó chỉ có sẵn từ github, không có ở đâu trên mozilla. org, với điều kiện là Mozilla thường thậm chí không sử dụng git [họ sử dụng Mercurial làm hệ thống kiểm soát phiên bản của họ], nhưng bạn đã làm được
Các tarball từ liên kết github đó trích xuất thành một tệp thực thi duy nhất. Tôi đã chuyển tệp thực thi đó vào thư mục mà tôi đã cài đặt Firefox, ~/firefox-esr, để tôi có thể thêm thư mục đó vào PATH của mình. Selenium cho phép bạn chỉ định đường dẫn đến tệp thực thi của geckodriver, nhưng sau đó geckodriver sẽ không thể tìm thấy Firefox trừ khi nó ở đâu đó trong PATH của bạn. Dễ dàng nhất để đảm bảo cả hai đều đi đúng hướng
Thiết lập môi trường X ảo
Như đã đề cập trước đó, bạn sẽ cần cài đặt máy chủ X mặc dù bạn sẽ không chạy nó một cách tương tác, cùng với một số thư viện khác như GTK
Đối với Firefox-ESR từ Mozilla. org và geckodriver từ github, đây là những gì tôi cần
apt install --no-install-recommends --no-install-suggests \ xvfb python3-xvfbwrapper libgtk-3-0 libdbus-glib-1-2
Điều này kéo theo tổng cộng 61 gói, 51 trong số đó có liên quan đến libgtk-3. 0
Kiểm tra Firefox và tạo một hồ sơ
Bây giờ về mặt lý thuyết bạn có đủ để chạy Mozilla. Để đảm bảo nó chạy, bạn cần có khả năng hiển thị các máy khách X. Cách dễ nhất là ssh -X
từ một máy khác đến máy chủ của bạn với tư cách là người dùng mà bạn định sử dụng cho Selenium và xác minh rằng Firefox chạy và có thể tạo một cấu hình mới
localhost% ssh -X user@servername servername% cd firefox-esr servername% ./firefox -p
-p yêu cầu firefox khởi động trình quản lý hồ sơ để bạn có thể tạo hồ sơ mới
Ban đầu tôi dự định sao chép hồ sơ Selenium/NYT từ máy tính để bàn của mình, nhưng điều đó không hiệu quả vì các phiên bản Firefox quá khác nhau
Tôi đặt tên cho hồ sơ mới là "selenium";
Khi hồ sơ mới của bạn được tạo, bạn có thể chạy hồ sơ đó từ trình quản lý hồ sơ hoặc khởi động firefox với firefox -P selenium
Bây giờ, giả sử cả firefox và geckodriver đều nằm trong PATH của bạn, bạn có thể chạy các tập lệnh Selenium tự động
from selenium import webdriver from selenium.webdriver.firefox.options import Options import os foxprofiledir = os.path.expanduser["~/.mozilla/firefox/random-string.selenium"] options = Options[] options.headless = True webdriver = webdriver.Firefox[firefox_profile=foxprofiledir, options=options][Điều này vẫn sẽ cung cấp cho
DeprecationWarning: firefox_profile has been deprecated, please pass in a Service object
được đề cập trong bài báo trước. ]Đặt tệp nhật ký ở đâu đó hợp lý
Một điều nữa. con tắc kè tạo một tệp nhật ký chi tiết có tên là con tắc kè. nhật ký chứa tất cả các cảnh báo mà Firefox đã tạo ra trong quá trình chạy, chủ yếu là hàng trăm dòng cảnh báo JavaScript từ các tập lệnh được viết kém. Nó tạo nhật ký này trong thư mục hiện tại. Nếu tập lệnh Selenium của bạn chạy từ một thư mục mà người dùng của bạn không thể ghi, toàn bộ quá trình sẽ không thành công. Vì vậy, hãy chọn một nơi nào đó mà bạn muốn ghi nhật ký, chẳng hạn như /tmp/geckodriver. log nếu bạn không có vị trí tốt hơn cho nó và chỉ định điều đó khi bạn tạo webdriver
webdriver = webdriver.Firefox[firefox_profile=foxprofiledir, options=options, service_log_path=path_to_log_file]
Cùng với đó, tập lệnh Selenium của bạn có thể chạy không đầu trên máy chủ
Nhưng còn một mảnh nữa. nếu mã chạy không giám sát, nó cần xử lý lỗi và hết thời gian chờ. Và đó là một khía cạnh của selen dường như không hoạt động tốt và không được ghi chép đầy đủ, vì vậy tôi đã tích lũy một bộ sưu tập các kỹ thuật hack để giải quyết vấn đề này. Tôi sẽ mô tả những điều đó trong bài viết tiếp theo