我试图从一个网页(网址如下)刮产品的链接.该页面使用的是JavaScript.我try 了不同的库,但链接没有显示在结果中(这些链接的格式是*/product/*,当你打开下面的URL时,你可以通过将鼠标悬停在产品链接上看到).

url = 'https://www.bcliquorstores.com/product-catalogue?categoryclass=coolers%20%26%20ciders&special=new%20product&sort=name.raw:asc&page=1'

headers = {
    'Host': 'www.bcliquorstores.com',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/111.0',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
    'Accept-Language': 'en-US,en;q=0.7,fa;q=0.3',
}

使用requests个库:

import requests
res = requests.get(url, headers=headers)

使用urllib个库

import urllib.request
request = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(request)
response.read().decode()

使用requests_html个库:

from requests_html import HTMLSession, AsyncHTMLSession
asession = AsyncHTMLSession()
r = await asession.get(url, headers=headers)
await r.html.arender()
res = r.html.html

当我在结果中搜索字符串/product/时,找不到它,但从Inspect窗口中可以看到它.

我知道selenium,但我只想在没有其他方法的情况下使用它.

推荐答案

这类网站通常不会使用任何形式的防刮擦保护措施,因为它们需要向尽可能多的客户展示他们的产品.

如果页面是动态的(就像您的问题中的页面),则它只能通过HTTP请求或WebSocket连接接收数据.它很容易获得.

在浏览器中打开Web判断器(F12),然后重新加载有问题的url页.您可以看到,页面加载后,浏览器向其他API端点(.../ajax/...)发出请求.在"网络"选项卡中可以看到.

因此,您可以创建一个非常简单的脚本来使用该端点:

import requests


def print_product_urls():
    resp = requests.get(
        'https://www.bcliquorstores.com/ajax/browse?special=new+product&'
        'categoryclass=coolers+&+ciders&sort=name.raw:asc&size=24&page=1',
        headers={
            'Accept': 'application/json, text/plain, */*',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                          'AppleWebKit/537.36 (KHTML, like Gecko) '
                          'Chrome/111.0.0.0 Safari/537.36',
        }
    )
    for product in resp.json()['hits']['hits']:
        print(f'https://www.bcliquorstores.com/product/{product["_id"]}')


if __name__ == '__main__':
    print_product_urls()

除了使用Selify或其他库运行Java脚本之外,没有其他方法

你好

Javascript相关问答推荐

被CSS优先级所迷惑

jQuery提交按钮重新加载页面,即使在WordPress中使用preventDefault()

我怎么在JS里连续加2个骰子的和呢?

使用Google API无法进行Web抓取

如何创建返回不带`new`关键字的实例的类

在我的index.html页面上找不到我的Java脚本条形图

如何在HTMX提示符中设置默认值?

如何在和IF语句中使用||和&;&;?

如果NetSuite中为空,则限制筛选

设置复选框根据选中状态输入选中值

JavaScript:多个图像错误处理程序

JQuery使用选项填充HTMLSELECT并设置默认结果,默认结果显示为空

如何将对象推送到firestore数组?

当达到高度限制时,如何裁剪图像?使用html和css

如何使pdf.js上的文本呈现为可选?

在对象的嵌套数组中添加两个属性

try 导入material 时出现错误NG0203

为什么Reaction useEffect函数会将控制台日志(log)呈现两次

如何在点击2秒后用JavaScript动态改变按钮上的图标?

使用EXCEL.js模块+node.js分隔标题行中的列