Python 刮痧:可以';t爬行应用商店评论页面
大家好,我在从app store获取此页面数据时遇到了一些问题: 我想首先检索一个字符串,显示用户对应用程序的评分。它们位于一个带有class=“we star rating ember view we-customer-review\uu rating we star rating--large”的图形标记内,是属性@aria label的名称 这是我的密码:Python 刮痧:可以';t爬行应用商店评论页面,python,ios,web-scraping,scrapy,app-store,Python,Ios,Web Scraping,Scrapy,App Store,大家好,我在从app store获取此页面数据时遇到了一些问题: 我想首先检索一个字符串,显示用户对应用程序的评分。它们位于一个带有class=“we star rating ember view we-customer-review\uu rating we star rating--large”的图形标记内,是属性@aria label的名称 这是我的密码: from scrapy import Selector import requests html = requests.get(
from scrapy import Selector
import requests
html = requests.get('https://apps.apple.com/us/app/mathy-cool-math-learner-games/id1476596747#see-all/reviews').content
sel = Selector(text = html)
sel.xpath('//figure[@class="we-star-rating ember-view we-customer-review__rating we-star-rating--large"]/@aria-label').extract()
但它只返回前3个匹配项:
['5 out of 5', '5 out of 5', '5 out of 5']
我想要的是从该页面的所有评论中检索所有可用的评分
有人能给我一个线索吗?这个问题
前三个评论是作为HTML的一部分加载的,但其余的是通过javascript加载的。这就是为什么你只能得到前三个结果
我不完全确定这是否是您使用scrapy的全部代码。我很想知道你为什么要选那一部分
因此,使用javascript进行设计是现代网站抓取的一个重要组成部分。我不完全确定你是否主要是在用“刮痧”来拉网。不过,有几个选项可以使用scrapy处理javascript
关于动态Web抓取的信息
首先要知道,现在的网站在动态地获取信息,使用javascript调用HTTP请求,称为AJAX请求(异步javascript和XHTML)。这会向API/服务器发出post或get HTTP请求,HTTP响应会返回信息。在本例中,他们已将3个结果预加载到HTML中,但在使用javascript加载页面时要求查看其余结果
一般来说,有两种方法可以处理面向javascript的网站
curl.trillworks.com
的站点将其转换为一种不错的python格式
现在,查看预览数据是值得的,因为您必须使用请求来处理这些数据。您将得到一个JSON对象,您可以从HTTP get请求的接受部分看出这一点,即application/JSON
把这个请求复制到curl.trillworks.com。我们有下面的例子
编码示例
我在上面提到过,有时需要标题和参数。您可以在这里使用requestget方法,看看是什么获取了数据。在本例中,您需要参数和标题。情况并非总是如此,因此您应该始终执行一个简单的请求。get()
,而不执行任何操作,然后构建它。json()
方法将json对象格式化为python字典,以便我们可以轻松访问数据
现在,当我说查看预览时,会为我们提供访问数据所需的键和值。有时数据可以嵌套得很深。在这种情况下,它不是,所以我们现在考虑在这个字典上循环以获得我们想要的所有数据。我们必须发出两个HTTP请求,一个偏移量为0,另一个偏移量为10,以获得完整的20星评级
最后一个代码示例
输出
代码解释
范围(0,20,10)
来得到它。对于每个参数,我们使用头和这些特定参数发出一个HTTPGET请求
response.json()
data
键中,如下所示。如果您打印此文件,您将得到以下输出
data=response.json()['data']
打印(数据)
import requests
headers = {
'Accept': 'application/json',
'Referer': 'https://apps.apple.com/us/app/mathy-cool-math-learner-games/id1476596747',
'Authorization': 'Bearer eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IldlYlBsYXlLaWQifQ.eyJpc3MiOiJBTVBXZWJQbGF5IiwiaWF0IjoxNTk2NTc1NTY4LCJleHAiOjE2MTIxMjc1Njh9.jnEuBNEVWhKGqI10W6dfhJFtYJtd74Nbu1NueZrPgYjU2K34LwXPQClcus8S9Jit5ayK5MOr0bIpcDx821RI4Q',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
}
params = (
('l', 'en-US'),
('offset', '1'),
('platform', 'web'),
('additionalPlatforms', 'appletv,ipad,iphone,mac'),
)
response = requests.get('https://amp-api.apps.apple.com/v1/catalog/us/apps/1476596747/reviews', headers=headers params=params)
response.json()
import requests
headers = {
'Accept': 'application/json',
'Referer': 'https://apps.apple.com/us/app/mathy-cool-math-learner-games/id1476596747',
'Authorization': 'Bearer eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IldlYlBsYXlLaWQifQ.eyJpc3MiOiJBTVBXZWJQbGF5IiwiaWF0IjoxNTk2NTc1NTY4LCJleHAiOjE2MTIxMjc1Njh9.jnEuBNEVWhKGqI10W6dfhJFtYJtd74Nbu1NueZrPgYjU2K34LwXPQClcus8S9Jit5ayK5MOr0bIpcDx821RI4Q',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
}
for i in range(0,20,10):
params = (
('l', 'en-US'),
('offset', f'{i}'),
('platform', 'web'),
('additionalPlatforms', 'appletv,ipad,iphone,mac'),
)
response = requests.get('https://amp-api.apps.apple.com/v1/catalog/us/apps/1476596747/reviews', params=params)
data = response.json()['data']
for a in data:
print(a['attributes']['rating'])
5
5
5
5
5
...