我尝试在Python中使用requests和BeautifulSoup来抓取这个页面,但是页面是Javascript,所以我包含了问题的两个标签。
https://untappd.com/v/southern-cross-kitchen/469603
和其他人喜欢它,但它有一个“显示更多”按钮。我想避免使用无头浏览器,所以我去窥探背后的JavaScript,看看我是否可以找到一个URL,获取或发布请求。
经过一些检查,下面是按钮的代码:
<a class="yellow button more show-more-section track-click" data-href=":moremenu" data-menu-id="78074484" data-section-id="286735920" data-track="venue" data-venue-id="469603" href="javascript:void(0);">
并通过此函数进行控制和重定向:
$(document).on("click", ".show-more-menu-section", (function() {
var e = $(this);
$(e).hide();
var t = $(this).attr("data-venue-id"),
a = $(this).attr("data-menu-id"),
n = $(".section-area .menu-section").length;
return $(".section-loading").addClass("active"), $.ajax({
url: "/venue/more_menu_section/" + t + "/" + n,
type: "GET",
data: "menu_id=" + a,
dataType: "json",
error: function(t) {
$(".section-loading").removeClass("active"), $(e).show(), $.notifyBar({
html: "Hmm. Something went wrong. Please try again!",
delay: 2e3,
animationSpeed: "normal"
})
},
success: function(t) {
$(".section-loading").removeClass("active"), "" == t.view ? $(e).hide() : (trackMenuView("viewMoreMenuSection"), t.count >= 15 ? ($(e).show(), $(".section-area").append(t.view)) : $(".section-area").append(t.view), handleNew())
}
})
包含在https://assets.untappd.com/assets/v3/js/venue/venue.menu.min.js?v=2.7.10中
因此,对于函数中所需的值,t
、a
和n
为:
t = 469603
n = 78074484
a = 1
我现在尝试使用函数的url
部分构造url,该函数为:
url: "/venue/more_menu_section/" + t + "/" + n
使用https://www.untappd.com
作为我的基本URL,我尝试了以下URL,但没有成功:/venue/more_menu_section/469603/1?data=%7B%22menu_id%22%3A%2278074484%22%7D
/venue/more_menu_section/469603/1?data%3D%7B%22menu_id%22%3A78074484%7D
/venue/more_menu_section/469603/1?data=%7B%22menu_id%22%3A78074484%7D
/venue/more_menu_section/469603/1?data={"menu_id":78074484}
因此,我无法通过编程来获取数据。我真的希望避免使用webdrivers和headless浏览器来模拟点击,所以我猜这应该可以通过GET请求来实现。创建该url被证明是一个挑战。
我怎样才能创建正确的网址获取?
1条答案
按热度按时间kxkpmulp1#
因此,对于函数中所需的值,
t
、a
和n
为:我想您混淆了
n
和a
的值,但是如何获得n
呢?在JS代码中,它计算可以使用.section-area .menu-section
进行css选择的元素的数量[基本上,显示的菜单部分的数量] -它真的只有1吗?而且你不需要在你的url中添加
data=..
-键值对 insidedata
应该在?key1=value1&key2=value2...
[URL encoded ofc]这样的查询中用和号连接,所以在本例中只需要?menu_id={a}
。但是,获得正确的URL是不够的-您设置了正确的头吗?如果我查看网络日志,您需要设置
'accept': 'application/json'
和'x-requested-with': 'XMLHttpRequest'
以获得JSON响应[$.value
中包含html],并且您应该设置一些user agent [如'user-agent': 'Mozilla/5.0'
]以不被阻止。而且,我在网络日志中注意到的URL(具体来说是Southern Cross Kitchen page)似乎更像是**
/venue/more_menu/{venue_id}/{n}?section_id={section_id}
**格式-我得到了一个空的$.value
,两者都有/venue/more_menu_section/469603/1?menu_id=78074484
*)形成的链接,以及/more_menu/
链接(*/venue/more_menu_section/469603/1?section_id=286735920
*),但是我在
jData['value']
中得到了一个html string with 3 more items,其中(
mmUrl
刚刚从网络日志中复制-可能是sectionId更改了?)完整示例
我把它 Package 在一个函数(
scrape_untappd_menu
)中,因为我发现它更方便,特别是在错误处理方面。(如果您尝试运行此命令,请不要忘记包含
selectForList
。)你可以称之为一个单一的地点
或者,如果您想从多个地点抓取菜单:
您还可以将结果保存为CSV(使用下面的
pandas
):