请教一个抓取动态网页内容的问题

2019-01-03 11:03:30 +08:00
 woshichuanqilz

我想抓取这个页面上, 下拉框里面内容的最大的一个数字(就是选择 quantity 那里)。但是这个数字在 html 里面一开始是没有显示的。 在点击下拉按钮之后才会出现需要的内容。

我现在的方法是用 selenium 模拟点击这个按钮然后抓取。 但是速度很慢。

所以考虑用 scrapy 抓取的话, 就比较理想。

我做了如下尝试:

  1. 我跟了一下 chrome 的 network, 在点击那个按钮的时候没有新的网络内容的加载. 说明这个 quantity 的内容已经加载好了。
  2. 我在 eventlistener 里面跟了点击事件的处理 js 的函数, 对 js 不是特别的熟悉, 但是看这里似乎没有需要的信息。
      var r = function() {
                    var r = this;
                    n && k(n) && n.apply(this, arguments);
                    var o = Array.prototype.slice.call(arguments);
                    try {
                        var a = o.map(function(e) {
                            return Be(e, t)
                        });
                        return e.handleEvent ? e.handleEvent.apply(this, a) : e.apply(this, a)
                    } catch (e) {
                        throw Fe += 1,
                        setTimeout(function() {
                            Fe -= 1
                        }),
                        i.withScope(function(n) {
                            return l(r, void 0, void 0, function() {
                                var r = this;
                                return c(this, function(a) {
                                    return n.addEventProcessor(function(e) {
                                        return l(r, void 0, void 0, function() {
                                            var n;
                                            return c(this, function(r) {
                                                return n = s({}, e),
                                                t.mechanism && (n.exception = n.exception || {},
                                                n.exception.mechanism = t.mechanism),
                                                n.extra = s({}, n.extra, {
                                                    arguments: V(o, 2)
                                                }),
                                                [2, n]
                                            })
                                        })
                                    }),
                                    i.getCurrentHub().captureException(e, {
                                        originalException: e
                                    }),
                                    [2]
                                })
                            })
                        }),
                        e
                    }
                };

所以这里求助一下, 我的这个尝试的方向是不是正确下面应该怎么走?

1965 次点击
所在节点    Python
5 条回复
yuanfnadi
2019-01-03 11:21:41 +08:00
方向完全错了。。。



直接爬接口啊。完全都不需要请求 html



https://www.noon.com/_svc/catalog/api/product/N14772965V?slug=ask-spr-tig-3-4-waist-band-tights-white&offerCode=c1b02b19114fb58f&offerId=0&shippingCountryCode=AE&lang=en


返回键结果中的


product -> variants -> offers -> stock 就是你需要的数字。
xiaocsl
2019-01-03 11:22:18 +08:00
说一下,思路,
先判断库存是否是 ajax 请求的,
用 fiddler,设置断点,发现网页请求了第一个 HTML 以后,就出现了库存数据.得出结论,请求的第一个 HTML 文件中就包含有库存信息.
网页上右键 > 查看网页源代码 > Ctrl + F > 习惯性上手搜了一下库存的英文单词"stock".

看到数据
sku_config":"N14967100V","stock":10,"price":"107.95","sale_price":"42.10"

完事..get 一个 HTML 页面就完事了.
xiaocsl
2019-01-03 11:25:31 +08:00
楼上的是最好的,一般,指向性爬数据的时候,尽量减少爬 HTML 的情况,
效率太低了.

打开 F12 过一遍 XHR 对象 完事.

找不到就去访问移动页面找.

移动页面没找到就抓 APP.
woshichuanqilz
2019-01-03 15:07:19 +08:00
@yuanfnadi @xiaocsl 多谢已经解决。


@xiaocsl 你的那个一般性方法很受用~
andrewTeller
2019-01-03 19:43:10 +08:00
弱弱的问下一楼的大神,接口是怎么找到的......

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/523384

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX