Рекурсивная настройка веб-пространства Python (следующая страница)

#python #selenium #web-scraping #lxml

#python #selenium #очистка веб-пространства #lxml

Вопрос:

с этого веб-сайта:https://search2.ucl.ac.uk/s/search.html ?запрос = max amp;collection=website-metaamp;profile=_directoryamp;tab=directoryamp;f.Профиль Тип|g=Student amp;start_rank=1

Мне нужно очистить следующие страницы 2, 3 … используя Selenium или LXML. Я могу очистить только первую страницу

Ответ №1:

Вы можете попробовать это:

 nextNumberIsThere = True
i=1
while nextNumberIsThere:
    driver.execute_script("document.body.scrollHeight");
    profileDetails = driver.find_elements_by_xpath("//ul[@class='profile-details']/li")
    for element in profileDetails:
        print(element.text)
    next = driver.find_elements_by_xpath("//a[text()='" str(i) "']")
    i =1
    if len(next) > 0:
        next[0].click()
    else:
        nextNumberIsThere = False
  

Приведенный выше код будет повторяться и извлекать данные до тех пор, пока не останется ни одного числа.

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

 nextNumberIsThere = True
i=1
while nextNumberIsThere:
    driver.execute_script("document.body.scrollHeight");
    profileDetails = driver.find_elements_by_xpath("//ul[@class='profile-details']")
    for element in profileDetails:
        name = element.find_element_by_xpath("./li[@class='fn']")
        department = element.find_elements_by_xpath("./li[@class='org']")
        email = element.find_element_by_xpath("./li[@class='email']")
        print(name.text)
        print(department.text)
        print(email.text)
        print("------------------------------")
        next = driver.find_elements_by_xpath("//a[text()='" str(i) "']")
    i =1
    if len(next) > 0:
        next[0].click()
    else:
        nextNumberIsThere = False
  

Я надеюсь, что это поможет…

Ответ №2:

Комментарии:

1. да, я уже сделал это, но я не могу знать, когда остановиться, я имею в виду, равна ли последняя страница 50 или 40; поскольку я создам цикл для количества страниц, доступных для каждого имени, я не знаю, сколько страниц для каждого имени: например, если мы ищем ‘alex’ search2.ucl.ac.uk/s /…

2. Я думаю, вы не можете увидеть более 50 результатов для данного запроса. Если это так, вы могли бы уточнить свои запросы и использовать также доступные сортировки, пока ваши результаты поиска не будут <= 50

Ответ №3:

Обычным решением такого рода проблем является не использование цикла, который перебирает «все страницы» (потому что вы не знаете, сколько их изначально), а скорее наличие какой-то очереди, где очистка одной страницы необязательно добавляет последующие страницы в очередь, которые будут удалены позже.

В вашем конкретном примере во время очистки каждой страницы вы могли бы искать ссылку на «следующую страницу» и, если она там есть, добавлять URL следующей страницы в очередь, чтобы она была очищена после текущей страницы; как только вы попадете на страницу без ссылки «следующая страница», очередь опустеет и очистка прекратится. Более сложный пример может включать очистку страницы категории и добавление каждой из ее подкатегорий в качестве последующей страницы в очередь очистки, каждая из которых, в свою очередь, может добавлять в очередь несколько страниц элементов и т.д.

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

Первый пример на домашней странице Scrapy показывает именно ту функциональность, которую вы пытаетесь реализовать:

 class BlogSpider(scrapy.Spider):
    name = 'blogspider'
    start_urls = ['https://blog.scrapinghub.com']

    def parse(self, response):
        for title in response.css('.post-header>h2'):
            yield {'title': title.css('a ::text').get()}

        for next_page in response.css('a.next-posts-link'):
            yield response.follow(next_page, self.parse)
  

Одно важное замечание о Scrapy: он не использует Selenium (по крайней мере, не готовый), а скорее загружает исходный код страницы и анализирует его. Это означает, что он не запускает JavaScript, что может быть проблемой для вас, если веб-сайт, который вы очищаете, сгенерирован клиентом. В этом случае вы могли бы изучить решения, которые сочетают Scrapy и Selenium (быстрый поиск в Google показывает множество из них, а также ответы StackOverflow относительно этой проблемы), или вы могли бы придерживаться своего кода очистки Selenium и реализовать механизм очередей самостоятельно, без Scrapy.

Комментарии:

1. Для веб-сайта, который он очищает, это не сработает, так как next кнопка никогда не исчезает. Фактически, после страницы 5 next просто перенаправьте на пятую страницу снова, и цикл никогда не заканчивается. Одним из вариантов может быть проверка, идентичны ли результаты со страницы предыдущим, или просто очистить первые 5 страниц, или 50 результатов, как я бы предложил. Я бы уточнил запросы и использовал сортировки, если я заинтересован в сборе как можно большего количества данных