Hề lố… Như anh em thấy đấy tôi đã bỏ bê cái blog này cũng vài tháng rồi. Lý do thì đơn giản vì tôi quá lười .Nhiều bài mới viết cái tiêu đề xong vứt để đấy .Cho đến hôm nay do quá quá rảnh vì phải cách ly tại nhà nên tôi quyết tâm đăng bài trở lại .Ok vào việc !
Việc thự hiện mọi hành động một cách tự động trên một website thật sự thú vị và hữu dụng trong vài trường hợp .Ví dụ như bạn có thể thực hiện một loạt thao tác nhàm chán lặp đi lặp lại như điền form hay tự scrolling khi đọ truyện chẳng hạn. Nhiều khi bạn muốn lấy thông tin của một loạt bài viết trên một trang web. Có một công cụ rất là phổ biến sẽ giúp bạn auto nhưng hành động này là Selenium WebDriver.
Tự động hóa quá trình đăng nhập vào một trang web tỏ ra hữu ích. Ví dụ: bạn có thể muốn tự động chỉnh sửa cài đặt tài khoản của mình hoặc bạn muốn trích xuất một số thông tin yêu cầu đăng nhập, v.v.
Mục Lục
Đầu tiên, hãy cài đặt Selenium cho Python:
[code lang=”python”]
pip3 install selenium
[/code]
Tiếp theo chúng ta cần phải download ChromeDriver :
Thực ra bạn có thể sử dụng cả FireFox nhưng mình thích dùng Chrome hơn. Bạn có thể down nó tại đây. Nhớ chọn đúng version cùng với bản chrome bạn đang dùng nhé.
Để ví dụ cụ thể hơn mình sẽ login tự động login vào trang github nhé. Ok giờ tạo một file .py mới với tân bất kì và import vào những đồ ta cần dùng.
[code lang=”python”]
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
username = "username"
password = "password"
# initialize the Chrome driver
driver = webdriver.Chrome("chromedriver")
[/code]
Sau khi bạn tải xuống và giải nén , hãy đặt nó vào thư mục hiện tại của bạn. Trong trường hợp của tôi, chromedriver.exe nằm trong thư mục hiện tại, vì vậy tôi chỉ cần chuyển tên của nó cho hàm tạo.
Vì chúng ta quan tâm đến việc tự động hóa đăng nhập Github. Chúng ta sẽ điều hướng đến trang đăng nhập Github và kiểm tra trang để xác định các phần tử HTML của nó:
Ở đây chúng ta có thể thấy id của các ô input mà chúng ta vẫn nhập nó bằng tay như mọi lần. Cụ thể là ô username có id là login_field, ô password có id là password và cái nút sign in kia ko có id chúng ta có thể dùng theo name commit :
[code lang=”python”]
# head to github login page
driver.get("https://github.com/login")
# find username/email field and send the username itself to the input field
driver.find_element_by_id("login_field").send_keys(username)
# find password input field and insert password as well
driver.find_element_by_id("password").send_keys(password)
# click login button
driver.find_element_by_name("commit").click()
[/code]
Hàm find_element_by_id () truy xuất một phần tử HTML theo id của nó và phương thức send_keys () mô phỏng các lần nhấn phím, ô mã trên sẽ khiến Chrome nhập email và mật khẩu, sau đó nhấp vào nút Đăng nhập.
Điều tiếp theo cần làm là xác định xem đăng nhập của chúng ta có thành công hay không.
Có rất nhiều cách để phát hiện điều đó, nhưng trong hướng dẫn này, chúng ta sẽ thực hiện bằng cách phát hiện các lỗi hiển thị khi đăng nhập.
Như ta thấy điều gì sẽ xảy ra khi chúng ta chèn sai thông tin đăng nhập, bạn sẽ thấy một phần tử div HTML mới với class
1 | "<span style="color: #ff6600;">flash-error</span>" |
có nội dung là “Tên người dùng hoặc mật khẩu không chính xác”.
Đoạn mã dưới đây chịu trách nhiệm đợi trang được tải sau khi thực hiện đăng nhập bằng WebDriverWait () và kiểm tra lỗi:
[code lang=”python”]
# wait the ready state to be complete
WebDriverWait(driver=driver, timeout=10).until(
lambda x: x.execute_script("return document.readyState === ‘complete’")
)
error_message = "Incorrect username or password."
# get the errors (if there are)
errors = driver.find_elements_by_class_name("flash-error")
# print the errors optionally
# for e in errors:
# print(e.text)
# if we find that error message within errors, then login is failed
if any(error_message in e.text for e in errors):
print("[!] Login failed")
else:
print("[+] Login successful")
[/code]
Chúng ta sử dụng WebDriverWait để đợi cho đến khi web tải xong, phương thức execute_script () thực thi Javascript trong ngữ cảnh của trình duyệt, mã JS trả về document.readyState === ‘complete’ trả về True khi trang được tải và False ngược lại.
Cuối cùng, chúng tôi đóng trình trình duyệt bằng lệnh:
[code lang=”python”]
# close the driver
driver.close()
[/code]
Được rồi, bây giờ bạn đã có kỹ năng đăng nhập tự động vào trang web bạn chọn, lưu ý rằng Github sẽ chặn bạn khi bạn chạy script nhiều lần với thông tin đăng nhập sai, vì vậy hãy lưu ý điều đó.
Lưu ý rằng quá trình đăng nhập sẽ khác nhau giữa các trang web, mục tiêu của hướng dẫn này là cung cấp cho bạn các kỹ năng cần thiết để tự động đăng nhập vào trang web mục tiêu của bạn.
Full code cho bạn nào cần :
[code lang=”python”]
from logging import error
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
# Github credentials
username = "username"
password = "password"
# initialize the Chrome driver
driver = webdriver.Chrome(r"chromedriver")
# head to github login page
driver.get("https://github.com/login")
# find username/email field and send the username itself to the input field
driver.find_element_by_id("login_field").send_keys(username)
# find password input field and insert password as well
driver.find_element_by_id("password").send_keys(password)
# click login button
driver.find_element_by_name("commit").click()
# wait the ready state to be complete
WebDriverWait(driver=driver, timeout=10).until(
lambda x: x.execute_script("return document.readyState === ‘complete’")
)
error_message = "Incorrect username or password."
# get the errors (if there are)
errors = driver.find_elements_by_class_name("flash-error")
# print the errors optionally
# for e in errors:
# print(e.text)
# if we find that error message within errors, then login is failed
if any(error_message in e.text for e in errors):
print("[!] Login failed")
else:
print("[+] Login successful")
# close the driver
driver.close()
[/code]