Почему селен собирает только первые 12 предметов? - PullRequest
0 голосов
/ 27 января 2020

Я пытаюсь создать веб-скребок для веб-сайта (https://pokemondb.net/pokedex/national), который копирует список изображений и сохраняет их в каталоге. Кажется, все работает, за исключением того, что вместо того, чтобы собирать 800+ предметов, которые, как я надеялся, получится, он берет только 12. Я попытался использовать implicit_wait селена, но, похоже, он не работает. Я хотел бы, чтобы это вычистило каждую фотографию на странице.

Ниже приведен мой код:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
import shutil
import os
import requests

def spritescrape(driver):
    sprites_list = driver.find_elements_by_tag_name('img')
    sprite_srcs = [sprite.get_attribute('src') for sprite in sprites_list]
    return sprite_srcs

def download_images(srcs, dirname):
    for index, src in enumerate(srcs):
        response = requests.get(src, stream=True)
        save_image(response, dirname, index)
    del response

def save_image(image, dirname, suffix):
    with open('{dirname}/img_{suffix}.jpg'.format(dirname=dirname, suffix=suffix), 'wb') as out_file:
        shutil.copyfileobj(image.raw, out_file)

def make_dir(dirname):
    current_path = os.getcwd()
    path = os.path.join(current_path, dirname)
    if not os.path.exists(path):
        os.makedirs(path)

if __name__ == '__main__':
    chromeexe_path = r'C:\code\Learning Python\Scrapers\chromedriver.exe'
    driver = webdriver.Chrome(executable_path=chromeexe_path)
    driver.get(r'https://pokemondb.net/pokedex/national')
    driver.implicitly_wait(10)

    sprite_links = spritescrape(driver)
    dirname = 'sprites'
    make_dir(dirname)
    download_images(sprite_links, dirname)

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

Ответы [ 3 ]

1 голос
/ 27 января 2020

Вам необходимо прокрутить страницы до самого конца. Однако, если вы go перейдете непосредственно к scrollHeight, вы снова потеряете все элементы. Вам нужно использовать бесконечное l oop, медленно прокручивать страницу и добавлять Атрибут elements во время прокрутки, чтобы он никогда не терялся. У меня есть 890 элементов.

Попробуйте следующий код.

from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://pokemondb.net/pokedex/national")

sprite_srcs=[]
height=1000
itemsnobefore=len(sprite_srcs)
while True:
    driver.execute_script("window.scrollTo(0," + str(height) + ");")
    sprites_list = driver.find_elements_by_tag_name('img')

    for sprite in sprites_list:
        if sprite.get_attribute('src') not in sprite_srcs:
            sprite_srcs.append(sprite.get_attribute('src'))

    itemsnoafter=len(sprite_srcs)
    #Break the loop when there is no more image tag left
    if itemsnobefore==itemsnoafter:
        break
    itemsnobefore=itemsnoafter
    height=height+500
    time.sleep(0.25)

print(len(sprites_list))
0 голосов
/ 28 января 2020

В элементах сайта используется Ленивая загрузка . Таким образом, чтобы извлечь список src атрибутов изображений, вы должны прокрутить вниз до конца страницы, и вы можете использовать следующие Locator Strategies :

0 голосов
/ 27 января 2020

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

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...