Невозможно очистить данные внутри тега div с веб-сайта, для которого требуются поисковые данные - PullRequest
1 голос
/ 03 октября 2019

Я новичок в поиске в сети и хочу получить названия соответствующих проектов с этого сайта результатов поиска. Имена проектов находятся внутри тегов h4

Веб-сайту требуются логин и пароль для просмотра деталей проекта, но я просто хочу получить список всех проектов.

После осмотра я понял,чтобы проанализировать результаты, я должен дать ввод из кода. Я использую следующий код:

import requests
from bs4 import BeautifulSoup as bs

headers = {
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',
    'Sec-Fetch-Mode': 'navigate',
    'Sec-Fetch-User': '?1',
    'Referer': 'https://www.devex.com/login?return_to=https%3A%2F%2Fwww.devex.com%2Ffunding%2Fr%3Freport%3Dgrant-21475%26query%255B%255D%3Dbig%2Bdata%26filter%255Bstatuses%255D%255B%255D%3Dforecast%26filter%255Bstatuses%255D%255B%255D%3Dopen%26filter%255Bupdated_since%255D%3D2019-09-02T04%253A57%253A27.714Z%26sorting%255Border%255D%3Ddesc%26sorting%255Bfield%255D%3D_score',
}

params = (
    ('report', 'grant-21475'),
    ('query[]', 'big data'),
    ('filter[statuses][]', ['forecast', 'open']),
    ('filter[updated_since]', '2019-09-02T04:57:27.714Z'),
    ('sorting[order]', 'desc'),
    ('sorting[field]', '_score'),
)

response = requests.get('https://www.devex.com/funding/r', headers=headers, params=params)

result = bs(response.text, 'html.parser')

Получаемый результат не содержит обязательных тегов или информации. Пожалуйста, дайте мне знать.

Спасибо,

1 Ответ

1 голос
/ 03 октября 2019

Контент возвращается динамически после вызова API, который вы можете найти на вкладке сети браузера

import requests

r = requests.get('https://www.devex.com/api/funding_projects?query[]=big+data&filter[statuses][]=forecast&filter[statuses][]=open&filter[updated_since]=2019-09-03T14:27:15.234Z&page[number]=1&page[size]=1000&sorting[order]=desc&sorting[field]=_score').json()
titles = [project['title'] for project in r['data']]
print(len(titles))

Вы можете изменить параметры страницы в цикле и размере страницы. Первый запрос скажет вам, сколько всего результатов. Я просто поместил число больше ожидаемого количества результатов в этом случае.

Пример цикла:

import requests
import math

titles = []
page_size = 500

with requests.Session() as s:
    r = s.get(f'https://www.devex.com/api/funding_projects?query[]=big+data&filter[statuses][]=forecast&filter[statuses][]=open&filter[updated_since]=2019-09-03T14:27:15.234Z&page[number]=1&page[size]={page_size}&sorting[order]=desc&sorting[field]=_score').json()
    total = int(r['total'])
    titles += [project['title'] for project in r['data']]
    if total > page_size:
        num_pages = math.ceil(total/page_size)
        for page in range(2, num_pages+1):
            r = s.get(f'https://www.devex.com/api/funding_projects?query[]=big+data&filter[statuses][]=forecast&filter[statuses][]=open&filter[updated_since]=2019-09-03T14:27:15.234Z&page[number]={page}&page[size]={page_size}&sorting[order]=desc&sorting[field]=_score').json()
            titles += [project['title'] for project in r['data']]
print(len(set(titles)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...