Сценарий соскабливания Селена в Красивый суп

#python-3.x #web-scraping #beautifulsoup

Вопрос:

Всем привет, поэтому этот сценарий ниже предназначен для Selenium, но он очень медленный и невыполним для большого количества URL-адресов может ли кто-нибудь сказать, как преобразовать его в быстрый сценарий Bs4, и может ли красивый суп Соскоб Нажать, чтобы отобразить кнопки? Спасибо всем вам за помощь мне!

 from selenium import webdriver
import time
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
chrome_path = r"C:UserslenovoDownloadschromedriver_win32 (5)chromedriver.exe"
driver = webdriver.Chrome(chrome_path)

driver.maximize_window()
driver.implicitly_wait(10)

driver.get("https://www.autotrader.ca/a/ram/1500/hamilton/ontario/19_12052335_/?showcpo=ShowCpoamp;ncse=noamp;ursrc=plamp;urp=2amp;urm=8amp;sprx=-2")
wait =WebDriverWait(driver,30)


driver.find_element_by_xpath('//button[@class="close-button"]').click()
option = wait.until(EC.element_to_be_clickable((By.XPATH,"//a[text()= 'Click to show']")))
driver.execute_script("arguments[0].scrollIntoView(true);",option)
option.click()
time.sleep(10)

Name = driver.find_element_by_xpath('//p[@class="hero-title"]')
Number = driver.find_element_by_xpath('//div[@class="card-body"]')
print(Name.text,Number.text)
 

Ответ №1:

Вам действительно не нужно использовать selenium здесь, вы можете просто использовать запросы, так как номер телефона, который вы ищете, находится в HTML (просто не виден).

Если вы нажмете на «просмотреть источник страницы» в своем браузере, вы сможете ctrl f узнать номер телефона:

введите описание изображения здесь

Так что вам не нужно эмулировать браузер и нажимать кнопки — все есть!

Теперь давайте посмотрим, как мы можем очистить эти данные, просто используя requests (или любой другой http-клиент, например httpx или aiohttp ):

 import requests
import re

url = "https://www.autotrader.ca/a/ram/1500/hamilton/ontario/19_12052335_/?showcpo=ShowCpoamp;ncse=noamp;ursrc=plamp;urp=2amp;urm=8amp;sprx=-2"
# we need to pretend that our request is coming from a web browser to get around anti-bot protection by setting user agent string header to a web-browsers one
# in this case we use windows chrome browser user agent string (you can find these online)
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'}

# here we make request for html page
response = requests.get(url, headers=headers)

# now we can use regex patterns to find phone number
phone_number = re.findall('"phoneNumber":"([d-] )"', response.text)
["905-870-7127"]
description = re.findall('"description":"(. ?)"', response.text)
['2011 Ram 1500 Sport Crew Cab v8 5.7L - Fully loaded, Crew cab, leather heated/air-conditioned seats, heated leather steering wheel, 5’7 ft box w/ tonneau cover.']
 

Шаблоны регулярных выражений-это немного работы, чтобы сначала разобраться в себе. Я предлагаю погуглить «учебник по регулярному выражению на python», если вы хотите узнать больше, но я могу объяснить шаблон, который мы здесь используем: мы хотим записать все в двойных кавычках, которые следуют "phoneNumber":" за строкой и являются либо цифрой (помечено как d ), либо тире (помечено как просто - ).

Выполнение этого сценария запросов займет всего несколько секунд и практически не потребует вычислительных ресурсов. Однако одна вещь, на которую следует обратить внимание при использовании http-клиента по сравнению с эмуляцией браузера Selenium, — это блокировка ботов, которая часто требует довольно большой работы по разработке, хотя повышение производительности действительно того стоит!

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

1. Большое спасибо, мужчина, за вашу помощь, очень ценю это! один вопрос, хотя я также пытаюсь очистить имя с помощью этой стратегии name = re.findall(‘»описание»:»([ ])»‘, ответ.текст), но вывод-это ничто. Можем ли мы сделать вывод в этой форме «Имя, номер телефона» в одной строке, я имею в виду

2. @AlianNadeem для описания вам нужен немного другой шаблон регулярных выражений — см. Мое редактирование.

3. Большое спасибо, приятель, за то, что помог мне Работать именно так, как я хотел

4. Ваш код работает действительно хорошо, но когда я меняю URL-адрес и какое-либо другое регулярное выражение на него, он не работает. Вы можете посмотреть мой последний пост или перейти по ссылке ниже. извлекаю имя и номер так же, как и раньше. kijijiautos.ca/vip/22686710 Это новая ссылка.