Питон - Селен следующая страница

1

Я пытаюсь сделать скребковое приложение, чтобы очистить Hants.gov.uk, и сейчас я работаю над ним, просто нажимая на страницы, а не на соскабливание. Когда он добирается до последней строки на странице 1, он просто остановился, поэтому я сделал это, нажав кнопку "Следующая страница", но сначала он должен вернуться к исходному URL. Он нажимает на страницу 2, но после того, как страница соскабливается, она не переходит на страницу 3, она просто перезапускает страницу 2.

Может кто-нибудь помочь мне решить эту проблему?

Код:

import time
import config # Don't worry about this. This is an external file to make a DB
import urllib.request
from bs4 import BeautifulSoup
from selenium import webdriver

url = "https://planning.hants.gov.uk/SearchResults.aspx?RecentDecisions=True"

driver = webdriver.Chrome(executable_path=r"C:\Users\Goten\Desktop\chromedriver.exe")
driver.get(url)

driver.find_element_by_id("mainContentPlaceHolder_btnAccept").click()

def start():
    elements = driver.find_elements_by_css_selector(".searchResult a")
    links = [link.get_attribute("href") for link in elements]

    result = []
    for link in links:
        if link not in result:
            result.append(link)
        else:
            driver.get(link)
            goUrl = urllib.request.urlopen(link)
            soup = BeautifulSoup(goUrl.read(), "html.parser")
            #table = soup.find_element_by_id("table", {"class": "applicationDetails"})
            for i in range(20):
                pass # Don't worry about all this commented code, it isn't relevant right now
                #table = soup.find_element_by_id("table", {"class": "applicationDetails"})
                #print(table.text)
            #   div = soup.select("div.applicationDetails")
            #   getDiv = div[i].split(":")[1].get_text()
            #   log = open("log.txt", "a")
            #   log.write(getDiv + "\n")
            #log.write("\n")

start()
driver.get(url)

for i in range(5):
    driver.find_element_by_id("ctl00_mainContentPlaceHolder_lvResults_bottomPager_ctl02_NextButton").click()
    url = driver.current_url
    start()
    driver.get(url)
driver.close()
Теги:
web-scraping
selenium
selenium-webdriver
webdriver

3 ответа

1
Лучший ответ

попробуй это:

import time
# import config # Don't worry about this. This is an external file to make a DB
import urllib.request
from bs4 import BeautifulSoup
from selenium import webdriver

url = "https://planning.hants.gov.uk/SearchResults.aspx?RecentDecisions=True"

driver = webdriver.Chrome()
driver.get(url)

driver.find_element_by_id("mainContentPlaceHolder_btnAccept").click()

result = []


def start():
    elements = driver.find_elements_by_css_selector(".searchResult a")
    links = [link.get_attribute("href") for link in elements]
    result.extend(links)

def start2():
    for link in result:
        # if link not in result:
        #     result.append(link)
        # else:
            driver.get(link)
            goUrl = urllib.request.urlopen(link)
            soup = BeautifulSoup(goUrl.read(), "html.parser")
            #table = soup.find_element_by_id("table", {"class": "applicationDetails"})
            for i in range(20):
                pass # Don't worry about all this commented code, it isn't relevant right now
                #table = soup.find_element_by_id("table", {"class": "applicationDetails"})
                #print(table.text)
            #   div = soup.select("div.applicationDetails")
            #   getDiv = div[i].split(":")[1].get_text()
            #   log = open("log.txt", "a")
            #   log.write(getDiv + "\n")
            #log.write("\n")


while True:
    start()
    element = driver.find_element_by_class_name('rdpPageNext')
    try:
        check = element.get_attribute('onclick')
        if check != "return false;":
            element.click()
        else:
            break

    except:
        break

print(result)
start2()
driver.get(url)
  • 0
    Да, но код также требуется для проверки каждого приложения тоже. Есть 7 на каждой странице
  • 0
    это проверка. я использовал цикл
Показать ещё 9 комментариев
1

Согласно URL- https://planning.hants.gov.uk/SearchResults.aspx?RecentDecisions=True чтобы просмотреть все страницы, вы можете использовать следующее решение:

  • Блок кода:

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
    options = Options()
    options.add_argument("start-maximized")
    options.add_argument("disable-infobars")
    options.add_argument("--disable-extensions")
    driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
    driver.get('https://planning.hants.gov.uk/SearchResults.aspx?RecentDecisions=True')
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.ID, "mainContentPlaceHolder_btnAccept"))).click()
    numLinks = len(WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "div#ctl00_mainContentPlaceHolder_lvResults_topPager div.rdpWrap.rdpNumPart>a"))))
    print(numLinks)
    for i in range(numLinks):
        print("Perform your scrapping here on page {}".format(str(i+1)))
        WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@id='ctl00_mainContentPlaceHolder_lvResults_topPager']//div[@class='rdpWrap rdpNumPart']//a[@class='rdpCurrentPage']/span//following::span[1]"))).click()
    driver.quit()
    
  • Консольный выход:

    8
    Perform your scrapping here on page 1
    Perform your scrapping here on page 2
    Perform your scrapping here on page 3
    Perform your scrapping here on page 4
    Perform your scrapping here on page 5
    Perform your scrapping here on page 6
    Perform your scrapping here on page 7
    Perform your scrapping here on page 8
    
  • 0
    Хотя это прекрасная идея, я хотел бы решить эту задачу, используя в основном собственный код, но я просто пытаюсь понять это :) Спасибо, хотя
  • 0
    @FeitanPortor Мы ни осведомлены о вашем требовании , ни о вашем USECASE. Вы подняли свой вопрос, и участники пытаются помочь вам в своем собственном качестве. Не стесняйтесь использовать либо код, либо логику внутри :) это будет ваш выбор
Показать ещё 1 комментарий
0

Привет @Feitan Portor, вы написали код абсолютно идеально, единственная причина, по которой вы перенаправлены на первую страницу, - это то, что вы url = driver.current_url в последнем цикле, где он является URL-адресом, который остается статическим, и только java скрипт, который инициирует следующее событие click, поэтому просто удалите url = driver.current_url и driver.get(url)

и вам хорошо идти, я тоже проверил себя, чтобы получить текущую страницу, которую ваш скребок просто добавляет эту часть в цикл for, чтобы вы узнали, где находится ваш скребок:

ss = driver.find_element_by_class_name('rdpCurrentPage').text
    print(ss)

Надеюсь, это решает ваше замешательство

  • 0
    Я получаю сообщение об ошибке pastebin.com/jZPCpdjB Ему удается попасть на страницу 2, но не более

Ещё вопросы

Сообщество Overcoder
Наверх
Меню