#python #selenium #web-scraping #lxml
#python #selenium #очистка веб-пространства #lxml
Вопрос:
Мне нужно очистить следующие страницы 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:
Измените start_rank
URL-адрес. Например:
Комментарии:
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 результатов, как я бы предложил. Я бы уточнил запросы и использовал сортировки, если я заинтересован в сборе как можно большего количества данных