2017-08-25 5 views
0

私はウェブスクレイピングには新しく、今はドイツ人のbundesligaについての賭けの競争を自動化するためにそれを理解しようとしています。 (使用するプラットフォームはkicktipp.deです)。私は既にウェブサイトにログインし、pythonでサッカーの結果を投稿することができました。 Unfortunatellyこれらは、今までの無作為化されたランダム番号である。これを改善するために私の考えはbwinからのオッズをダウンロードすることです。正確には、正確な結果を得るためにオッズをダウンロードしようとします。ここで問題が始まります。これまで私はBeautifulSoupでそれらを抽出できませんでした。 Google Chromeを使用して、私は必要なhtmlコードの部分を理解しようとします。しかし、何らかの理由でBeautifulSoupでこれらの部品を見つけることができません。 enter image description here 現時点では私のコードは次のようになりん:ウェブスクレイピング(フットボールオッズ)

from urllib.request import urlopen as uReq 
from bs4 import BeautifulSoup as soup 

my_url = "https://sports.bwin.com/de/sports/4/wetten/fußball#categoryIds=192&eventId=&leagueIds=43&marketGroupId=&page=0&sportId=4&templateIds=0.8649061927316986" 

# opening up connection, grabbing the page 
uClient = uReq(my_url) 
page_html = uClient.read() 
uClient.close() 

# html parsing 
page_soup = soup(page_html, "html.parser") 
containers1 = page_soup.findAll("div", {"class": "marketboard-event- 
group__item--sub-group"}) 
print(len(containers1)) 
containers2 = page_soup.findAll("table", {"class": "marketboard-event-with- 
header__markets-list"}) 
print(len(containers2)) 

私はすでに彼らは、私は予想以上の項目が含まれているか、彼らは未知の理由のために空にされているかということ、見ることができ、容器のな長さから...あなたは私を導くことができますように。前もって感謝します!

+0

あなたはときに予想されるように、それはすべてのテーブルを示しています'page_soup.prettify()'を出力しますか?また、urllib.requestの代わりにリクエストを使用することを検討しましたか? –

答えて

3

と一緒にseleniumを使用して、JavaScriptコンテンツを生成するページをスクラップすることができます。これはその場合です。

from selenium import webdriver 
from bs4 import BeautifulSoup 

url = "https://sports.bwin.com/de/sports/4/wetten/fußball#categoryIds=192&eventId=&leagueIds=43&marketGroupId=&page=0&sportId=4&templateIds=0.8649061927316986" 
driver = webdriver.Chrome() 
driver.get(url) 
soup = BeautifulSoup(driver.page_source, 'html.parser') 

containers = soup.findAll("table", {"class": "marketboard-event-with-header__markets-list"}) 

今すぐcontainersは本当に、我々が望むものを持っているテーブル要素、より多くの検査、それは私たちの希望のテキストが<div>タグを交互にしていることを確認するのは簡単ですので、我々はのタプルのリストを作成するzipiterを使用することができますdivsリスト要素を交互に、一緒に生じ、オッズ:

resultAndOdds = []  
for container in containers: 
    divs = container.findAll('div') 
    texts = [div.text for div in divs] 
    it = iter(texts) 
    resultAndOdds.append(list(zip(it, it))) 

デモ:

>>> resultAndOdds[0] 
[('1:0', '9.25'), ('0:0', '7.25'), ('0:1', '7.50'), ('2:0', '16.00'), ('1:1', '6.25'), ('0:2', '10.00'), ('2:1', '11.50'), ('2:2', '15.00'), ('1:2', '9.25'), ('3:0', '36.00'), ('3:3', '51.00'), ('0:3', '19.50'), ('3:1', '26.00'), ('4:4', '251.00'), ('1:3', '17.00'), ('3:2', '36.00'), ('2:3', '29.00'), ('4:0', '126.00'), ('0:4', '51.00'), ('4:1', '101.00'), ('1:4', '41.00'), ('4:2', '151.00'), ('2:4', '81.00'), ('4:3', '251.00'), ('3:4', '251.00'), ('Jedes andere Ergebnis', '29.00')] 
>>> resultAndOdds[1] 
[('1:0', '5.00'), ('0:0', '2.65'), ('0:1', '4.10'), ('2:0', '15.50'), ('1:1', '7.25'), ('0:2', '10.50'), ('2:1', '21.00'), ('2:2', '67.00'), ('1:2', '18.00'), ('3:0', '81.00'), ('3:3', '251.00'), ('0:3', '36.00'), ('3:1', '126.00'), ('4:4', '251.00'), ('1:3', '81.00'), ('3:2', '251.00'), ('2:3', '251.00'), ('4:0', '251.00'), ('0:4', '201.00'), ('4:1', '251.00'), ('1:4', '251.00'), ('4:2', '251.00'), ('2:4', '251.00'), ('4:3', '251.00'), ('3:4', '251.00'), ('Jedes andere Ergebnis', '251.00')] 
>>> len(resultAndOdds) 
24 

あなたのデータは以下のようになりたい方法に応じて、あなたはまた、のようなもので、各テーブルのタイトルを取得することができます:

titlesElements = soup.findAll("div", {"class":"marketboard-event-with-header__market-name"}) 
titlesTexts = [title.text for title in titlesElements] 
+0

これはめったに来ることのない優れたアイデアの1つです。 Btw、どこにdriver.quitコマンドを置くべきですか?ありがとう。 – SIM

+0

'driver.quit()'や[** similars **](https://stackoverflow.com/questions/15067107/difference-between-webdriver-dispose-close-and-quit)を使うことができます。そして、それは「スープ」が作られるとすぐになります。 –

+0

@Shahin実現したらすぐに編集しました、申し訳ありません! =) –

関連する問題