如何使用PowerShell从网站搜索页面获取目标产品的URL地址
失效原因
你使用的Invoke-WebRequest仅能获取服务端返回的初始静态HTML,而目标搜索页的产品列表是前端JavaScript异步加载渲染的,初始HTML里没有生成后的产品链接,所以自然提取不到结果。
解决方案
方案1:提取页面内嵌的产品JSON数据(无额外依赖,速度最快)
大部分电商站点会把初始搜索结果预存在页面的<script>标签里,直接用正则匹配提取JSON解析即可:
# 定义搜索参数 $targetEan = "3283950923699" $searchUrl = "https://www.shop-naturpur.de/index.php?lang=0&cl=search&searchparam=$targetEan" # 请求搜索页 $resp = Invoke-WebRequest -Uri $searchUrl -UseBasicParsing # 匹配页面内嵌的搜索结果JSON $jsonMatch = [regex]::Match($resp.Content, 'window\.oxArticleList\s*=\s*(\[.*?\]);', [System.Text.RegularExpressions.RegexOptions]::Singleline) if ($jsonMatch.Success) { # 解析JSON $productList = $jsonMatch.Groups[1].Value | ConvertFrom-Json # 匹配对应EAN的产品,拼接完整链接 $targetProduct = $productList | Where-Object { $_.ean -eq $targetEan } | Select-Object -First 1 $productUrl = "https://www.shop-naturpur.de/$($targetProduct.link)" Write-Output $productUrl }
如果上面的正则匹配不到,你可以手动打开搜索页,按F12在控制台输入window,查看存储搜索结果的变量名,替换正则里的变量名即可。
方案2:使用无头浏览器渲染完整页面(通用动态页面解决方案)
如果站点完全没有预存数据,就用支持JS渲染的无头浏览器加载完整页面后再提取:
# 首次运行先安装依赖模块 Install-Module PuppeteerSharp -Scope CurrentUser -Force Import-Module PuppeteerSharp # 启动无头Chrome $launchOpt = New-Object PuppeteerSharp.LaunchOptions -Property @{ Headless = $true } $browser = [PuppeteerSharp.Puppeteer]::LaunchAsync($launchOpt).Result $page = $browser.NewPageAsync().Result # 导航到搜索页,等待产品列表渲染完成 $page.GoToAsync("https://www.shop-naturpur.de/index.php?lang=0&cl=search&searchparam=3283950923699#/q/3283950923699").Wait() # 这里的选择器需要根据实际页面结构调整,F12选中产品链接元素即可复制选择器 $page.WaitForSelectorAsync(".product-list .product-item a.product-link").Wait() # 提取所有产品链接 $links = $page.EvaluateExpressionAsync("Array.from(document.querySelectorAll('.product-list .product-item a.product-link')).map(el => el.href)").Result # 筛选目标链接 $targetUrl = $links | Where-Object { $_ -like "*Cattier-Duschgel-Wilde-Verbena-Zitrus*" } | Select-Object -First 1 Write-Output $targetUrl # 释放资源 $browser.CloseAsync().Wait()
内容的提问来源于stack exchange,提问作者Narav
相关产品推荐
相关产品推荐

