Ошибка «NoneType» при веб-скрейпинге StockTwits

Я пытаюсь написать скрипт, который просто читает и печатает все тикеры в списке наблюдения за конкретными учетными записями. Мне удалось перейти на страницу, напечатать имя пользователя из HTML, и теперь я хочу напечатать все тикеры, за которыми он следует, используя find(), чтобы найти их местоположение, затем .find_all(), чтобы найти каждый тикер, но каждый раз Я пытаюсь использовать команду find() для перехода к бегущим строкам списка наблюдения, которые она возвращает «NoneType».

Вот мой код:

import requests
import xlwt
from xlutils.copy import copy
from xlwt import Workbook
import xlrd
import urllib.request as urllib2
from bs4 import BeautifulSoup

hisPage = ("https://stocktwits.com/GregRieben/watchlist")

page = urllib2.urlopen(hisPage)

soup = BeautifulSoup(page, "html.parser")

his_name = soup.find("span", {"class":"st_33aunZ3 st_31YdEUQ st_8u0ePN3 st_2mehCkH"})

name = his_name.text.strip()
print(name)

watchlist = soup.find("div", {"class":"st_16989tz"})

tickers = watchlist.find_all('span', {"class":"st_1QzH2P8"})

print(type(watchlist))
print(len(watchlist))

Здесь мне нужно выделенное значение (LSPD.CA) и все остальные после него (все они имеют одинаковую настройку HTML)

выделенное значение

Вот моя ошибка:

Ошибка


person TheSauceMaestro    schedule 07.08.2019    source источник


Ответы (1)


Этот контент динамически добавляется из вызова API (поэтому он не присутствует в вашем запросе на исходный URL-адрес, где DOM не обновляется, как это было бы при использовании браузера). Вы можете найти вызов API для списка наблюдения в сетевом трафике. Он возвращает json. Вы можете извлечь из этого то, что хотите.

import requests

r = requests.get('https://api.stocktwits.com/api/2/watchlists/user/396907.json').json()
tickers = [i['symbol'] for i in r['watchlist']['symbols']]
print(tickers)

Если вам нужно получить идентификатор пользователя для перехода к API, он присутствует в нескольких местах в ответ на ваш исходный URL-адрес. Я использую регулярное выражение для захвата тега скрипта

import requests, re

p = re.compile(r'subjectUser":{"id":(\d+)')

with requests.Session() as s:
    r = s.get('https://stocktwits.com/GregRieben/watchlist')
    user_id = p.findall(r.text)[0]
    r = s.get('https://api.stocktwits.com/api/2/watchlists/user/' + user_id + '.json').json()
    tickers = [i['symbol'] for i in r['watchlist']['symbols']]
print(tickers)
person QHarr    schedule 07.08.2019
comment
Единственный способ получить это через json? - person TheSauceMaestro; 07.08.2019
comment
Это простой способ. Все бегунки есть. Более дорогими накладными расходами было бы использование автоматизации браузера, такой как селен, - person QHarr; 07.08.2019
comment
Есть ли способ получить доступ к этому шестизначному числу в конце где-либо еще в HTML? Попытка сделать эту работу для небольшого списка людей. - person TheSauceMaestro; 07.08.2019
comment
ids = [i['id'] for i в r['watchlist']['symbols']] они присутствуют в json. Предположим, это то, что вы имели в виду. - person QHarr; 07.08.2019
comment
Спасибо, наконец, какую форму [i['id'] for i... вы используете. очевидно, это цикл for, но как я могу научиться использовать этот тип формы - person TheSauceMaestro; 07.08.2019
comment
Кроме того, я говорил об имени/номере пользователя 396907 в URL-адресе. Как бы я мог получить этот # где-нибудь еще, если это возможно. - person TheSauceMaestro; 07.08.2019