Python có thể tương tác với HTML không?

Vấn đề. Nộp bài tập cho lớp đòi hỏi phải điều hướng trong một mê cung các trang web phức tạp đến mức nhiều lần tôi đã nộp bài tập sai vị trí. Ngoài ra, mặc dù quá trình này chỉ mất 1–2 phút, nhưng đôi khi nó giống như một rào cản không thể vượt qua [chẳng hạn như khi tôi hoàn thành bài tập quá muộn vào ban đêm và tôi hầu như không nhớ được mật khẩu của mình]

Dung dịch. Sử dụng Python để tự động gửi bài tập đã hoàn thành. Lý tưởng nhất là tôi có thể lưu bài tập, nhập một vài phím và tải bài làm của mình lên chỉ trong vài giây. Lúc đầu, điều này nghe có vẻ quá tốt để trở thành sự thật, nhưng sau đó tôi phát hiện ra Selenium, một công cụ có thể được sử dụng với Python để điều hướng trang web cho bạn

XKCD bắt buộc

Bất cứ khi nào chúng tôi thấy mình lặp lại các thao tác tẻ nhạt trên web với cùng một trình tự các bước, đây là cơ hội tuyệt vời để viết chương trình tự động hóa quy trình cho chúng tôi. Với Selenium và Python, chúng ta chỉ cần viết một tập lệnh một lần, sau đó chúng ta có thể chạy tập lệnh đó nhiều lần và tránh lặp lại các tác vụ đơn điệu [và trong trường hợp của tôi, loại bỏ khả năng gửi bài tập không đúng chỗ]

Sau đây, tôi sẽ hướng dẫn giải pháp mà tôi đã phát triển để gửi bài tập của mình một cách tự động [và chính xác]. Đồng thời, chúng ta sẽ đề cập đến những kiến ​​thức cơ bản về cách sử dụng Python và selen để điều khiển web theo chương trình. Trong khi chương trình này hoạt động [tôi đang sử dụng nó hàng ngày. ] nó khá tùy chỉnh nên bạn sẽ không thể sao chép và dán mã cho ứng dụng của mình. Tuy nhiên, các kỹ thuật chung ở đây có thể được áp dụng cho vô số tình huống. [Nếu bạn muốn xem mã hoàn chỉnh, nó có sẵn trên GitHub]

Cách tiếp cận

Trước khi chúng ta có thể đi đến phần thú vị của việc tự động hóa web, chúng ta cần tìm ra cấu trúc chung của giải pháp của chúng ta. Nhảy ngay vào lập trình mà không có kế hoạch là một cách tuyệt vời để lãng phí nhiều giờ trong sự thất vọng. Tôi muốn viết một chương trình để gửi các bài tập khóa học đã hoàn thành đến đúng vị trí trên Canvas ["hệ thống quản lý học tập" của trường đại học của tôi]. Bắt đầu với những điều cơ bản, tôi cần một cách để cho chương trình biết tên của bài tập cần nộp và lớp. Tôi đã thực hiện một cách tiếp cận đơn giản và tạo một thư mục để chứa các bài tập đã hoàn thành với các thư mục con cho mỗi lớp. Trong các thư mục con, tôi đặt tài liệu đã hoàn thành có tên cho bài tập cụ thể. Chương trình có thể tìm ra tên của lớp từ thư mục và tên của bài tập theo tiêu đề tài liệu

Đây là một ví dụ trong đó tên của lớp là EECS491 và bài tập là “Bài tập 3 - Suy luận trong các mô hình đồ họa lớn hơn”

Cấu trúc tệp [trái] và Bài tập hoàn chỉnh [phải]

Phần đầu tiên của chương trình là một vòng lặp để đi qua các thư mục để tìm bài tập và lớp mà chúng tôi lưu trữ trong một bộ Python

# os for file management
import os
# Build tuple of [class, file] to turn in
submission_dir = 'completed_assignments'
dir_list = list[os.listdir[submission_dir]]for directory in dir_list:
file_list = list[os.listdir[os.path.join[submission_dir,
directory]]]
if len[file_list] != 0:
file_tup = [directory, file_list[0]]

print[file_tup]
['EECS491', 'Assignment 3 - Inference in Larger Graphical Models.txt']

Điều này đảm nhiệm việc quản lý tệp và chương trình hiện biết chương trình và nhiệm vụ cần nộp. Bước tiếp theo là sử dụng selen để điều hướng đến đúng trang web và tải bài tập lên

