Dự án: My Anime Finder
Đây là một dự án tìm một (chương trình) anime cụ thể và kiểm tra xem có tập mới của nó hay không.
Đây cũng là lần đầu tiên tôi sử dụng def
như thế này và muốn hỏi dự án này trông như thế nào và tôi có thể cải thiện nó như thế nào?
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.common.keys import Keys
import time
path = "c:/users/admin/appdata/local/programs/python/python38-32/chromedriver.exe"
driver = webdriver.Chrome(path)
chose = int(input("Press 1 for Black Clover \nPress 2 for Fire Force : "))
class BlackClover:
def __init__(self, title):
# lets the user chose which anime(show) he or she wants to watch.
self.title = title
# goes to the website that i want .
self.url = driver.get("https://www.gogoanime.movie/")
# i let it sleep for a few seconds before it goes to the next task
time.sleep(3)
# goes the english speaking anime (shows)
self.dub = driver.find_element_by_xpath('//*[@id="load_recent_release"]/div[1]/h2/a[2]')
self.dub.send_keys(Keys.RETURN)
# will be used later to filter out the episode number .
self.numbers = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
self.divider = []
# the anime name (shows name).
self.clover = "Black Clover (TV) (Dub)"
def checker(self):
# will be used to retrieve the episode of the anime (show).
global episode
# will be used to go through the li element (HTML)
global n
n = 1
total = 0
# checks to see if the first li element is equal to "Black Clover (TV) (Dub)".
first_anime = WebDriverWait(driver, 3).until(ec.visibility_of_element_located(
(By.XPATH, '//*[@id="load_recent_release"]/div[2]/ul/li[1]/p[1]/a'))).get_attribute("innerHTML")
if first_anime == "Black Clover (TV) (Dub)":
print("first good")
driver.find_element_by_xpath('//*[@id="load_recent_release"]/div[2]/ul/li[1]/p[1]/a').send_keys(Keys.RETURN)
# if it is not equal to "Black Clover (TV) (Dub)" it will loop through the next li element until it finds it.
else:
while True:
# the next li element
name = WebDriverWait(driver,3).until(ec.visibility_of_element_located(
(By.XPATH, f'//*[@id="load_recent_release"]/div[2]/ul/li[{n}]/p[1]/a'))).get_attribute("innerHTML")
if name == self.clover:
print("good")
# checks which episode it's on and looks if it's a new episode
episode = WebDriverWait(driver,2).until(ec.visibility_of_element_located(
(By.XPATH, f'//*[@id="load_recent_release"]/div[2]/ul/li[{n}]/p[2]'))).get_attribute("innerHTML")
# retrieves the episode number
self.episodes()
break
if name != self.clover:
print("bad")
total += 1
n+= 1
if total == 20:
print("nothing")
break
CHỈNH SỬA: tôi cho phép người dùng chọn anime (chương trình) mà họ muốn kiểm tra bằng cách nhập 1 hoặc 2 vào biến đầu vào được gọi chose
ở trên cùng.
Cảm ơn @fabrizzio_gz.
def episodes(self):
global joiner
# divider is a empty list
divider = self.divider
# copies the the variable "episode"
k= list(episode)
splitter = list(episode)
# gets the last three numbers in "k".
number = len(k)-3
last_number = k[number:]
last_number_2 = k[-1]
# checks to see if there are any numbers in the the variable "splitter" .
for i in splitter:
# if the i in splitter isn't a number it replaces it with a empty string.
if i not in self.numbers:
t = splitter.index(i)
splitter[t] = ""
print(splitter)
# if i is a number then it will add to the list with the variablename "divider" .
if i in self.numbers:
divider.append(i)
if divider == last_number and self.title == "Black Clover (TV) (Dub)":
# this joins all the numbers together in the list
joiner = ''.join(divider)
# checks to see if the episode is greater then 129
if int(joiner) > 129:
time.sleep(2)
# when the episode is greater then 129 it clicks the anime (show).
click = driver.find_element_by_xpath(f'//*[@id="load_recent_release"]/div[2]/ul/li[{n}]/p[1]/a')
click.send_keys(Keys.RETURN)
break
else :
# if the episode isn't greater then 129 then it returns the following .
return print("no new episode of : BLACK CLOVER ")
else:
joiner = ''.join(divider)
if int(joiner) >= 4:
time.sleep(2)
# when the episode is greater then 4 it clicks the anime (show).
click = driver.find_element_by_xpath(
f'//*[@id="load_recent_release"]/div[2]/ul/li[{n}]/p[1]/a')
click.send_keys(Keys.RETURN)
break
else:
# if the episode isn't greater then 4 then it returns the following .
return print("no new episode of : FIRE FORCE ")
if chose == 1:
main = BlackClover(title="Black Clover (TV) (Dub)")
main.checker()
if chose == 2:
main = BlackClover(title="Enen no Shouboutai: Ni no Shou (Dub)")
main.checker()
Trả lời
Nó có vẻ tốt và đó là một dự án thú vị. Tôi không quen thuộc với selen, nhưng vì bạn tạo Lớp cho mỗi chương trình anime chia sẻ hầu hết mã, bạn có thể triển khai Lớp chương trình anime mẹ và kế thừa các phương thức cho mỗi Lớp con. Hoặc có thể có mỗi chương trình anime là một thể hiện của cùng một Lớp, chỉ cần thay đổi tiêu đề chương trình anime hoặc các thuộc tính cần thiết.
CHỈNH SỬA: Bạn có thể sử dụng cùng một lớp cho cả hai chương trình anime như sau. Thay vì hai lớp, bạn tạo một lớp mới AnimeShow
với các thuộc tính và phương thức giống nhau. Bạn thêm tham số anime_show
vào __init__
hàm để có thể khởi tạo các chương trình anime với các tiêu đề khác nhau. Bạn cũng cần thay đổi mã của mình để sử dụng thuộc tính mới self.title
khi cần thiết.
class AnimeShow():
# Adding anime_show parameter
def __init__(self, anime_show):
# Same attributes as you had before
# ...
self.title = anime_show
# Rest of class methods
# ...
if __name__ == '__main__':
# Creating different anime shows with the same class
clover = AnimeShow("Black Clover (TV) (Dub)")
fire = AnimeShow("Enen no Shouboutai: Ni no Shou (Dub)")
clover.checker()
fire.checker()
```