#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 Это новая ссылка.