2017-12-30 30 views
2

以下のrequestは、その日のコンテストIDを検出します。私はstrdriver.geturlに渡そうとしているので、それぞれのコンテストurlに行き、各コンテストCSVをダウンロードします。私はあなたがloopを書かなければならないと思いますが、それはwebdriverでどのように見えるか分かりません。Selenium WebdriverによるループスルーURL

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

testNGフレームワーク –

+0

でdataproviderを使用できるので、これらのIDはURLに返されますか?それはスポーツ= nbaビットですか? –

+0

これは、現在行っているすべてのコンテストIDを通過して取得します。これらのIDで、私はそれを通過し、IDを介して各コンテストに行き、csvをエクスポートします –

答えて

2

試してください:あなたは、ファイルのx番号をダウンロードするには倍のx番の負荷セレンを送信する必要はありません

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

それはうまくいくように見えます、今度はコンテストが行​​われたら、今夜それをチェックしなければなりません。よくやった! –

+0

静的スリープを使用しない –

0

このヘルプ

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

いい考えがありますが、それは –

+2

どうしますか? –

0

はそれを少し分解し、その時間がかかるかもしれないだろう。
いくつかの独立した関数を作成します。
0.(オプション)URLをターゲットにする権限を与えます。
1.すべてを収集するid(コードの最初の部分)。
2.具体的なCSVのエクスポートid(コードの2番目の部分)。
3. idのループスルーリストとそれぞれについてfunc#2を呼び出します。

ドライバの状態と認証クッキーを保存するために、それぞれの入力引数として共有する。
それはうまく動作し、コードを明確かつ読みやすくします。

0

ランディングページのa要素にコンテストのURLを設定して、それをクリックするといいと思います。次に、他のIDで手順を繰り返します。

以下のコードを参照してください。次の順序で

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

。リクエストとセレンはクッキーを共有できます。つまり、セレンでサイトにログインし、ログインの詳細を取得し、リクエストや他のアプリケーションと共有することができます。 httpieをチェックアウトしてください。https://httpie.org/doc#sessionsリクエストのように手動でセッションを制御しているようです。要求の場合

を見てから:セレンの外観についてhttp://docs.python-requests.org/en/master/user/advanced/?highlight=sessions :webdriverをブロックを見るとhttp://selenium-python.readthedocs.io/navigating.html#cookies

、あなたはプロキシを追加し、ブラウザのヘッドレスをロードしたり、生きることができます:ちょうどヘッドレス行をコメントし、それがロードする必要がありますこれにより、デバッグが簡単になり、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)