【问题标题】:Scraping a pet adoption site with Beautiful Soup用 Beautiful Soup 刮取宠物收养网站
【发布时间】:2021-08-04 07:56:17
【问题描述】:

我在尝试使用 python 和 Beautiful Soup 抓取详细信息时无法获取此网站中每个宠物的 divhttps://indyhumane.org/adoptable-cats/

当我检查页面并检查 html 源代码时,我看到包含每个宠物配置文件的 div 带有 class = "mbcpp_result_animal",但是当我使用下面的代码时,@ 的长度为零987654325@

from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup

my_url = 'https://indyhumane.org/adoptable-cats/'

uClient = uReq(my_url)

page_html = uClient.read()

uClient.close()

page_soup = soup(page_html, "html.parser")

containers = page_soup.findAll("div",{"class":"mbcpp_result_animal"})

print(len(containers))

如果我打印 page_soup.body,当我在 chrome 的开发人员工具中检查页面时,我看不到任何带有 class="mbcpp_result_animal" 的 div,这与 html 源代码不同。

这是我的第一次网络抓取。所以,我觉得我还没有完全理解这个过程。谁能告诉我我需要做什么来解决这个问题?

【问题讨论】:

    标签: python html web-scraping beautifulsoup


    【解决方案1】:

    因为这来自页面为检索结果和更新页面而进行的额外 API 调用。该调用具有查询字符串参数,您可以看到如下。

    它包括 API 端点、api 密钥、限制搜索的条件和最终随机数参数,大概是为了避免提供缓存结果。你可以引入一个实际的随机数。

    import requests
    
    r = requests.get('https://indyhumane.org/wp-content/plugins/mbc-petpoint/mbc-petpoint-data.php?species_name=cats&sex=A&ageGroup=All&orderBy=ID&primaryBreed=All&secondaryBreed=All&specialNeeds=A&api_key=14j14u8qzj27aqw6tv53k553lxcjff0xf2uh16i61t4s61g727&num_items=-1&apimode=AdoptableSearch&location=&rnd=1')
    r.json()
    

    【讨论】:

    • 感谢您的帮助。所以,如果我需要有关宠物的数据,我认为从技术上讲,这基本上不是网络抓取。正确的?正如您在此处提到的,这只是一个获取请求。
    【解决方案2】:

    在对网站进行初始 GET 请求后,可以更改 DOM。似乎向以下对象发出 GET 请求:

    https://indyhumane.org/wp-content/plugins/mbc-petpoint/mbc-petpoint-data.php
    

    ...带有返回 JSON 正文的参数:

    这会滋润列表项,每只猫一个。您仍然可以使用它,但您的方法可能会有所不同;您可以找到调用相关端点的代码。转到页面源(可能与您在检查器中看到的代码不同),您可以搜索该端点以获取以下 JavaScript(此处格式化):

    var base_url =
        "https://indyhumane.org/wp-content/plugins/mbc-petpoint/mbc-petpoint-data.php";
    var num_items = -1;
    
    function draw_petpoint_adoptable_feed_simple1(species_name) {
        draw_petpoint_adoptable_feed(1, 'AdoptableSearch', base_url,
            '14j14u8qzj27aqw6tv53k553lxcjff0xf2uh16i61t4s61g727',
            '/adopt/profile/', 'cats', 'A', 'All', 'ID', 'All', 'All', 'A', '');
    }
    
    jQuery(document).ready(function() {
        draw_petpoint_adoptable_feed_simple1('cats');
    });
    

    从这里您可以搜索不在 HTML 文件中的draw_petpoint_adoptable_feed,因此您需要在脚本文件中找到它。 Chrome 有一个在源中搜索的便捷功能:

    在该函数中,您可以看到正在发出的 GET 请求。

    请按照 @QHarr 的回答了解如何在 Python 脚本中动态处理此问题。

    【讨论】:

    • 您在回答中提到了许多优点,以帮助我更好地理解该过程。谢谢!
    猜你喜欢
    • 2023-03-13
    • 2018-04-22
    • 2021-10-18
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 2022-07-20
    • 2016-01-09
    • 2021-04-17
    相关资源
    最近更新 更多