Python 我如何从本网站获取这些信息?
我找到了这个链接: 原文是: 我试图用Python计算整个目录中所有项目的价格,但似乎找不到这些项目的价格。每当我转到下一页时,URL都不会更改。我已经试着检查了网站本身,但我找不到任何东西 第一个URL是可以刮取的,我在一个论坛上随机找到了它。用户是如何获得所有这些文本数据的Python 我如何从本网站获取这些信息?,python,html,web-scraping,Python,Html,Web Scraping,我找到了这个链接: 原文是: 我试图用Python计算整个目录中所有项目的价格,但似乎找不到这些项目的价格。每当我转到下一页时,URL都不会更改。我已经试着检查了网站本身,但我找不到任何东西 第一个URL是可以刮取的,我在一个论坛上随机找到了它。用户是如何获得所有这些文本数据的 注:我知道该网站是为儿童开设的,但我通过在网站上出售limiteds来赚钱。请不要做出严厉的判断 您可以使用selenium控制浏览器。它可以为您提供项目和子项目(以及更多)的竞争。您可以在firefox上按alt
注:我知道该网站是为儿童开设的,但我通过在网站上出售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文件(它不包含实际的 表数据)
BeautifulSoup
,因为它只能看到“基本”的HTML模板。这通常是使用Selenium
模拟真实浏览会话的地方
要返回到roblox页面,此页面是第二种类型
我建议的方法(这是我最喜欢的方法,在我看来,应该是您经常首先尝试的方法),只需要确定潜在的web API脚本正在向哪些web API脚本发出请求,然后模拟请求以获取所需的数据。这是我最喜欢的方法,因为这些web API通常提供JSON,这对于解析来说很简单。它非常干净,因为您只需要一个第三方模块(请求
)
第一步是记录浏览器对资源的所有流量/请求。我将使用Google Chrome,但其他现代浏览器可能也有类似的功能:
https://www.roblox.com/catalog/?Category=2&Subcategory=2&SortType=4
)XMLHttpRequest
或
XHR
资源是与服务器交互的对象。我们希望
只查看XHR资源,因为它们可能与
网络API)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
>>>