Неполная очистка BeautifulSoup при использовании Selenium - PullRequest
2 голосов
/ 11 мая 2019

Я пытаюсь очистить раздел обзора Backcountry.com.Сайт использует раздел динамической загрузки, то есть URL-адрес не меняется, когда вы хотите загрузить больше отзывов.Я использую веб-драйвер Selenium для взаимодействия с кнопкой, которая загружает больше отзывов, и BeautifulSoup для очистки отзывов.

Мне удалось успешно взаимодействовать с кнопкой «загрузить больше» и загрузить все доступные обзоры.Я также смог отсканировать начальные отзывы, которые появляются перед тем, как вы попробуете загрузить кнопку «больше».

РЕЗЮМЕ: Я могу взаимодействовать с кнопкой «Загрузить больше», я могу отсканировать исходные доступные обзоры, но не могу отсканировать все доступные обзоры после того, как я загружу все.

Я попытался изменить HTML-теги, чтобы увидеть, если это имеет значение.Я пытался увеличить время сна, если у скребка не было достаточно времени, чтобы завершить свою работу.

# URL and Request code for BeautifulSoup

url_filter_bc = 'https://www.backcountry.com/msr-miniworks-ex-ceramic-water-filter?skid=CAS0479-CE-ONSI&ti=U2VhcmNoIFJlc3VsdHM6bXNyOjE6MTE6bXNy'
res_filter_bc = requests.get(url_filter_bc, headers = {'User-agent' : 'notbot'})


# Function that scrapes the reivews

def scrape_bc(request, website):
    newlist = []
    soup = BeautifulSoup(request.content, 'lxml')
    newsoup = soup.find('div', {'id': 'the-wall'})
    reviews = newsoup.find('section', {'id': 'wall-content'})

    for row in reviews.find_all('section', {'class': 'upc-single user-content-review review'}):
        newdict = {}
        newdict['review']  = row.find('p', {'class': 'user-content__body description'}).text
        newdict['title']   = row.find('h3', {'class': 'user-content__title upc-title'}).text
        newdict['website'] = website

        newlist.append(newdict)

    df = pd.DataFrame(newlist)
    return df


# function that uses Selenium and combines that with the scraper function to output a pandas Dataframe

def full_bc(url, website):
    driver = connect_to_page(url, headless=False)
    request = requests.get(url, headers = {'User-agent' : 'notbot'})
    time.sleep(5)
    full_df = pd.DataFrame()
    while True:
        try:
            loadMoreButton = driver.find_element_by_xpath("//a[@class='btn js-load-more-btn btn-secondary pdp-wall__load-more-btn']")
            time.sleep(2)
            loadMoreButton.click()
            time.sleep(2)
        except:
            print('Done Loading More')

#             full_json = driver.page_source
            temp_df = pd.DataFrame()
            temp_df = scrape_bc(request, website)

            full_df = pd.concat([full_df, temp_df], ignore_index = True)

            time.sleep(7)
            driver.quit()
            break

    return  full_df 

Я ожидаю фрейм данных pandas со 113 строками и тремя столбцами.Я получаю pandas datafram с 18 строками и тремя столбцами.

1 Ответ

0 голосов
/ 11 мая 2019

Хорошо, вы нажали loadMoreButton и загрузили больше отзывов. Но вы продолжаете кормить scrape_bc тем же самым request контентом, который вы скачали один раз, совершенно отдельно от Selenium.

Замените requests.get(...) на driver.page_source и убедитесь, что у вас есть driver.page_source в цикле перед scrape_bc(...) вызовом

request = driver.page_source
temp_df = pd.DataFrame()
temp_df = scrape_bc(request, website)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...