Các trang web cạo trong python có thể giúp bạn tiết kiệm rất nhiều thời gian và có thể khá đơn giản khi cấu trúc trang nhất quán. Tuy nhiên, bạn sẽ làm gì khi thông tin bạn cần cạo nằm sau đường dẫn đăng nhập nơi bạn cần nhập tên người dùng và mật khẩu trước?
Bài viết này sử dụng selen để thực hiện quét web. Nó chậm hơn một chút so với việc sử dụng mô-đun request hoặc urllib, tuy nhiên có một lợi thế lớn đó là Selenium sử dụng một trình duyệt thực. Vì vậy, nếu máy chủ trang web đang kiểm tra xem yêu cầu web có đến từ người thật hay không, thì sẽ ít có khả năng nó bị từ chối nếu bạn sử dụng Selenium. Ví dụ: nếu bạn sử dụng mô-đun yêu cầu, các tiêu đề bình thường được bao gồm khi người dùng thực sử dụng trình duyệt [e. g. phiên bản trình duyệt, ngôn ngữ, v.v.] sẽ không có ở đó
Các nguyên tắc cơ bản về quét web với python
Bạn có thể đọc về các nguyên tắc cơ bản của việc quét web từ bài viết 'dò web bằng Selenium' của chúng tôi. Tại sao selen? . Điều này giúp giảm thiểu và chặn kiểm tra rô-bốt
Một ví dụ đơn giản về quét web để bắt đầu với
Hãy bắt đầu với một ví dụ thu thập nhanh để thu thập danh sách các tiêu đề blog từ trang web của chính chúng ta. PythonHowToChương trình
Để sử dụng selen [xem hướng dẫn đầy đủ về selen trong python tại đây], bạn cần mô phỏng trình duyệt. Để mô phỏng trình duyệt, bạn cần cài đặt trình điều khiển trình duyệt
Nhắc nhanh… Cần có trình điều khiển web, nếu bạn đã nhớ nơi lưu trữ, nếu bạn chưa có, hãy tải xuống dựa trên bảng sau
Trình duyệtHệ điều hành được hỗ trợĐược duy trì bởi Trình theo dõi sự cố tải xuốngChromium/ChromeWindows/macOS/LinuxGoogleCác sự cố tải xuốngFirefoxWindows/macOS/LinuxMozillaTải xuốngcác sự cốEdgeWindows 10MicrosoftDownloadsCác sự cốInternet ExplorerWindowsSelenium ProjectCác sự cố Tải xuốngcác sự cốSafarimacOS El Capitan và mới hơnAppleCác sự cố tích hợp sẵnOperaWindows/macOS/LinuxOperaCác sự cố tải xuốngHãy bắt đầu tạo một tệp main.py
sẽ chứa tất cả mã cần thiết để liệt kê các tiêu đề của blog python
Khi bạn đã lưu trình điều khiển web trên máy tính của mình, bạn đã sẵn sàng viết mã. Như một bản tóm tắt nhanh về cách thực hiện quét web đơn giản, đoạn mã sau sẽ liệt kê một số tiêu đề blog từ pythonhowtoprogram. com
# main.py
from selenium import webdriver
# Web driver path
WEBDRIVER_PATH = './'
# Web driver declaration
driver = webdriver.Firefox[WEBDRIVER_PATH]
# Website to scrap
URL = '//pythonhowtoprogram.com/'
# Web driver going into website
driver.get[URL]
# Getting all alrticules into an array
articles = driver.find_elements_by_css_selector['article.article-card']
# Navagating into articules
for article in articles:
# Getting each articule header
header = article.find_element_by_css_selector['header']
# Getting articule title
title = header.find_element_by_css_selector['a']
# Printing each articule title
print[title.text]
# close the webdriver
driver.quit[]
Đoạn mã trên sẽ trả về một danh sách các tiêu đề blog từ pythonhowtoprogram. com. Trong trường hợp cụ thể này, trình duyệt web trước tiên sẽ mở một cửa sổ và điều hướng đến trang web. Tiếp theo, trang web chứa phần các bài đăng gần đây chứa danh sách tiêu đề, mã lưu trữ phần này thành một mảng và đi đến từng blog thu thập tiêu đề và in nội dung của nó trên thiết bị đầu cuối. Kết quả sẽ tương tự như các hình ảnh sau
Sau khi bạn biết cách thực hiện một số thao tác quét web cơ bản, bạn đã sẵn sàng thử các trang web có thông tin đăng nhập
Đăng nhập vào một trang web
Giả sử bạn muốn biết bạn đã chơi bao nhiêu ván cờ vua và chi tiết về số ván thua và thắng trên tài khoản của bạn tại www. cờ vua. com. Để đạt được điều này, bạn có thể tạo một tệp có tên mychess.py
sẽ chứa mã sau
# mychess.py
from selenium import webdriver
# Web driver path
WEBDRIVER_PATH = './'
# Web driver declaration
driver = webdriver.Firefox[WEBDRIVER_PATH]
# Create a payload with the credentials
payload = {'username':'[YOUR_USERNAME]',
'password':'[YOUR_PASSWORD]'
}
# Website with login
URL = '//www.chess.com/login'
# Web driver going into website
driver.get[URL]
# Create a variable so you are able to check if login was successful
login_title = driver.title
# Sending credentials
driver.find_element_by_id['username'].send_keys[payload['username']]
driver.find_element_by_id['password'].send_keys[payload['password']]
driver.find_element_by_id['login'].click[]
#Check login
if login_title == driver.title:
print["Login failed"]
Có thể thấy, bước đầu tiên là vào trang đăng nhập. Tiếp theo, các trường tên người dùng và mật khẩu được định vị bằng chức năng “find_element_by_id[]”. Khi bạn đến đây, bạn có thể kiểm tra xem đăng nhập đã được thực hiện thành công hay chưa với tiêu đề. Nếu tiêu đề [từ trình điều khiển trường. title] đã thay đổi sau khi thử đăng nhập thì đăng nhập thành công
Nếu bạn gặp lỗi này, điều đó có nghĩa là thông tin đăng nhập được sử dụng không chính xác, vì vậy bạn có thể thử lại hoặc thậm chí đóng ứng dụng. Trong trường hợp này, nếu đăng nhập không thành công, mã sẽ chuyển thẳng đến driver.close[]
và kết thúc quá trình thực thi ứng dụng
Mặt khác, nếu quá trình đăng nhập được thực hiện mà không có bất kỳ lỗi nào thì tiêu đề đã được thay đổi nghĩa là bạn hiện có thể thu thập dữ liệu mà mình đang tìm kiếm. Vì vậy, điều này sẽ đạt được với đoạn mã sau
# mychess.py
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# Web driver path
WEBDRIVER_PATH = './'
# Web driver declaration
driver = webdriver.Firefox[WEBDRIVER_PATH]
# Create a payload with the credentials
payload = {'username':'[YOUR_USERNAME]',
'password':'[YOUR_PASSWORD]'
}
# Website with login
LOGIN = '//www.chess.com/login'
# Web driver going into website
driver.get[LOGIN]
# create a variable so you are able to check if login was successful
login_title = driver.title
# Sending credentials
driver.find_element_by_id['username'].send_keys[payload['username']]
driver.find_element_by_id['password'].send_keys[payload['password']]
driver.find_element_by_id['login'].click[]
#Check login
if login_title == driver.title:
print["Login failed"]
else:
STATS = f"//www.chess.com/stats/live/rapid/{payload['username']}"
driver.get[STATS]
total = WebDriverWait[driver, 10].until[EC.presence_of_element_located[[By.CSS_SELECTOR, "div.game-iconBlock:nth-child[2] > div:nth-child[2]"]]]
won = WebDriverWait[driver, 10].until[EC.presence_of_element_located[[By.CSS_SELECTOR, "div.tricolor-bar-header:nth-child[1] > span:nth-child[1] > div:nth-child[1]"]]]
lost = WebDriverWait[driver, 10].until[EC.presence_of_element_located[[By.CSS_SELECTOR, "div.tricolor-bar-header:nth-child[1] > span:nth-child[2] > div:nth-child[1]"]]]
print['Games: ' + total.text]
print['Won: ' + won.text]
print['Lost: ' + lost.text]
#close the webdriver
driver.quit[]
Khi bạn đã đăng nhập bằng thông tin đăng nhập của mình, trình điều khiển web sẽ hiển thị nội dung trang web và bạn có thể tự do điều hướng qua nội dung đó, vì vậy hãy điều hướng và đếm số trận đã chơi cũng như số trận thua và số trận thắng
# mychess.py
from selenium import webdriver
# New imports needed, in order to wait for the content to be ready
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# Web driver path
WEBDRIVER_PATH = './'
# Web driver declaration
driver = webdriver.Firefox[WEBDRIVER_PATH]
# Create a payload with the credentials
payload = {'username':'[YOUR_USERNAME]',
'password':'[YOUR_PASSWORD]'
}
# Website with login
LOGIN = '//www.chess.com/login'
# Web driver going into website
driver.get[LOGIN]
# Sending credentials
driver.find_element_by_id['username'].send_keys[payload['username']]
driver.find_element_by_id['password'].send_keys[payload['password']]
driver.find_element_by_id['login'].click[]
# Declare the new page
STATS = f"//www.chess.com/stats/live/rapid/{payload['username']}"
# Navigate into the page
driver.get[STATS]
# Search for each element containing the information needed
total = WebDriverWait[driver, 10].until[EC.presence_of_element_located[[By.CSS_SELECTOR, "div.game-iconBlock:nth-child[2] > div:nth-child[2]"]]]
won = WebDriverWait[driver, 10].until[EC.presence_of_element_located[[By.CSS_SELECTOR, "div.tricolor-bar-header:nth-child[1] > span:nth-child[1] > div:nth-child[1]"]]]
lost = WebDriverWait[driver, 10].until[EC.presence_of_element_located[[By.CSS_SELECTOR, "div.tricolor-bar-header:nth-child[1] > span:nth-child[2] > div:nth-child[1]"]]]
# Print all results
print['Games: ' + total.text]
print['Won: ' + won.text]
print['Lost: ' + lost.text]
#close the webdriver
driver.quit[]
Dữ liệu được thu thập sẽ được hiển thị tại thiết bị đầu cuối bảng điều khiển như trong hình trên, nó sẽ thay đổi dựa trên lịch sử của từng tài khoản
Sự kết luận
Sức mạnh của việc quét web bằng selen là vô tận và công cụ tuyệt vời này cung cấp rất nhiều cách để giải quyết mọi tác vụ. Để trích xuất dữ liệu phía sau màn hình đăng nhập, bạn có thể thực hiện các bước trên để mô phỏng quá trình đăng nhập. Khi đăng nhập đã được thực hiện, phiên sẽ hoạt động và bạn có thể tự do chạy trích xuất Selenium bình thường
Một điều cần lưu ý là phương pháp xác minh xem bạn đã đăng nhập hay chưa sẽ khác nhau giữa các trang web. Trong ví dụ này, chúng tôi đã sử dụng tiêu đề cập nhật của tài liệu để đánh giá xem đăng nhập có thành công hay không. Đối với các trang web khác, đó có thể là sự hiện diện của biểu tượng người dùng hoặc thiếu đăng nhập/đăng ký tốt hơn hoặc một loạt các chỉ số khác
Nhận thông báo tự động về bài viết mới
Tham gia Nhóm nội bộ Python và nhận các mẹo MIỄN PHÍ trong hộp thư đến của bạn
Ngoài ra, khi bạn đăng ký, chúng tôi sẽ gửi cho bạn danh sách các lớp lót python one hữu ích nhất sẽ giúp bạn tiết kiệm thời gian, làm cho mã của bạn dễ đọc hơn và bạn có thể sử dụng ngay lập tức trong mã của mình. Theo dõi danh sách email của chúng tôi và nhận danh sách ngay bây giờ