Python BeautifulSoup не возвращает все теги html - PullRequest
0 голосов
/ 01 апреля 2020

Я использовал код, который извлекает данные о недвижимости с веб-сайта. Мой код работает нормально, но он извлекает данные только для 30 контейнеров, в то время как доступно более 3000 контейнеров. Я узнал, что мой красивый суп не получает все html метки

Мой код:

import requests
from bs4 import BeautifulSoup

r = requests.get("https://www.magicbricks.com/property-for-sale/residential-real-estate?proptype=Multistorey-Apartment,Builder-Floor-Apartment,Penthouse,Studio-Apartment,Residential-House,Villa,Residential-Plot&Locality=OMR-Road&cityName=Chennai",
                 headers={'User-agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0'})
c = r.content
bs = BeautifulSoup(c,"html5lib")
# print(bs.prettify())
soup = bs.findAll("div", {"class": "flex relative clearfix m-srp-card__container"})
print(len(soup))

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

Страница загружается через JavaScript динамически, поэтому я смог отследить запрос XHR, из которого отображаются данные. Вы можете позвонить прямо. ниже приведен пример получения первых 10 страниц.

import requests
from bs4 import BeautifulSoup

params = {
    'propertyType_new': '10002_10003_10021_10022,10001_10017,10000',
    'localityNameSEO': 'Old Mahabalipuram Road',
    'postedSince': '1',
    'localityName': 'OMR Road',
    'city': '5196',
    'searchType': '1',
    'propertyType': '10002,10003,10021,10022,10001,10017,10000',
    'disWeb': 'Y',
    'pType': '10002,10003,10021,10022,10001,10017,10000',
    'category': '5',
    'localityId': '89568',
    'cusImgCount': '0',
    'groupstart': '28',
    'maxOffset': '107',
    'attractiveIds': '',
    'ltrIds': '47881083,47881047',
    'preCompiledProp': '',
    'excludePropIds': '',
    'addpropertyDataSet': ''
}


def main(url):
    with requests.Session() as req:
        for item in range(1, 11):
            params['page'] = item
            r = req.get(url, params=params)
            soup = BeautifulSoup(r.content, 'html.parser')
            # now parse what you want


main("https://www.magicbricks.com/mbsearch/propertySearch.html")
0 голосов
/ 01 апреля 2020

Это потому, что веб-сайт использует JavaScript для загрузки элементов при прокрутке вниз.

Первый подход - это циклический просмотр страниц:

import requests
from bs4 import BeautifulSoup
try:
        url = 'https://www.magicbricks.com/property-for-sale/residential-real-estate?proptype=Multistorey-Apartment,Builder-Floor-Apartment,Penthouse,Studio-Apartment,Residential-House,Villa,Residential-Plot&Locality=OMR-Road&cityName=Chennai&page={}'
        divs = []
        for page_num in range (1,100):
                print(f'Getting page {page_num}')
                url      = url.format(page_num)
                response = requests.get(url,headers={'User-agent': 'Mozilla/5.0'})
                soup = BeautifulSoup(response.content,"html.parser")
                divs.extend(soup.findAll("div",{"class":"flex relative clearfix m-srp-card__container"}))
        print(len(divs))
except Exception as e:
        print(e)

Второй подход - симуляция прокрутки браузера с помощью селена:

from time import sleep
from selenium import webdriver

def ScrollDown(driver,interal=5,looper=5000):
    scroll_delay = interal
    count = 0

    ''' Get scroll height'''

    last_height = driver.execute_script("return document.body.scrollHeight")

    while count < looper:
        print('Scrolling down to bottom loop {}/{}'.format(count+1,looper))
        ''' Scroll down to bottom'''
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

        ''' Wait to load page'''
        print('sleeping {} secs'.format(interal))
        sleep(scroll_delay)

        ''' Calculate new scroll height and compare with last scroll height'''
        new_height = driver.execute_script("return document.body.scrollHeight")

        if new_height == last_height:
            break

        last_height = new_height
        count += 1


url = 'https://www.magicbricks.com/property-for-sale/residential-real-estate?proptype=Multistorey-Apartment,Builder-Floor-Apartment,Penthouse,Studio-Apartment,Residential-House,Villa,Residential-Plot&Locality=OMR-Road&cityName=Chennai'


driver = webdriver.Chrome()
try:
        driver.get(url)
        ScrollDown(driver)
        divs = driver.find_elements_by_css_selector('div[class="flex relative clearfix m-srp-card__container"]')
        print(len(divs))
except Exception as e:
        print(e)
finally:
        if driver is not None :
                driver.close()
...