Не удается проанализировать некоторые имена и относящиеся к ним URL-адреса с веб-страницы

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

#python #python-3.x #очистка веб-страниц

Вопрос:

Я создал скрипт на Python, используя requests и BeautifulSoup для анализа имен профилей и ссылок на их имена профилей с веб-страницы. Содержимое, похоже, генерируется динамически, но они присутствуют в исходном коде страницы. Итак, я попробовал со следующим, но, к сожалению, я ничего не получаю.

Дополнительная ссылка

Моя попытка до сих пор:

 import requests
from bs4 import BeautifulSoup

URL = 'https://www.century21.com/real-estate-agents/Dallas,TX'

headers = {
    'accept': 'text/html,application/xhtml xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
    'accept-encoding': 'gzip, deflate, br',
    'accept-language': 'en-US,en;q=0.9,bn;q=0.8',
    'cache-control': 'max-age=0',
    'cookie': 'JSESSIONID=8BF2F6FB5603A416DCFBAB8A3BB5A79E.app09-c21-id8; website_user_id=1255553501;',
    'user-agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
}

def get_info(link):
    res = requests.get(link,headers=headers)
    soup = BeautifulSoup(res.text,"lxml")
    for item in soup.select(".media__content"):
        profileUrl = item.get("href")
        profileName = item.select_one("[itemprop='name']").get_text()
        print(profileUrl,profileName)

if __name__ == '__main__':
    get_info(URL)
  

Как я могу извлечь содержимое с этой страницы?

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

1. Вероятно, вам нужно использовать selenium для этого

Ответ №1:

Требуемый контент доступен в исходном коде страницы. Сайт очень хорош в отбрасывании запросов, когда он выполняется с использованием того же самого user-agent . Итак, я использовал fake_useragent для случайной отправки одних и тех же запросов. Это работает, если вы не используете его постоянно.

Рабочее решение:

 import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin
from fake_useragent import UserAgent

URL = 'https://www.century21.com/real-estate-agents/Dallas,TX'

def get_info(s,link):
    s.headers["User-Agent"] = ua.random
    res = s.get(link)
    soup = BeautifulSoup(res.text,"lxml")
    for item in soup.select(".media__content a[itemprop='url']"):
        profileUrl = urljoin(link,item.get("href"))
        profileName = item.select_one("span[itemprop='name']").get_text()
        print(profileUrl,profileName)

if __name__ == '__main__':
    ua = UserAgent()
    with requests.Session() as s:
        get_info(s,URL)
  

Частичный вывод:

 https://www.century21.com/CENTURY-21-Judge-Fite-Company-14501c/Stewart-Kipness-2657107a Stewart Kipness
https://www.century21.com/CENTURY-21-Judge-Fite-Company-14501c/Andrea-Anglin-Bulin-2631495a Andrea Anglin Bulin
https://www.century21.com/CENTURY-21-Judge-Fite-Company-14501c/Betty-DeVinney-2631507a Betty DeVinney
https://www.century21.com/CENTURY-21-Judge-Fite-Company-14501c/Sabra-Waldman-2657945a Sabra Waldman
https://www.century21.com/CENTURY-21-Judge-Fite-Company-14501c/Russell-Berry-2631447a Russell Berry
  

Ответ №2:

Содержимое страницы НЕ отображается с помощью javascript. В моем случае ваш код в порядке. У вас просто возникла проблема с поиском profileUrl и обработкой nonetype исключения. Вы должны сосредоточиться на a теге, чтобы получить данные

Вы должны попробовать это:

 import requests
from bs4 import BeautifulSoup

URL = 'https://www.century21.com/real-estate-agents/Dallas,TX'

headers = {
    'accept': 'text/html,application/xhtml xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
    'accept-encoding': 'gzip, deflate, br',
    'accept-language': 'en-US,en;q=0.9,bn;q=0.8',
    'cache-control': 'max-age=0',
    'cookie': 'JSESSIONID=8BF2F6FB5603A416DCFBAB8A3BB5A79E.app09-c21-id8; website_user_id=1255553501;',
    'user-agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
}

def get_info(link):
    res = requests.get(link,headers=headers)
    soup = BeautifulSoup(res.text,"lxml")
    results = []
    for item in soup.select(".media__content"):
        a_link = item.find('a')
        if a_link:
            result = {
                    'profileUrl': a_link.get('href'),
                    'profileName' : a_link.get_text()
                }
        results.append(result)
    return results

if __name__ == '__main__':
    info = get_info(URL)
    print(info)
    print(len(info))
  

ВЫВОД:

 [{'profileName': 'Stewart Kipness',
  'profileUrl': '/CENTURY-21-Judge-Fite-Company-14501c/Stewart-Kipness-2657107a'},
  ....,
 {'profileName': 'Courtney Melkus',
  'profileUrl': '/CENTURY-21-Realty-Advisors-47551c/Courtney-Melkus-7389925a'}]

941
  

Ответ №3:

Похоже, вы также можете создать URL-адрес (хотя, кажется, проще просто захватить его)

 import requests
from bs4 import BeautifulSoup as bs

URL = 'https://www.century21.com/real-estate-agents/Dallas,TX'

headers = {
    'accept': 'text/html,application/xhtml xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
    'accept-encoding': 'gzip, deflate, br',
    'accept-language': 'en-US,en;q=0.9,bn;q=0.8',
    'cache-control': 'max-age=0',
    'cookie': 'JSESSIONID=8BF2F6FB5603A416DCFBAB8A3BB5A79E.app09-c21-id8; website_user_id=1255553501;',
    'user-agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
}

r = requests.get(URL, headers = headers)
soup = bs(r.content, 'lxml')
items = soup.select('.media')
ids = []
names = []
urls = []
for item in items:
    if item.select_one('[data-agent-id]') is not None:
        anId = item.select_one('[data-agent-id]')['data-agent-id']
        ids.append(anId)
        name = item.select_one('[itemprop=name]').text.replace(' ','-')
        names.append(name)
        url = 'https://www.century21.com/CENTURY-21-Judge-Fite-Company-14501c/'   name   '-'   anId   'a'
        urls.append(url)

results = list(zip(names,  urls))
print(results)
  

Ответ №4:

Пожалуйста, попробуйте:

 profileUrl = "https://www.century21.com/"   item.select("a")[0].get("href")