2016-10-11 3 views
-1

Я пытаюсь собрать данные с нескольких сайтов, используя Python (BeautifulSoup). Тем не менее, иногда трудно получить доступ к результатам поиска, например:Доступ к динамически созданному содержимому веб-сайта с запросами Python

import requests 
from bs4 import BeautifulSoup 

url1 = 'https://auto.ria.com/legkovie/city/vinnica/?page=1' 
url2= 'https://auto.ria.com/search/?top=11&category_id=1&state[0]=1' 

def get_value(url): 
    r = requests.get(url, headers = {'Accept-Encoding' : 'deflate'}) 
    print("Response Time: {}".format(r.elapsed.total_seconds())) 

    soup = BeautifulSoup(r.text, 'lxml') 
    data = soup.find('span', attrs = {'id' : 'resultsCount'}).find('strong') 
    print('{} \n'.format(data)) 

get_value(url1) 
get_value(url2) 

Выход:

Response Time: 5.4943 
<strong class="count">5 310</strong> 

Response Time: 0.174867 
<strong class="count">0</strong> 

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

+0

«Я полагаю, что результаты поиска можно найти в некотором json»: вы пытались его найти? –

ответ

0

Я рекомендую изменить масштаб объекта супа, чтобы увидеть, что там есть. Вы можете использовать findAll вместо поиска и печати результатов. Вы также можете попробовать удалить последний вызов, чтобы найти (для сильного тега) и распечатать результаты. Когда вы исследуете более крупный объект, вы, вероятно, увидите, что происходит. Это может быть url2 помечается по-разному, и вам придется настроить свою функцию для размещения.

0

Ваш код работает нормально, а url2 возвращает ожидаемый результат. При просмотре исходного кода страницы из хрома:
<span id="resultsCount" class="hide">Найдено <strong class="count">0</strong> объявлений</span>

Это тег, что ваш пытаются найти с красивым супом. Число, отображаемое в хроме и выходе программы, одинаково!

<strong class="count">0</strong> 

Кроме того, результат поиска не возвращается в json. Если вы проверите заголовки ответов:

Content-Type: text/html 

Возможно, вы хотите, чтобы ответ содержал весь тег? Если это так, попробуйте:

data = soup.find('span', attrs = {'id' : 'resultsCount'}) 
Смежные вопросы