Как мне разобрать этот JavaScript из Oddshark.com с BeautifulSoup? - PullRequest
0 голосов
/ 10 ноября 2018

Работаю над небольшой программой очистки веб-страниц, чтобы получить некоторые данные и помочь мне сделать некоторые ставки.

В конечном счете, я хочу проанализировать раздел «Тенденции» в каждой игре текущей недели на страницах, подобных этой (https://www.oddsshark.com/nfl/arizona-kansas-city-odds-november-11-2018-971332)

).

Мой текущий алгоритм:

  1. GET https://www.oddsshark.com/nfl/scores
  2. Разбор веб-страницы для маленькой кнопки "vs", которая содержит ссылки на все игры
  3. Разбор трендов

Вот как я начал:

from bs4 import BeautifulSoup
import requests

url = "https://www.oddsshark.com/nfl/scores"
result = requests.get("https://www.oddsshark.com/nfl/scores")
print ("Status: ", result.status_code)

content = result.content
soup = BeautifulSoup(content, 'html.parser')

print (soup)

Когда я смотрю на вывод, я не вижу ни одной из этих ссылок. Это вызывает много сайта javascript?

Любые указатели на код / ​​алгоритм приветствуются!

Ответы [ 3 ]

0 голосов
/ 10 ноября 2018

Данные загружаются с помощью javascript в таблицу трендов, но фактически включаются в тег script внутри получаемого вами html.Вы можете разобрать это так:

import requests
import json
from bs4 import BeautifulSoup

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0'
}

response = requests.get('https://www.oddsshark.com/nfl/arizona-kansas-city-odds-november-11-2018-971332', headers=headers)

soup = BeautifulSoup(response.text, "lxml")

data = json.loads(soup.find("script", {'id': 'gc-data'}).text)
print(data['oddsshark_gamecenter']['trends'])

Выходы:

{'local': {'title': 'Trends'}, 'away': [{'value':' Аризона - 4-1-1 ATS в последних 6 играх '}, {' value ':' Arizona - 2-6 SU в последних 8 играх '}, {' value ': "Общее количество прошлов 8 из последних 12 игр Аризоны "}, {'value': 'Arizona - 3-7-1 ATS в последних 11 играх на выезде'}, {'value': 'Arizona - 2-4 SU в последней6 игр в дороге '} ...

0 голосов
/ 10 ноября 2018

Вы можете использовать внутренний API, используемый этими сайтами, чтобы получить все ссылки и перебрать их, чтобы получить информацию о тенденциях, которая встроена в тег script с id:gc-data:

import requests
import json
from bs4 import BeautifulSoup

r = requests.get(
    'https://io.oddsshark.com/ticker/nfl', 
    headers = {
        'referer': 'https://www.oddsshark.com/nfl/scores'
    }
)

links = [
    (
        t["event_date"], 
        t["away_name"], 
        t["home_name"], 
        "https://www.oddsshark.com{}".format(t["matchup_link"])
    )
    for t in r.json()['matchups']
    if t["type"] == "matchup"
]

for t in links:
    print("{} - {} vs {} => {}".format(t[0],t[1],t[2],t[3]))
    r = requests.get(t[3])
    soup = BeautifulSoup(r.content, "lxml")
    trends = [
        json.loads(v.text)
        for v in soup.findAll('script', {"type":"application/json", "id":"gc-data"})
    ]
    print(trends[0]["oddsshark_gamecenter"]["trends"])
    print("#########################################")
0 голосов
/ 10 ноября 2018

Причина, по которой вы не видите эти ссылки, заключается в том, что они не включены в ответ, который получает requests. Это очень вероятно по одной из двух причин:

  1. Сервер распознает, что вы пытаетесь очистить сайт скриптом, и отправляет вам другой контент. Обычно это происходит из-за User-Agent, установленного requests.
  2. Контент добавляется динамически через JavaScript, который запускается в браузере.

Вероятно, вы могли бы визуализировать этот контент, используя браузер без заголовка в вашем скрипте Python, и в итоге получить тот же контент, который вы видите при посещении сайта с помощью Chrome et. В соответствии с (1) может потребоваться поэкспериментировать с заголовком User-Agent в вашем запросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...