Kiểm soát web với Selenium

Để bắt đầu với selen, chúng tôi nhập thư viện và tạo trình điều khiển web, đây là trình duyệt được kiểm soát bởi chương trình của chúng tôi. Trong trường hợp này, tôi sẽ sử dụng Chrome làm trình duyệt của mình và gửi trình điều khiển đến trang web Canvas nơi tôi nộp bài tập

import selenium# Using Chrome to access web
driver = webdriver.Chrome[]
# Open the website
driver.get['//canvas.case.edu']

Khi mở trang web Canvas, chúng tôi được chào đón với chướng ngại vật đầu tiên, hộp đăng nhập. Để vượt qua điều này, chúng tôi sẽ cần điền id và mật khẩu và nhấp vào nút đăng nhập

Hãy tưởng tượng trình điều khiển web là một người chưa bao giờ nhìn thấy một trang web trước đây. chúng ta cần cho nó biết chính xác nơi để bấm, gõ gì và bấm nút nào. Có một số cách để cho trình điều khiển web của chúng tôi biết những phần tử cần tìm, tất cả đều sử dụng bộ chọn. Bộ chọn là mã định danh duy nhất cho một phần tử trên trang web. Để tìm bộ chọn cho một phần tử cụ thể, giả sử hộp ID CWRU ở trên, chúng tôi cần kiểm tra trang web. Trong Chrome, điều này được thực hiện bằng cách nhấn “ctrl + shift + i” hoặc nhấp chuột phải vào bất kỳ phần tử nào và chọn “Kiểm tra”. Thao tác này sẽ hiển thị các công cụ dành cho nhà phát triển Chrome, một ứng dụng cực kỳ hữu ích hiển thị HTML bên dưới bất kỳ trang web nào

Để tìm bộ chọn cho hộp “ID CWRU”, tôi đã nhấp chuột phải vào hộp, nhấn “Kiểm tra” và thấy thông tin sau trong công cụ dành cho nhà phát triển. Dòng được đánh dấu tương ứng với phần tử hộp id [dòng này được gọi là thẻ HTML]

HTML trong công cụ dành cho nhà phát triển Chrome dành cho trang web

HTML này có thể trông choáng ngợp, nhưng chúng ta có thể bỏ qua phần lớn thông tin và tập trung vào phần

import selenium# Using Chrome to access web
driver = webdriver.Chrome[]
# Open the website
driver.get['//canvas.case.edu']
9 và
import selenium# Using Chrome to access web
driver = webdriver.Chrome[]
# Open the website
driver.get['//canvas.case.edu']
0. [chúng được gọi là thuộc tính của thẻ HTML]

Để chọn hộp id với trình điều khiển web của chúng tôi, chúng tôi có thể sử dụng thuộc tính

import selenium# Using Chrome to access web
driver = webdriver.Chrome[]
# Open the website
driver.get['//canvas.case.edu']
1 hoặc
import selenium# Using Chrome to access web
driver = webdriver.Chrome[]
# Open the website
driver.get['//canvas.case.edu']
2 mà chúng tôi tìm thấy trong các công cụ dành cho nhà phát triển. Trình điều khiển web trong Selenium có nhiều phương pháp khác nhau để chọn các thành phần trên trang web và thường có nhiều cách để chọn chính xác cùng một mục

# Select the id box
id_box = driver.find_element_by_name['username']
# Equivalent Outcome!
id_box = driver.find_element_by_id['username']

Chương trình của chúng tôi hiện có quyền truy cập vào

import selenium# Using Chrome to access web
driver = webdriver.Chrome[]
# Open the website
driver.get['//canvas.case.edu']
3 và chúng tôi có thể tương tác với nó theo nhiều cách khác nhau, chẳng hạn như nhập phím hoặc nhấp [nếu chúng tôi đã chọn một nút]

# Send id information
id_box.send_keys['my_username']

Chúng tôi thực hiện quy trình tương tự cho hộp mật khẩu và nút đăng nhập, chọn từng tùy chọn dựa trên những gì chúng tôi thấy trong công cụ dành cho nhà phát triển Chrome. Sau đó, chúng tôi gửi thông tin đến các phần tử hoặc nhấp vào chúng khi cần

________số 8

