Невозможно получить ожидаемый результат от сайта, отправляющего почтовые запросы - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь получить какой-нибудь json ответ с веб-страницы , используя приведенный ниже скрипт. Вот шаги, чтобы заполнить результат на этом сайте. Нажмите кнопку СОГЛАСОВАТЬ , расположенную внизу этой веб-страницы , а затем кнопку РЕДАКТИРОВАТЬ ПОИСК и наконец-то на ПОКАЗАТЬ РЕЗУЛЬТАТЫ без изменений.

Я пробовал вот так:

import requests
from bs4 import BeautifulSoup

url = 'http://finra-markets.morningstar.com/BondCenter/Results.jsp'
post_url = 'http://finra-markets.morningstar.com/bondSearch.jsp'

payload = {
    'postData': {'Keywords':[]},
    'ticker': '',
    'startDate': '',
    'endDate': '',
    'showResultsAs': 'B',
    'debtOrAssetClass': '1,2',
    'spdsType': ''
}

payload_second = {
    'count': '20',
    'searchtype': 'B',
    'query': {"Keywords":[{"Name":"debtOrAssetClass","Value":"3,6"},{"Name":"showResultsAs","Value":"B"}]},
    'sortfield': 'issuerName',
    'sorttype': '1',
    'start': '0',
    'curPage': '1'
}

with requests.Session() as s:
    s.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36'
    s.headers['Referer'] = 'http://finra-markets.morningstar.com/BondCenter/UserAgreement.jsp'
    r = s.post(url,json=payload)
    s.headers['Access-Control-Allow-Headers'] = r.headers['Access-Control-Allow-Headers']
    s.headers['cf-request-id'] = r.headers['cf-request-id']
    s.headers['CF-RAY'] = r.headers['CF-RAY']
    s.headers['X-Requested-With'] = 'XMLHttpRequest'
    s.headers['Origin'] = 'http://finra-markets.morningstar.com'
    s.headers['Referer'] = 'http://finra-markets.morningstar.com/BondCenter/Results.jsp'
    r = s.post(post_url,json=payload_second)
    print(r.content)

Это результат, который я получаю, когда Я запускаю приведенный выше сценарий:

b'\n\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\n\n\n{}'

Как сделать так, чтобы сценарий заполнял ожидаемый результат с этого сайта?

PS Не могу sh to go для селена, чтобы сделать это.

1 Ответ

2 голосов
/ 01 мая 2020

Ответ на http://finra-markets.morningstar.com/BondCenter/Results.jsp не содержит результатов поиска. Он должен извлекать данные асинхронно.

Простой способ узнать, какие сетевые запросы вернули результаты поиска, - это поиск запросов по одному из результатов поиска с использованием Firefox Dev Tools. :

The search button

Searching the requests

Для преобразования HTTP-запроса в Python запрос, я копирую запрос как метод кода CURL из Firefox, импортирую его в Postman и затем экспортирую как код Python (немного длинно (и лениво), я знаю!):

Copy request as CURL

Import button in Postman

Import CURL request in Postman

The 'code' button in Postman

The dropdown to select the code language in Postman

Все это приводит к следующему коду:

import requests

url = "http://finra-markets.morningstar.com/bondSearch.jsp"

payload = "count=20&searchtype=B&query=%7B%22Keywords%22%3A%5B%7B%22Name%22%3A%22debtOrAssetClass%22%2C%22Value%22%3A%223%2C6%22%7D%2C%7B%22Name%22%3A%22showResultsAs%22%2C%22Value%22%3A%22B%22%7D%5D%7D&sortfield=issuerName&sorttype=1&start=0&curPage=1"
headers = {
    'User-Agent': "...",
    'Accept': "text/plain, */*; q=0.01",
    'Accept-Language': "en-US,en;q=0.5",
    'Content-Type': "application/x-www-form-urlencoded; charset=UTF-8",
    'X-Requested-With': "XMLHttpRequest",
    'Origin': "http://finra-markets.morningstar.com",
    'DNT': "1",
    'Connection': "keep-alive",
    'Referer': "http://finra-markets.morningstar.com/BondCenter/Results.jsp",
    'Cookie': "...",
    'cache-control': "no-cache"
    }

response = requests.request("POST", url, data=payload, headers=headers)

print(response.text)

Ответ не был 100% JSON. Так что я просто убрал внешний пробел и {B:..} часть:

>>> text = response.text.strip()[3:-1]
>>> import json
>>> data = json.loads(text)
>>> data['Columns'][0]                                                                                                             
{'moodyRating': {'ratingText': '', 'ratingNumber': 0},
 'fitchRating': {'ratingText': None, 'ratingNumber': None},
 'standardAndPoorRating': {'ratingText': '', 'ratingNumber': 0},
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...