ori_dextools_sel_py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. from selenium import webdriver
  2. from selenium.webdriver.common.keys import Keys
  3. from selenium.webdriver.common.by import By
  4. from selenium.webdriver.support import expected_conditions as EC
  5. from selenium.common.exceptions outException
  6. from selenium.webdriver import ActionChains
  7. from selenium.webdriver.support.wait import WebDriverWait
  8. import pandas as pd
  9. import numpy as np
  10. import random
  11. import time
  12. def InitWeb(driver, wait):
  13. time.sleep(8)
  14. search_card = driver.find_element(By.XPATH, "//div[@class='search card']")
  15. chain = search_card.find_element(By.XPATH, "./div[0]")
  16. try:
  17. closebutton = driver.find_elements(
  18. By.XPATH, "//button[contains(@class, 'close')]"
  19. )
  20. for button in closebutton:
  21. button.click()
  22. time.sleep(0.5)
  23. except:
  24. pass
  25. time.sleep(3)
  26. infocon = wait.until(
  27. EC.presence_of_element_located(
  28. (
  29. By.XPATH,
  30. "//div[@class='user-info-container']//div[contains(@class, 'open-settings')]",
  31. )
  32. )
  33. )
  34. infocon.click()
  35. langselect = wait.until(
  36. EC.presence_of_element_located(
  37. (
  38. By.XPATH,
  39. "//div[@class='panel-container__body']//app-dropdown-select[@id='language']",
  40. )
  41. )
  42. )
  43. time.sleep(6)
  44. if langselect.text.strip() != "English":
  45. x = langselect.location["x"] + langselect.size["width"] / 2
  46. y = langselect.location["y"] + langselect.size["height"] / 2
  47. action = ActionChains(driver)
  48. action.reset_actions()
  49. action.move_by_offset(x, y).click().perform()
  50. selectlist = wait.until(
  51. EC.presence_of_element_located(
  52. (By.XPATH, "//div[contains(@class, 'dropdown-list')]")
  53. )
  54. )
  55. engselected = selectlist.find_element(By.XPATH, "./div[1]")
  56. x = engselected.location["x"] + engselected.size["width"] / 2
  57. y = engselected.location["y"] + engselected.size["height"] / 2
  58. action.reset_actions()
  59. action.move_by_offset(x, y).click().perform()
  60. time.sleep(5)
  61. closebutton = driver.find_element(
  62. By.XPATH,
  63. "//div[contains(@class,'panel-container')]//button[contains(@class, 'close')]",
  64. )
  65. closebutton.click()
  66. time.sleep(5)
  67. # 显示等待方法
  68. # WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
  69. readfile = "./dextoolsselinium/"
  70. errwritefile = "./dextoolsselinium/"
  71. csvname = "err-bsc-0318134801"
  72. with open("./dextoolsselinium/dexttraders.js", "r", encoding="utf-8") as f:
  73. scrollscript = f.read()
  74. # df = pd.read_csv(f"./0-AveTokenList/{csvname}.csv", encoding='utf-8')
  75. df = pd.read_csv(f"{readfile}{csvname}.csv", encoding="utf-8")
  76. # df = pd.read_csv("./dextoolsselinium/errbsc-0318134802.csv",
  77. # encoding='latin-1')
  78. # df = pd.read_excel(
  79. # "./dextoolsselinium/errbsc-0318134801.xlsx")
  80. # df = df.drop(index=range(60))
  81. # print(df)
  82. addlists = [[x, y] for x, y in zip(df["Pair"], df["Tokenaddress"])]
  83. errortokens = [["Pair", "Tokenaddress"]]
  84. driver = webdriver.Chrome()
  85. url = "https://www.dextools.io/app/en"
  86. driver.get(url)
  87. driver.maximize_window()
  88. wait = WebDriverWait(driver, 15, ignored_exceptions=None)
  89. driver.set_script_timeout(250)
  90. # Enter_setEnglish(driver, wait)
  91. # addlists = [["sWirl/WBNB", "0x93c8d3777824db6e21cfdc06a528151ba752a9ea"]]
  92. for pair, tokenadd in addlists:
  93. try:
  94. print(f"{pair} begin")
  95. time.sleep(random.uniform(4, 5))
  96. header = wait.until(lambda x: x.find_element(By.TAG_NAME, "header"))
  97. # searchinput = wait.until(lambda x: x.find_element(By.TAG_NAME, "input"))
  98. searchinput = header.find_element(By.TAG_NAME, "input")
  99. searchinput.send_keys(tokenadd)
  100. time.sleep(10)
  101. divelement = wait.until(
  102. EC.presence_of_element_located(
  103. (By.XPATH, "//div[contains(@class, 'search-results')]")
  104. )
  105. )
  106. ulelement = divelement.find_element(By.TAG_NAME, "ul")
  107. # print(ulelement.get_attribute("outerHTML"))
  108. linum = int(divelement.find_element(
  109. By.XPATH, "./div").text.strip().split()[0])
  110. # print("linum", linum)
  111. lielements = ulelement.find_elements(By.XPATH, "./li")
  112. # print(lielements)
  113. lielements = lielements[:linum]
  114. try:
  115. lielement = None
  116. # print('pair',pair)
  117. for i in range(linum):
  118. # print(i,lielements[i].text,'replace',lielements[i].text.replace("\n", ""))
  119. # print(i,)
  120. if pair == lielements[i].find_element(
  121. By.XPATH, ".//app-token-name"
  122. ).text.replace("\n", ""):
  123. lielement = lielements[i]
  124. break
  125. liclick = lielement.find_element(By.XPATH, "./div")
  126. liclick.click()
  127. except:
  128. # close-search ng-tns-c151-6 ng-star-inserted
  129. closebutotn = driver.find_element(
  130. By.XPATH, "//button[contains(@class,'close-search')]"
  131. )
  132. closebutotn.click()
  133. raise
  134. # print(liclick.get_attribute("outerHTML"))
  135. time.sleep(random.uniform(8, 10))
  136. # driver.execute_async_script(scrollscript)
  137. wait.until(EC.presence_of_element_located(
  138. (By.XPATH, "//datatable-body")))
  139. # driver.execute_async_script(scrollscript)
  140. driver.execute_script(scrollscript)
  141. except TimeoutException as e:
  142. # print('timeout', e)
  143. print(f"time {pair}")
  144. errortokens.append([pair, tokenadd])
  145. # raise
  146. # continue
  147. # break
  148. except Exception as e:
  149. print(f"error {pair}")
  150. errortokens.append([pair, tokenadd])
  151. # print(e)
  152. # raise
  153. # break
  154. # continue
  155. print("ready quit")
  156. time.sleep(300)
  157. driver.quit() # 退出时自动清理临时文件
  158. errdf = pd.DataFrame(errortokens)
  159. print("errortokens list", errortokens)
  160. errdf.to_csv(f"{errwritefile}err-{csvname}.csv", index=False)