Я хочу парсить ссылки компаний, скрытые под ссылками _doPostBack

У меня есть этот веб-сайт (https://www.nfrc.co.uk/search-members), я хочу нажать «Найти подрядчика по кровельным работам сейчас», затем «Внутренняя недвижимость», а затем «Поиск». Появляется много страниц, мне просто нужно спрятать ссылки под всеми названиями компаний и перемещаться по всем страницам. У меня нет опыта программирования. Буду признателен, если кто-нибудь предоставит мне код Python для очистки этих ссылок.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
from bs4 import BeautifulSoup
import pandas as pd
import time

# Setup Chrome options
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--start-maximized")  # Maximize the browser window

# Initialize Selenium WebDriver using ChromeDriverManager
driver = webdriver.Chrome(service=webdriver.chrome.service.Service(ChromeDriverManager().install()), options=chrome_options)

# Initialize an empty list to store company data
company_data = []

# Function to wait and click with retry
def wait_and_click(driver, by, value, retries=3):
for _ in range(retries):
    try:
        element = WebDriverWait(driver,20).until(EC.element_to_be_clickable((by, value)))
        driver.execute_script("arguments[0].scrollIntoView(true);", element)
        element.click()
        return True
    except Exception as e:
        print(f"Error clicking element {value}: {e}")
        time.sleep(2)  # Wait before retrying
return False

    # Open the NFRC website
driver.get("https://www.nfrc.co.uk/search-members")

    # Click on "Search for a roofing contractor now"
wait_and_click(driver, By.LINK_TEXT, "Search for a roofing contractor now")

    # Click to open the dropdown for contractor type selection
 dropdown_locator = (By.CLASS_NAME, "sfDropdownList")
 wait_and_click(driver, By.CLASS_NAME, "sfDropdownList")

    # Select "For a Domestic Property" from the dropdown
 wait_and_click(driver, By.XPATH, '//[@id = "MainContent_C001_contractorType"]/option[@value = "CONTRACTOR_ADVANCED_DOMESTIC_PROPERTY_VIEW"]')

    # Select "Pitched Roof"
wait_and_click(driver, By.XPATH, '//*[@id = "MainContent_C001_rblRoofType"]/li[1]/label')

    # Proceed to the next step
wait_and_click(driver, By.ID, "MainContent_C001_btnSearch")

    # Add a delay to ensure the page loads completely after 
clicking search button
time.sleep(5)  # Adjust the time delay as needed

Я попробовал этот код, он работает до появления списков, а дальше понятия не имею.

Использовали ли вы ChatGPT или другой искусственный интеллект для создания рассматриваемого кода?

Barry the Platipus 30.06.2024 18:19

Да, я использовал ChatGPT.

Maira Zafar 30.06.2024 18:22
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
2
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это должно помочь вам пройти большую часть пути.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException
import time

options = webdriver.ChromeOptions()
options.add_argument("--start-maximized")

driver = webdriver.Chrome(service=webdriver.chrome.service.Service(ChromeDriverManager().install()), options=chrome_options)

def wait_and_click(driver, by, value, retries=3):
    for _ in range(retries):
        try:
            element = WebDriverWait(driver,20).until(EC.element_to_be_clickable((by, value)))
            driver.execute_script("arguments[0].scrollIntoView(true);", element)
            element.click()
            return True
        except Exception as e:
            print(f"Error clicking element {value}: {e}")
            time.sleep(2)
    return False

driver.get("https://www.nfrc.co.uk/search-members")

wait_and_click(driver, By.LINK_TEXT, "Search for a roofing contractor now")

wait_and_click(driver, By.CLASS_NAME, "sfDropdownList")

wait_and_click(driver, By.XPATH, '//option[@value = "CONTRACTOR_ADVANCED_DOMESTIC_PROPERTY_VIEW"]')

wait_and_click(driver, By.ID, "MainContent_C001_btnSearch")

WebDriverWait(driver,20).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".search_results")))

while True:
    index = 0

    # Can't just iterate over list of elements because when return to page these elements are stale.
    #
    while True:
        results = driver.find_elements(By.CSS_SELECTOR, "h3 > a")

        try:
            results[index].click()
        except IndexError:
            # Exhausted all results on page.
            break

        try:
            link = driver.find_element(By.CSS_SELECTOR, "#ctl00_MainContent_C004_radListView_ctrl0_tr4 td.details_item > a")
            print(link.get_attribute("href"))
        except NoSuchElementException:
            # No URL on contractor page.
            pass

        # Return to search results.
        driver.back()

        index += 1

    paginate = driver.find_elements(By.CSS_SELECTOR, "#ctl00_MainContent_C001_radListView_radDataPager1 a")

    for next in range(len(paginate)):
        page = paginate[next]
        if page.get_attribute("onclick") == "return false;":
            print("⏩ Move to next page!")
            paginate[next+1].click()
            break

driver.close()

Вот как выглядят результаты для первых нескольких страниц результатов поиска:

http://www.1stchoiceroofingbristol.co.uk/                                                                                                                                                                                               
https://www.1stroofingltd.co.uk/                                                                                                                                                                                                        
https://www.3aroofing.co.uk/                                                                                                                                                                                                            
http://www.aeelkins.co.uk/                                                                                                                                                                                                              
⏩ Move to next page!                                                                                                                                                                                                                   
https://www.armstrongroofing.expert/                                                                                                                                                                                                    
https://www.acwhyte.co.uk/                                                                                                                                                                                                              
https://www.adlangandsons.co.uk/                                                                                                                                                                                                        
https://www.aehughes.com/                                                                                                                                                                                                               
https://www.aj-developments.co.uk/                                                                                                                                                                                                      
⏩ Move to next page!                                                                                                                                                                                                                   
https://www.alkingroofing.co.uk/                                                                                                                                                                                                        
http://www.sneddonroofing.co.uk/                                                                                                                                                                                                        
https://www.taylorroofing.co.uk/                                                                                                                                                                                                        
https://www.awilsonroofing.co.uk/                                                                                                                                                                                                       
https://www.aaharrisonandsons.co.uk/                                                                                                                                                                                                    
⏩ Move to next page!                                                                                                                                                                                                                   
https://www.abaulroofing.com/                                                                                                                                                                                                           
https://abcroofinglimited.co.uk/                                                                                                                                                                                                        
http://www.absroofing.co.uk/                                                                                                                                                                                                            
https://www.aesroofing.co.uk/                                                                                                                                                                                                           
http://www.a1feltroofing.co.uk/                                                                                                                                                                                                         
⏩ Move to next page!                                                                                                                                                                                                                   
https://www.a1roofspec.co.uk/                                                                                                                                                                                                           
https://www.aaaroofing.co.uk/                                                                                                                                                                                                           
https://www.abbeyroofing.co.uk/                                                                                                                                                                                                         
https://www.abbeymillhomes.co.uk/                                                                                                                                                                                                       
http://www.acroofingservices.co.uk/                                                                                                                                                                                                     
⏩ Move to next page!

Я вижу, что вы включили pandas, так что, вероятно, вы захотите накопить URL-адреса, а затем в конце создать фрейм данных, возможно, сохранив его в файл CSV.

Кроме того, основной цикл нумерации страниц по-прежнему нуждается в чистой точке выхода. У меня не было времени ждать, пока он обработает все страницы результатов. Вы должны поймать любое возникающее исключительное событие, а затем аккуратно выйти из бесконечного цикла нумерации страниц.

Большое спасибо, что предоставили мне этот код. Это сработало как шарм и было невероятно полезно :)

Maira Zafar 02.07.2024 20:23

Другие вопросы по теме