2017-12-30 45 views
2

Die unten request findet die Wettbewerbsidentifikation für den Tag. Ich versuche, diese str in die url zu übergeben, so wird es zu jedem einzelnen Wettbewerb url gehen und jeden Wettbewerb CSV herunterladen. Ich würde mir vorstellen, dass Sie eine loop schreiben müssen, aber ich bin mir nicht sicher, wie das mit einem webdriver aussehen würde.Schleife durch URL mit Selenium Webdriver

import time 
from selenium import webdriver 
import requests 
import datetime 

req = requests.get('https://www.draftkings.com/lobby/getlivecontests?sport=NBA') 
data = req.json() 

for ids in data: 
    contest = ids['id'] 

driver = webdriver.Chrome() # Optional argument, if not specified will search path. 
driver.get('https://www.draftkings.com/account/sitelogin/false?returnurl=%2Flobby'); 
time.sleep(2) # Let DK Load! 

search_box = driver.find_element_by_name('username') 
search_box.send_keys('username') 
search_box2 = driver.find_element_by_name('password') 
search_box2.send_keys('password') 
submit_button = driver.find_element_by_xpath('//*[@id="react-mobile-home"]/section/section[2]/div[3]/button/span') 
submit_button.click() 
time.sleep(2) # Let Page Load, If not it will go to Account! 


driver.get('https://www.draftkings.com/contest/exportfullstandingscsv/' + str(contest) + '') 
+0

Sie im Rahmen testng verwenden Dataprovider kann –

+0

werden, so dass dieser IDs in der URL zurückgegeben? ist es das Sport = NBA Bit? –

+0

Es wird durchgehen und alle Wettbewerbs-IDs, die gerade laufen, erfassen. Mit diesen IDs möchte ich es durchgehen lassen und zu jedem Wettbewerb über die IDs gehen und die csv –

Antwort

2

Versuch in folgenden Reihenfolge:

import time 
from selenium import webdriver 
import requests 
import datetime 

req = requests.get('https://www.draftkings.com/lobby/getlivecontests?sport=NBA') 
data = req.json() 



driver = webdriver.Chrome() # Optional argument, if not specified will search path. 
driver.get('https://www.draftkings.com/account/sitelogin/false?returnurl=%2Flobby') 
time.sleep(2) # Let DK Load! 

search_box = driver.find_element_by_name('username') 
search_box.send_keys('Pr0c3ss') 
search_box2 = driver.find_element_by_name('password') 
search_box2.send_keys('generic1!') 
submit_button = driver.find_element_by_xpath('//*[@id="react-mobile-home"]/section/section[2]/div[3]/button/span') 
submit_button.click() 
time.sleep(2) # Let Page Load, If not it will go to Account! 

for ids in data: 
    contest = ids['id'] 
    driver.get('https://www.draftkings.com/contest/exportfullstandingscsv/' + str(contest) + '') 
+0

Es sieht so aus, als ob es funktioniert, ich muss es heute Nacht überprüfen, wenn Wettbewerbe stattfinden. gute Arbeit! –

+0

Verwenden Sie keinen statischen Schlafmodus –

0

wird diese Hilfe

for ids in data: 
    contest = ids['id'] 
    driver.get('https://www.draftkings.com/contest/exportfullstandingscsv/' + str(contest) + '') 
+0

gutes Denken, aber es ist nicht –

+2

was passiert damit? –

0

Mai seine Zeit, sei es ein wenig zu zersetzen.
Erstellen Sie einige isolierte Funktionen:
0. (Optional) Geben Sie die Berechtigung für die Ziel-URL an.
1. Sammeln aller benötigten id (ersten Teil Ihres Codes).
2. Export von CSV für spezifische id (zweiter Teil Ihres Codes).
3. Durchlaufen Sie die Liste der id und rufen Sie funC# 2 für jeden auf.

Geben Sie chromedriver als Eingabeargument für jeden von ihnen, um Treiberstatus und Auth-Cookies zu speichern.
Es funktioniert gut, Code klar und lesbar machen.

0

Ich denke, Sie können die URL eines Wettbewerbs auf ein a Element in der Zielseite festlegen und dann darauf klicken. Wiederholen Sie den Schritt mit der anderen ID.

Siehe unten meinen Code.

req = requests.get('https://www.draftkings.com/lobby/getlivecontests?sport=NBA') 
data = req.json() 
contests = [] 