Khi chúng tôi đăng nhập, chúng tôi được chào đón bởi bảng điều khiển hơi đáng sợ này

Một lần nữa, chúng tôi cần hướng dẫn chương trình thông qua trang web bằng cách chỉ định chính xác các yếu tố để nhấp vào và thông tin để nhập. Trong trường hợp này, tôi yêu cầu chương trình chọn các khóa học từ menu bên trái, sau đó chọn lớp tương ứng với bài tập tôi cần nộp

# Find and click on list of courses
courses_button = driver.find_element_by_id['global_nav_courses_link']
courses_button.click[]# Get the name of the folder
folder = file_tup[0]

# Class to select depends on folder
if folder == 'EECS491':
class_select = driver.find_element_by_link_text['Artificial Intelligence: Probabilistic Graphical Models [100/10039]']
elif folder == 'EECS531':
class_select = driver.find_element_by_link_text['Computer Vision [100/10040]']
# Click on the specific class
class_select.click[]

Chương trình tìm đúng lớp sử dụng tên thư mục mà chúng ta đã lưu trữ ở bước đầu tiên. Trong trường hợp này, tôi sử dụng phương pháp lựa chọn

import selenium# Using Chrome to access web
driver = webdriver.Chrome[]
# Open the website
driver.get['//canvas.case.edu']
4 để tìm lớp cụ thể. “Văn bản liên kết” cho một phần tử chỉ là một bộ chọn khác mà chúng ta có thể tìm thấy bằng cách kiểm tra trang.

Kiểm tra trang để tìm bộ chọn cho một lớp cụ thể

Quy trình công việc này có vẻ hơi tẻ nhạt, nhưng hãy nhớ rằng, chúng ta chỉ phải thực hiện một lần khi viết chương trình của mình. Sau đó, chúng ta có thể nhấn chạy bao nhiêu lần tùy thích và chương trình sẽ điều hướng qua tất cả các trang này cho chúng ta

Chúng tôi sử dụng cùng một quy trình 'kiểm tra trang - chọn phần tử - tương tác với phần tử' để vượt qua một vài màn hình khác. Cuối cùng, chúng tôi đến trang nộp bài tập

Tại thời điểm này, tôi có thể nhìn thấy vạch đích, nhưng ban đầu màn hình này làm tôi bối rối. Tôi có thể nhấp vào hộp “Chọn tệp” khá dễ dàng, nhưng làm cách nào để chọn tệp thực tế mà tôi cần tải lên? . Chúng tôi định vị hộp

import selenium# Using Chrome to access web
driver = webdriver.Chrome[]
# Open the website
driver.get['//canvas.case.edu']
5 bằng bộ chọn và sử dụng phương pháp
import selenium# Using Chrome to access web
driver = webdriver.Chrome[]
# Open the website
driver.get['//canvas.case.edu']
6 để chuyển đường dẫn chính xác của tệp [được gọi là
import selenium# Using Chrome to access web
driver = webdriver.Chrome[]
# Open the website
driver.get['//canvas.case.edu']
7 trong mã bên dưới] vào hộp

import selenium# Using Chrome to access web
driver = webdriver.Chrome[]
# Open the website
driver.get['//canvas.case.edu']
4

Đó là nó. Bằng cách gửi đường dẫn chính xác của tệp tới nút, chúng tôi có thể bỏ qua toàn bộ quá trình điều hướng qua các thư mục để tìm đúng tệp. Sau khi gửi vị trí, chúng tôi được thưởng bằng màn hình sau cho biết tệp của chúng tôi đã được tải lên và sẵn sàng để gửi

Bây giờ, chúng tôi chọn nút “Gửi bài tập”, nhấp vào và bài tập của chúng tôi được nộp

import selenium# Using Chrome to access web
driver = webdriver.Chrome[]
# Open the website
driver.get['//canvas.case.edu']
5

Dọn dẹp

Quản lý tệp luôn là một bước quan trọng và tôi muốn đảm bảo rằng mình không nộp lại hoặc làm mất bài tập cũ. Tôi quyết định giải pháp tốt nhất là lưu trữ một tệp duy nhất để gửi vào thư mục

import selenium# Using Chrome to access web
driver = webdriver.Chrome[]
# Open the website
driver.get['//canvas.case.edu']
8 bất kỳ lúc nào và di chuyển các tệp vào thư mục ____19 sau khi chúng được nộp vào. Đoạn mã cuối cùng sử dụng mô-đun os để di chuyển nhiệm vụ đã hoàn thành bằng cách đổi tên nó theo vị trí mong muốn

