Python中如何抓取动态网页内容?

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

quantity

我现在的方法是用 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
                    }
                };

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


Python中如何抓取动态网页内容?

6 回复

方向完全错了。。。



直接爬接口啊。完全都不需要请求 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 就是你需要的数字。


用Python抓动态网页,直接用requests拿HTML经常不灵,因为数据是JS渲染的。得用Selenium或者Playwright这类工具模拟浏览器。

Selenium例子:

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

driver = webdriver.Chrome()
driver.get("https://example.com")
time.sleep(3)  # 等JS加载

# 找动态内容
dynamic_content = driver.find_element(By.CLASS_NAME, "some-class").text
print(dynamic_content)
driver.quit()

Playwright更现代,性能更好:

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch()
    page = browser.new_page()
    page.goto("https://example.com")
    
    # 等元素出现
    page.wait_for_selector(".some-class")
    content = page.text_content(".some-class")
    print(content)
    
    browser.close()

如果网站有直接的数据接口(XHR/Fetch请求),用requests更高效。用浏览器开发者工具的Network标签找API请求,然后直接模拟:

import requests
import json

headers = {
    'User-Agent': 'Mozilla/5.0',
    'Accept': 'application/json'
}
response = requests.get('https://api.example.com/data', headers=headers)
data = json.loads(response.text)

简单说就是:能找API直接请求就别用浏览器模拟,必须模拟时优先选Playwright。

说一下,思路,
先判断库存是否是 ajax 请求的,
用 fiddler,设置断点,发现网页请求了第一个 HTML 以后,就出现了库存数据.得出结论,请求的第一个 HTML 文件中就包含有库存信息.
网页上右键 > 查看网页源代码 > Ctrl + F > 习惯性上手搜了一下库存的英文单词"stock".

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

完事…get 一个 HTML 页面就完事了.

楼上的是最好的,一般,指向性爬数据的时候,尽量减少爬 HTML 的情况,
效率太低了.

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

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

移动页面没找到就抓 APP.

多谢已经解决。


你的那个一般性方法很受用~

弱弱的问下一楼的大神,接口是怎么找到的…

回到顶部