Python 我如何从本网站获取这些信息?

Python 我如何从本网站获取这些信息?,python,html,web-scraping,Python,Html,Web Scraping,我找到了这个链接: 原文是: 我试图用Python计算整个目录中所有项目的价格,但似乎找不到这些项目的价格。每当我转到下一页时,URL都不会更改。我已经试着检查了网站本身,但我找不到任何东西 第一个URL是可以刮取的,我在一个论坛上随机找到了它。用户是如何获得所有这些文本数据的 注:我知道该网站是为儿童开设的,但我通过在网站上出售limiteds来赚钱。请不要做出严厉的判断 您可以使用selenium控制浏览器。它可以为您提供项目和子项目(以及更多)的竞争。您可以在firefox上按alt

我找到了这个链接:

原文是:

我试图用Python计算整个目录中所有项目的价格,但似乎找不到这些项目的价格。每当我转到下一页时,URL都不会更改。我已经试着检查了网站本身,但我找不到任何东西

第一个URL是可以刮取的,我在一个论坛上随机找到了它。用户是如何获得所有这些文本数据的


注:我知道该网站是为儿童开设的,但我通过在网站上出售limiteds来赚钱。请不要做出严厉的判断

您可以使用selenium控制浏览器。它可以为您提供项目和子项目(以及更多)的竞争。您可以在firefox上按alt i think,然后按developer->Inspector并将鼠标悬停在网页的项目上。它向您显示响应的html文本
python绑定:selenium python.readthedocs.io

您可以在不使用
BeautifulSoup
selenium
的情况下刮取所有项目信息-您只需要
请求
。也就是说,这不是非常直截了当的,所以我将尝试将其细分:

访问URL时,浏览器会向外部资源发出许多请求。这些资源托管在服务器上(或者,现在,托管在多个不同的服务器上),它们构成了浏览器正确呈现网页所需的所有文件/数据。仅举几个例子,这些资源可以是图像、图标、脚本、HTML文件、CSS文件、字体、音频等。仅供参考,在我的浏览器中加载
www.google.com
,总共会向各种资源发出36个请求

您向其发出请求的第一个资源始终是实际的网页本身,因此是一个类似HTML的文件。然后,浏览器通过查看HTML来确定需要向哪些其他资源发出请求

例如,假设该网页包含一个表,其中包含我们想要获取的数据。我们应该问自己的第一件事是“那张桌子是怎么登上那一页的?”。我的意思是,用元素/html标记填充网页有不同的方式。这里有一种方法:

  • 服务器从我们的浏览器接收到对
    page.html
    资源
  • 该资源包含一个表,该表需要数据,因此 服务器与数据库通信以检索数据库的数据 桌子
  • 服务器获取该表数据并将其烘焙到HTML中
  • 最后,服务器向您提供该HTML文件
  • 您收到的是一个带有烘焙表数据的HTML。没有办法 您可以与前面提到的数据库通信- 这是好的和可取的
  • 您的浏览器呈现HTML
在这样的页面中,使用
BeautifulSoup
是标准的操作步骤。您知道您要查找的数据被烘焙到HTML中,因此
BeautifulSoup
将能够看到它

以下是使用元素填充网页的另一种方式:

  • 服务器从我们的浏览器接收到对
    page.html
    资源
  • 该资源需要另一个资源—脚本,它是脚本的工作 在以后某个时间点用数据填充表
  • 服务器向您提供该HTML文件(它不包含实际的 表数据)
当我说“稍后的时间点”时,对于使用实际浏览器查看页面的实际用户来说,这个时间间隔可以忽略不计,而且实际上是不可见的。然而,服务器只为我们提供了一个“基本”的HTML。它只是一个空模板,它依赖于一个脚本来填充它的表。该脚本向web API发出请求,web API使用实际的表数据进行响应。所有这些都需要有限的时间,并且只能在加载脚本资源后开始

