【问题标题】:Beautiful soup. Scraping multiple urls with Python3美丽的汤。使用 Python3 抓取多个 url
【发布时间】:2018-04-03 02:56:01
【问题描述】:

当我运行以下代码时...

import requests
from bs4 import BeautifulSoup

counter = []
url = 'https://www.somemuseum.org/exhibitions/current-exhibitions'
req = requests.get(url)
soup = BeautifulSoup(req.text, 'html.parser')
links = soup.find_all(href="{{ card.url }}")
counter.append(links)
print(counter)

它返回...

<a class="card card--exhibit {{ card.type }}" href="{{ card.url }}">

检查网站上的相同元素显示它存储为...

<a href="/exhibitions/listings/2018/current-listing" class="card card--exhibit is-tier1">

我想做的是类似于以下的for loop...

for link in links:
    if card.type=="is-tier1":
        exhibit = soup.get('card.url')
        counter.append(exhibit)

我是 Beautiful Soup 的新手,因此不胜感激。谢谢。

【问题讨论】:

    标签: python-3.x beautifulsoup python-requests


    【解决方案1】:

    很遗憾,BeautifulSoup 无法获取 href 数据,因为它们是由 js 渲染的。但是,您有几个选择。

    第一个选项是selenium
    Selenium 运行 js 并且有选择 html 元素的方法,但是它非常缓慢和沉重。

    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
    
    
    url = "https://www.metmuseum.org/exhibitions/current-exhibitions"
    driver = webdriver.Firefox()
    driver.get(url)
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'a.card')))
    elements = driver.find_elements_by_css_selector('a.is-tier1')
    links = [e.get_attribute("href") for e in elements]
    driver.quit()
    

    第二种选择是使用 api。
    数据通过 xhr 请求加载到/api/Exhibitions/CurrentExhibitionsListing。您可以直接从 api 请求数据,并以 json 格式获取结果。

    import requests
    
    url = 'https://www.metmuseum.org/api/Exhibitions/CurrentExhibitionsListing?location=main|breuer|cloisters&page=1'
    req = requests.get(url)
    results = req.json()['results']
    links = [
        'https://www.metmuseum.org' + i['url'] 
        for i in results if i['type'] == 'is-tier1'
        ]
    

    两种方法产生相同的结果,但我会使用第二种方法,因为它更快。

    【讨论】:

    • 谢谢。这完美地工作。只是想知道,你在哪里找到了 Met 的 API 链接?在初步检查他们的网站时,我没有看到此列表。
    • 是的,对不起,我忘了提。据我所知,它不是公共 api。我通过在浏览器中检查网络流量发现了它。
    猜你喜欢
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 2019-05-05
    相关资源
    最近更新 更多