Веб-браузер Python рекурсивно (следующая страница) - PullRequest
0 голосов
/ 06 апреля 2019

с этого сайта: https://search2.ucl.ac.uk/s/search.html?query=max&collection=website-meta&profile=_directory&tab=directory&f.Profile+Type%7Cg=Student&start_rank=1

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

Ответы [ 3 ]

1 голос
/ 07 апреля 2019

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

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

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

0 голосов
/ 07 апреля 2019

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

В вашем конкретном примере во время очистки каждой страницы вы можете найти ссылку на «следующую страницу» и, если она есть, добавить 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.

0 голосов
/ 06 апреля 2019
...