Использование запросов с BS4 и / или JSON - PullRequest
0 голосов
/ 11 мая 2018

Вот источник страницы, которую я ищу. Источник страницы .Если источник страницы не работает, здесь ссылка только для источника."view-source: https://sports.bovada.lv/baseball/mlb"

Вот ссылка: Ссылка на страницу

Я не знаком с использованием bs4, но вот скрипт нижекоторый работает, но не возвращает ничего, что мне нужно.

import requests
from bs4 import BeautifulSoup

r = requests.get('https://sports.bovada.lv/baseball/mlb/game-lines-market-group')
soup = BeautifulSoup(r.content, 'lxml')

print(soup.prettify())

Я могу вернуть soup очень хорошо. Но то, что видно из простой проверки сайта и возвращенного soup, не совпадает.

Вот пример того, что я вижу из проверки. inspect of page

Цель состоит в том, чтобы убрать команду, питчера, шансы и общий пробег. Что я могуясно увидеть в версии проверки. Когда я print soup, эта информация не приходит.

Затем я нырнул немного дальше, и в нижней части источника страницы я могу видеть iFrame и ниже этогоэто похоже на json словарь со всем, что я хочу извлечь, но запуск аналогичного сценария для извлечения данных JSON не работает, как я надеялся:

import requests

req = requests.get('view-source:https://sports.bovada.lv//baseball/mlb/game-lines-market-group')
data = req.json()['itemList']
print(data)

Я считаю, что я должен использовать bs4, ноЯ запутался, почему тот же html не возвращается.

1 Ответ

0 голосов
/ 11 мая 2018

Данные в json являются динамическими, что означает, что они помещают их в HTML.

Для доступа к ним с помощью BS вам необходимо получить доступ к var, содержащемуся в источнике, который содержит данные json.затем загрузите его в json, и вы сможете получить к нему доступ оттуда.

Это по ссылке, которую вы дали с var swc_market_lists =

Так что в источнике это будет выглядеть как

<script type="text/javascript">var swc_market_lists = {"items":[{"description":"Game Lines","id":"136","link":"/baseball/mlb/game-lines-market-group","baseLink":"/baseball/mlb/game-lines-market-........

теперь вы можете использовать swc_market_lists в регулярном выражении pattern, чтобы возвращать только этот скрипт.

Используйте soup.find, чтобы вернуть только этот раздел.

Поскольку .text будет содержать часть var, я вернул данные с начала строки json.В этом случае от 24, который является первым {

Это означает, что теперь у вас есть строка данных JSON, которую вы можете затем загрузить как json и манипулировать при необходимости.

Надеюсь, выможет работать с этим, чтобы найти то, что вы хотите

from bs4 import BeautifulSoup as bs4
import requests
import json
from lxml import html
from pprint import pprint

import re


def get_data():

    url = 'https://sports.bovada.lv//baseball/mlb/game-lines-market-group'
    r = requests.get(url, headers={"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.103 Safari/537.36"})
    html_bytes = r.text
    soup = bs4(html_bytes, 'lxml')

    # res = soup.findAll('script') # find all scripts..

    pattern = re.compile(r"swc_market_lists\s+=\s+(\{.*?\})")
    script = soup.find("script", text=pattern)

    return script.text[23:]

test1 = get_data()

json_data = json.loads(test1)

pprint(json_data['items']) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...