for ids in data: 
    contests.append(ids['id']) 

driver = webdriver.Chrome() # Optional argument, if not specified will search path. 
driver.get('https://www.draftkings.com/account/sitelogin/false?returnurl=%2Flobby'); 
time.sleep(2) # Let DK Load! 

search_box = driver.find_element_by_name('username') 
search_box.send_keys('username') 
search_box2 = driver.find_element_by_name('password') 
search_box2.send_keys('password') 
submit_button = driver.find_element_by_xpath('//*[@id="react-mobile-home"]/section/section[2]/div[3]/button/span') 
submit_button.click() 
time.sleep(2) # Let Page Load, If not it will go to Account! 

for id in contests: 
    element = driver.find_element_by_css_selector('a') 
    script1 = "arguments[0].setAttribute('download',arguments[1]);" 
    driver.execute_script(script1, element, str(id) + '.pdf') 
    script2 = "arguments[0].setAttribute('href',arguments[1]);" 
    driver.execute_script(script2, element, 'https://www.draftkings.com/contest/exportfullstandingscsv/' + str(id)) 
    time.sleep(1) 
    element.click() 
    time.sleep(3) 
1

Sie brauchen keine Last Selen für x nos Mal senden x nos von Dateien zum Download bereit. Anfragen und Selen können Cookies teilen. Das heißt, Sie können sich mit Selenium auf der Site anmelden, die Login-Daten abrufen und sie mit Anfragen oder anderen Anwendungen teilen. Nehmen Sie sich einen Moment Zeit, um sich das httpi, https://httpie.org/doc#sessions anzusehen. Es scheint, dass Sie Sitzungen wie Anfragen manuell steuern.

Für Anfragen zu buchen: http://docs.python-requests.org/en/master/user/advanced/?highlight=sessions Für Selen Blick auf: http://selenium-python.readthedocs.io/navigating.html#cookies

am WebDriver Block suchen, können Sie Proxies und laden Sie den Browser ohne Kopf oder leben hinzufügen: Gerade die Maden Linie Kommentar und es sollte die Last Browser live, das macht Debugging einfach, leicht zu verstehen, Bewegungen und Änderungen an der Website api/html.

import time 
from selenium import webdriver 
from selenium.common.exceptions import WebDriverException 
import requests 
import datetime 
import shutil 



LOGIN = 'https://www.draftkings.com/account/sitelogin/false?returnurl=%2Flobby' 
BASE_URL = 'https://www.draftkings.com/contest/exportfullstandingscsv/' 
USER = '' 
PASS = '' 

try: 
    data = requests.get('https://www.draftkings.com/lobby/getlivecontests?sport=NBA').json() 
except BaseException as e: 
    print(e) 
    exit() 


ids = [str(item['id']) for item in data] 

# Webdriver block 
driver = webdriver.Chrome() 
options.add_argument('headless') 
options.add_argument('window-size=800x600') 
# options.add_argument('--proxy-server= IP:PORT') 
# options.add_argument('--user-agent=' + USER_AGENT) 

try: 
    driver.get(URL) 
    driver.implicitly_wait(2) 
except WebDriverException: 
    exit() 

def login(USER, PASS) 
    ''' 
    Login to draftkings. 
    Retrieve authentication/authorization. 

    http://selenium-python.readthedocs.io/waits.html#implicit-waits 
    http://selenium-python.readthedocs.io/api.html#module-selenium.common.exceptions 

    ''' 

    search_box = driver.find_element_by_name('username') 
    search_box.send_keys(USER) 

    search_box2 = driver.find_element_by_name('password') 
    search_box2.send_keys(PASS) 

    submit_button = driver.find_element_by_xpath('//*[@id="react-mobile-home"]/section/section[2]/div[3]/button/span') 
    submit_button.click() 

    driver.implicitly_wait(2) 

    cookies = driver.get_cookies() 
    return cookies 


site_cookies = login(USER, PASS) 

def get_csv_files(id): 
    ''' 
    get each id and download the file. 
    ''' 

    session = rq.session() 

    for cookie in site_cookies: 
     session.cookies.update(cookies) 

    try: 
     _data = session.get(BASE_URL + id) 
     with open(id + '.csv', 'wb') as f: 
      shutil.copyfileobj(data.raw, f) 
    except BaseException: 
     return 


map(get_csv_files, ids) 
Verwandte Themen