【问题标题】:How do you properly search using BS4?您如何使用 BS4 正确搜索?
【发布时间】:2022-01-13 19:43:18
【问题描述】:

我仍在学习 python,并认为一个好的项目是制作 Instagram Scraper。一开始我想尝试抓取 Kylie Jenners 的头像,我以为我会使用 BS4 进行搜索,但后来我遇到了一个问题。

import requests
from bs4 import BeautifulSoup as bs

instagramUser = input('Input Instagram Username: ')
url = 'https://instagram.com/' + instagramUser
r = requests.get(url)

soup = bs(r.text, 'html.parser')


profile_image = soup.find('img', class_ = "_6q-tv")['src']

print(profile_image)

在我声明 profile_image 的那一行,我收到一条错误消息:

第 12 行,在 profile_image = soup.find('img', class_ = "_6q-tv")['src'] TypeError: 'NoneType' 对象不可下标

我不确定为什么它不起作用,我的猜测是我在 Instagram 上阅读了错误的 html 并且搜索不正确。我想问比我更有经验的人我做错了什么,任何帮助将不胜感激:)

【问题讨论】:

    标签: python html web-scraping beautifulsoup


    【解决方案1】:

    您可以将第 12 行的内容分解为两个命令:

    image_tag = soup.find('img', class_ = "_6q-tv")
    profile_image = image_tag['src']
    

    错误

    第 12 行,在 profile_image = soup.find('img', class_ = "_6q-tv")['src'] TypeError: 'NoneType' object is not subscriptable

    表示第一个命令的结果是None,也就是Python的null值,代表没有值。该值没有实现下标运算符 ([]),因此,它不可下标。

    原因可能是soup.find 没有找到任何符合您搜索条件的标签并返回None

    要调试此问题,我建议您将源代码写入文件并使用您选择的文本编辑器(或直接在交互式 Python 控制台中)检查该文件。这样,您就可以看到您的 Python 程序“看到”了什么。如果您改用浏览器中的开发人员工具,您会在执行一堆 JavaScript 后看到网页的状态,但 BeautifulSoup 却忽略了 JavaScript 代码。它只是按原样从服务器获取文档。

    正如 bushcat69 的回答所暗示的,从 Instagram 抓取内容可能很困难,因此您最好选择一个更简单的网站,该网站不使用那么多 JavaScript 和防止网络抓取的保护措施。

    【讨论】:

      【解决方案2】:

      Instagram 的内容是通过 javascript 加载的,因此像这样抓取它是行不通的。它还有很多停止抓取的方法,因此如果不使用 Selenium 之类的浏览器自动化浏览器,您将很难抓取它。

      您可以通过打开浏览器的开发者工具 - 网络 - 获取/XHR 并重新加载页面来查看导航到页面时发生的情况,在那里您可以看到所有其他已加载的内容,有时是易于访问的后端 api可见,它会加载您想要的数据并且可以被抓取(遗憾的是 Instagram 不是这种情况,它受到严格保护)

      【讨论】:

        猜你喜欢
        • 2021-06-03
        • 2021-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多