在这样的页面中,您不能使用
BeautifulSoup
,因为它只能看到“基本”的HTML模板。这通常是使用
Selenium
模拟真实浏览会话的地方

要返回到roblox页面,此页面是第二种类型

我建议的方法(这是我最喜欢的方法,在我看来,应该是您经常首先尝试的方法),只需要确定潜在的web API脚本正在向哪些web API脚本发出请求,然后模拟请求以获取所需的数据。这是我最喜欢的方法,因为这些web API通常提供JSON,这对于解析来说很简单。它非常干净,因为您只需要一个第三方模块(
请求

第一步是记录浏览器对资源的所有流量/请求。我将使用Google Chrome,但其他现代浏览器可能也有类似的功能:

  • 打开Google Chrome并导航到目标页面 (
    https://www.roblox.com/catalog/?Category=2&Subcategory=2&SortType=4
  • 点击F12打开Chrome开发者工具菜单
  • 单击“网络”选项卡
  • 点击“过滤器”按钮(图标为漏斗状),然后 将筛选器选择从“全部”更改为“XHR”(
    XMLHttpRequest
    XHR
    资源是与服务器交互的对象。我们希望 只查看XHR资源,因为它们可能与 网络API)
  • 单击圆形“记录”按钮(或按CTRL+E)启用 日志记录-一旦启用,图标应变为红色
  • 按CTRL+R刷新页面并开始记录流量
  • 刷新页面后,您应该会看到资源日志开始显示 加满这是浏览器请求的所有资源的列表- 不过,我们只会看到XHR对象,因为我们设置了过滤器(如果 您很好奇,可以将过滤器切换回“全部”以查看 对资源的所有请求列表(已发出)
  • 单击列表中的一个项目。面板应在右侧用s打开
    def get_csrf_token(session):
    
        import re
    
        url = "https://www.roblox.com/catalog/"
    
        response = session.get(url)
        response.raise_for_status()
    
        token_pattern = "setToken\\('(?P<csrf_token>[^\\)]+)'\\)"
    
        match = re.search(token_pattern, response.text)
        assert match
        return match.group("csrf_token")
    
    def get_assets(session, params):
    
        url = "https://catalog.roblox.com/v1/search/items"
    
        response = session.get(url, params=params, headers={})
        response.raise_for_status()
    
        return {"items": [{**d, "key": f"{d['itemType']}_{d['id']}"} for d in response.json()["data"]]}
    
    def get_items(session, csrf_token, assets):
    
        import json
    
        url = "https://catalog.roblox.com/v1/catalog/items/details"
    
        headers = {
            "Content-Type": "application/json;charset=UTF-8",
            "X-CSRF-TOKEN": csrf_token
        }
    
        response = session.post(url, data=json.dumps(assets), headers=headers)
        response.raise_for_status()
    
        items = response.json()["data"]
        return items
    
    def main():
    
        import requests
    
        session = requests.Session()
    
        params = {
            "category": "Collectibles",
            "limit": "60",
            "sortType": "4",
            "subcategory": "Collectibles"
        }
    
        csrf_token = get_csrf_token(session)
        assets = get_assets(session, params)
        items = get_items(session, csrf_token, assets)
    
        first_item = items[0]
    
        for key, value in first_item.items():
            print(f"{key}: {value}")
        
        return 0
    
    
    if __name__ == "__main__":
        import sys
        sys.exit(main())
    
    id: 76692143
    itemType: Asset
    assetType: 8
    name: Chaos Canyon Sugar Egg
    description: This highly collectible commemorative egg recalls that *other* classic ROBLOX level, the one that was never quite as popular as Crossroads.
    productId: 11837951
    genres: ['All']
    itemStatus: []
    itemRestrictions: ['Limited']
    creatorType: User
    creatorTargetId: 1
    creatorName: ROBLOX
    lowestPrice: 400
    purchaseCount: 7714
    favoriteCount: 2781
    >>>