import selenium# Using Chrome to access web
driver = webdriver.Chrome[]
# Open the website
driver.get['//canvas.case.edu']
8

Tất cả mã tiến hành được gói gọn trong một tập lệnh duy nhất mà tôi có thể chạy từ dòng lệnh. Để hạn chế khả năng mắc lỗi, tôi chỉ gửi một bài tập mỗi lần, đây không phải là vấn đề lớn vì chỉ mất khoảng 5 giây để chạy chương trình

Đây là giao diện khi tôi bắt đầu chương trình

Chương trình cung cấp cho tôi cơ hội để đảm bảo đây là bài tập chính xác trước khi tải lên. Sau khi chương trình hoàn thành, tôi nhận được đầu ra sau

Trong khi chương trình đang chạy, tôi có thể xem Python làm việc cho tôi

kết luận

Kỹ thuật tự động hóa web bằng Python hoạt động hiệu quả cho nhiều tác vụ, cả nói chung và trong lĩnh vực khoa học dữ liệu của tôi. Ví dụ: chúng tôi có thể sử dụng selen để tự động tải xuống các tệp dữ liệu mới mỗi ngày [giả sử trang web không có API]. Mặc dù viết kịch bản ban đầu có vẻ tốn nhiều công sức, nhưng lợi ích đến từ thực tế là chúng ta có thể yêu cầu máy tính lặp lại trình tự này bao nhiêu lần tùy ý theo cùng một cách thức. Chương trình sẽ không bao giờ mất tập trung và chuyển sang Twitter. Nó sẽ thực hiện chính xác cùng một loạt các bước với tính nhất quán hoàn hảo [hoạt động tốt cho đến khi trang web thay đổi]

Tôi nên đề cập rằng bạn muốn cẩn thận trước khi tự động hóa các tác vụ quan trọng. Ví dụ này có rủi ro tương đối thấp vì tôi luôn có thể quay lại và gửi lại bài tập và tôi thường kiểm tra lại công việc thủ công của chương trình. Các trang web thay đổi và nếu bạn không thay đổi chương trình để đáp ứng, bạn có thể kết thúc bằng một tập lệnh thực hiện điều gì đó hoàn toàn khác với những gì bạn dự định ban đầu

Về mặt thanh toán, chương trình này giúp tôi tiết kiệm khoảng 30 giây cho mỗi bài tập và mất 2 giờ để viết. Vì vậy, nếu tôi sử dụng nó để nộp 240 bài tập, thì tôi sẽ về trước đúng giờ. Tuy nhiên, phần thưởng của chương trình này là thiết kế một giải pháp tuyệt vời cho một vấn đề và học hỏi được nhiều điều trong quá trình này. Mặc dù thời gian của tôi có thể được sử dụng hiệu quả hơn để giải quyết các bài tập hơn là tìm cách tự động nộp chúng, nhưng tôi hoàn toàn thích thú với thử thách này. Có một vài điều thỏa mãn như giải quyết vấn đề và Python hóa ra là một công cụ khá tốt để thực hiện chính xác điều đó

Như mọi khi, tôi hoan nghênh phản hồi và phê bình mang tính xây dựng. Có thể liên hệ với tôi trên Twitter @koehrsen_will

Python có thể hoạt động với HTML không?

Nếu bạn quan tâm đến việc phát triển web bằng Python thì việc biết HTML và CSS sẽ giúp bạn hiểu rõ hơn về các khung web như Django và Flask. Nhưng ngay cả khi bạn mới bắt đầu với Python, HTML và CSS có thể cho phép bạn tạo các trang web nhỏ để gây ấn tượng với bạn bè .

Làm cách nào để tích hợp mã Python với HTML?

Chỉ cần sử dụng bất kỳ HTTP Python nào và phản hồi bằng HTML của bạn và xem nó trong trình duyệt của bạn. Hãy làm rõ tình hình. Tôi đang tạo trò chơi trên Ren'py[link] và để đơn giản hóa công việc [tôi cần làm thứ gì đó giống như điện thoại], tôi muốn sử dụng HTML [CSS và JS]. Vì vậy, tôi đã hỏi liệu bằng cách nào đó tôi có thể làm những gì tôi muốn

Chủ Đề