Пример URL для сканирования: www.yelp.com/biz/dallas-marketing-rockstar-dallas?adjust_creative=3cZu3ieq3omptvF-Yfj2ow&utm_campaign=yelp_api_v3&utm_medium=api_v3_business_search&utm_source=3cZu3ieq3omptvF-Yfj2ow'
Мой код:
def get_websites():
for yso in Company.objects.filter(crawled=False, source='YAG'):
r = requests.get(yso.url)
soup = BeautifulSoup(r.content, 'lxml')
if soup.select_one(".g-recaptcha") != None:
sys.exit("Captcha")
soup_select = soup.select_one("a[href*='biz_redir']")
try:
yso.website = soup_select.text
print('website for %s added' % (yso.website))
except Exception as e:
print(e)
print('no website for %s added' % yso.name)
if not yso.crawled:
yso.crawled = True
yso.save()
Использование lxml
и html.parser
с селектором CSS soup.select_one("a[href*='biz_redir']")
возвращает None
, а также soup.select("a[href*='biz_redir']")
— пустой список, а soup.find_all("a[href*='biz_redir']")
— пустой список.
lxml version 4.5.0
beautifulsoup version 4.9.3
Редактировать: Замена "a[href*='biz_redir']"
на просто a
приводит к тому же результату. Есть нечто более фундаментально неправильное, чем синтаксис, если синтаксис вообще неправильный.
Данные загружаются динамически, поэтому requests
не поддерживает это. Однако на сайте ссылка загружается в формате JSON, вы можете извлечь ее с помощью модуля json
.
import re
import json
import requests
from bs4 import BeautifulSoup
URL = "https://www.yelp.com/biz/dallas-marketing-rockstar-dallas?adjust_creative=3cZu3ieq3omptvF-Yfj2ow&utm_campaign=yelp_api_v3&utm_medium=api_v3_business_search&utm_source=3cZu3ieq3omptvF-Yfj2ow%27"
soup = BeautifulSoup(requests.get(URL).content, "html.parser")
script = soup.select_one(
"#wrap > div.main-content-wrap.main-content-wrap--full > yelp-react-root > script"
).string
json_data = json.loads(re.search(r"({.*})", script).group(1))
print(
"https://yelp.com"
+ json_data["bizDetailsPageProps"]["bizContactInfoProps"]["businessWebsite"]["href"]
)
Альтернативой может быть использование Selenium для очистки страницы, которая поддерживает динамический контент.
Установите его с помощью: pip install selenium
.
Загрузите правильный ChromeDriver из здесь.
from time import sleep
from selenium import webdriver
from bs4 import BeautifulSoup
URL = "https://www.yelp.com/biz/dallas-marketing-rockstar-dallas?adjust_creative=3cZu3ieq3omptvF-Yfj2ow&utm_campaign=yelp_api_v3&utm_medium=api_v3_business_search&utm_source=3cZu3ieq3omptvF-Yfj2ow%27"
driver = webdriver.Chrome(r"c:\path\to\chromedriver.exe")
driver.get(URL)
# Wait for the page to fully render
sleep(5)
soup = BeautifulSoup(driver.page_source, "html.parser")
print("https://yelp.com" + soup.select_one("a[href*='biz_redir']")["href"])
driver.quit()
Выход:
https://yelp.com/biz_redir?url=https%3A%2F%2Fwww.rockstar.marketing&website_link_type=website&src_bizid=CodEpKvY8ZM7IbCEWxpQ0g&cachebuster=1607826143&s=d214a1df7e2d21ba53939356ac6679631a458ec0360f6cb2c4699ee800d84520