Селен и прекрасный суп, возвращающие разные значения len () на том же сайте Scrape (amazon) - PullRequest
2 голосов
/ 15 марта 2020

В приведенном ниже примере кода я получаю разные результаты для элемента print(len(block1)) в конце кода. Кажется, я не могу понять, что вызывает это:

  • мой код,
  • загрузка страницы с помощью Selenium,
  • какой-то метод защиты от царапин, который использует Amazon или
  • глупость, по которой я скучаю.

Мои десять последних результатов были

LOG: 3/14/2020 - 2:30pm EDT 
Length Results for 10 separate runs:
0 / 20 / 55 / 25 / 57 / 55 / 6 / 59 / 54 / 39
# python version: 3.8.1
#Import necessary modules
from selenium import webdriver # version 3.141.0
from bs4 import BeautifulSoup # version 4.8.2

#set computer path and object to chrome browser
chrome_path = r"C:\webdrivers\chromedriver.exe"
browser = webdriver.Chrome(chrome_path)

# search Amazon for "bar+soap"
# use 'get' for URL request and set object to variable "source"
browser.get("https://www.amazon.com/s?k=soap+bar&ref=nb_sb_noss_2")
source = browser.page_source

#use Beautiful Soup to parse html
page_soup = BeautifulSoup(source, 'html.parser')

#set a variable "block1" to find all "a" tags that fit criteria
block1 = page_soup.findAll("a", {"class":"a-size-base"})

#print the number of tags pulled
print(len(block1))

1 Ответ

1 голос
/ 15 марта 2020

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

Сначала я получал совсем другие результаты, поэтому я добавил 7 se c wait после загрузки страницы. Это сделало вещи более стабильными, поэтому возможно, что некоторые элементы просто загружаются дольше, а когда вы считаете, не на странице.

Это не полностью решило проблему. Я все еще получаю разные результаты, за 10 пробежек я получил 64 (2), 65 (6), 67 (2). Я рекомендую вам:

  1. попробовать добавить и увеличить sleep и посмотреть, как он себя ведет;
  2. попробовать распечатать результаты и посмотреть, в чем разница между прогонами ;
  3. потенциально, просто используйте результат, который вы получаете чаще всего, потому что многие веб-сайты запускают продукт A / B-тесты и может быть несколько вариантов пользовательского интерфейса / контента для одной и той же страницы или разных компоненты одной и той же страницы (это, скорее всего, наш случай). Поэтому каждый раз, когда мы запускаем скрипт, мы попадаем в определенный вариант A / B или, возможно, комбинацию вариантов, что приводит к этим результатам.

На всякий случай, мой код:

#Import necessary modules
from selenium import webdriver
from bs4 import BeautifulSoup
from time import sleep

#set computer path and object to chrome browser
browser = webdriver.Chrome()

# use 'get' for URL request and set object to variable "source"
browser.get("https://www.amazon.com/s?k=soap+bar&ref=nb_sb_noss_2")
sleep(7)
source = browser.page_source

#use Beautiful Soup to parse html
page_soup = BeautifulSoup(source, 'html.parser')

#set a variable "block1" to find all "a" tags that fit criteria
block1 = page_soup.findAll("a", {"class":"a-size-base"})
#print the number of tags pulled
print('BS', len(block1))

# To be save, let's also count with pure Selenium:
e = browser.find_elements_by_css_selector('a.a-size-base')
print('SEL', len(e))

Надеюсь, это поможет, удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...