Я пытаюсь извлечь несколько простых кодов CIK из SEC. Если вы запустите приведенный ниже код, вы получите поп о "опросе". если вы сделаете это вручную, вы его не увидите. он бомбит мой код. но поскольку он находится в селене, я не могу проверить его с помощью chropath, чтобы xpath щелкнул по "НЕТ". И я не могу воссоздать всплывающее окно в обычном браузере. Что я делаю?
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
from random import randint
path ='C:\\Users\\Jason\\Google Drive\\python\\chromedriver.exe'
ticker='alrm'
main='https://www.sec.gov/search/search.htm'
driver=webdriver.Chrome(path)
tickers=['AAL','AAN','AAOI','AAPL']
# starts the process
def get_CIK(ticker):
driver.get(main)
stock_code = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "cik")))
stock_code.click()
stock_code.send_keys(ticker)
driver.find_element_by_xpath("//input[@value='Find Companies']").click() # click on search buttom
link = driver.find_element_by_xpath("/html[1]/body[1]/div[4]/div[1]/div[3]/span[1]/a[1]").get_attribute("href") # get link
cik= link[link.index('CIK=')+4:link.index("owner")-1] # extract cik
print cik
for i in tickers:
get_CIK(i)
То, что вы иногда видите, - это всплывающее окно Foresee, которое обычно отображается случайным образом.
Есть пять общих подходов, о которых я могу думать:
проверьте наличие всплывающего окна полностью во время взаимодействия с веб-сайтом. Всплывающее окно не является классическим "предупреждением" в смысле селена и является просто "наложением", которое имеет это представление HTML:
<div class="__acs " aria-labelledby="fsrHeading">
<div class="acsModalBackdrop acsAbandonButton" data-isbackdrop="true">
<div class="acsFocusFirst acsClassicInvite" tabindex="1"
id="acsMainInvite" role="dialog" aria-labelledby="fsrHeading">
<div class="acsClassicInner" role="document">
<div class="acsLogoSpacer"><img
src="//gateway.foresee.com/sites/sec-gov/production/trigger/sitelogo.png"
class="acsSiteLogo" title="" alt=""> <img
src="https://static.foresee.com/logos/foresee/150_67.png"
class="acsNoDisplay" title="ForeSee" alt="ForeSee">
<div title="ForeSee" alt="ForeSee"
class="acsVendorLogoSVG"></div>
...
Затем вы можете, например, проверить наличие кнопки "Отклонить" и щелкнуть ее, если она присутствует:
<a href="#" tabindex="2" class="acsInviteButton acsDeclineButton" title="" role="button"></a>
вы также можете "блокировать" предусмотреть сценарии JS для загрузки, например, с помощью browserermobproxy, где вы блокируете весь трафик с "foresee.com". Или, по аналогичной траектории - вы можете начать селен с блокатором рекламы, который должен/должен блокировать "предвидеть" из готового
или вы можете переопределить showInvite()
глобального объекта "предвидеть":
driver.execute_script("window.FSR.showInvite = function () {};")
Обратите внимание, что вам нужно будет вызывать этот скрипт каждый раз сразу после перехода на новую страницу.
после немного обратной инженерии я обнаружил, что "предвидеть" объект JS имеет эту глобальную конфигурацию, которая содержит много интересной информации, включая черный список устройств:
device_blacklist: ["HTC_Rezound", "blackberry"]
Затем вы можете переопределить пользовательский агент браузера и притвориться, что он поступает с устройства Blackberry:
BLACKBERRY_UA = "Mozilla/5.0 (BlackBerry; U; BlackBerry 9900; en) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.1.0.346 Mobile Safari/534.11+"
opts = Options()
opts.add_argument("user-agent={0}".format(BLACKBERRY_UA))
driver = webdriver.Chrome(chrome_options=opts)
Второй вариант, хотя и технически более сложный и более подверженный ошибкам, и замедлит работу, так как вы будете постоянно проверять наличие этого всплывающего окна. Ну, по крайней мере, пока вы не уволите его.
Четвертый вариант весьма перспективен, но я не полностью его протестировал.
Последний вариант, независимо от того, как он сумасшедший, действительно работает для меня.