PQ 网抓,关于网抓函数嵌套,无法抓取某网站数据。

Power Query 纯蓝 ⋅ 于 2018-10-07 20:24:32 ⋅ 最后回复由 Alex 2018-10-08 10:36:33 ⋅ 2960 阅读

经验不足,在此咨询各位前辈,网抓类通过各类公众号学习,学会了皮毛,利用Json.Document()和Web.Contents()两个函数嵌套能抓取大部分网络数据,主要是找到数据所在的真正网址便可抓取,如下图。现在抓取某网站数据,直接提示error。始终不理解哪里出了问题,求赐教。file
现在找到了所需数据网址为https://so.m.jd.com/ware/search._m2wq_list?keyword=%E5%88%9B%E7%BB%B455G3&datatype=1&callback=jdSearchResultBkCbA&page=2&pagesize=10&ext_attr=no&brand_col=no&price_col=no&color_col=no&size_col=no&ext_attr_sort=no&merge_sku=yes&multi_suppliers=yes&area_ids=1,72,2819&filt_type=redisstore,1;&sort_type=sort_totalsales15_desc&qp_disable=no&fdesc=%E5%8C%97%E4%BA%AC&t1=1538897256595
嵌套两个函数后,直接报错,其余网址均不会出现此情况,在此疑问
①是否网址有多余,我是否删除某些既能正常显示
②是否Json.Document()使用错误,此网址结构是否不同
③是否此网址有时间戳,是否要做一个变量才能成功。其余成功测试的网址没有时间戳。
④此网站有一个验证,是否为需要某代码跳过验证,如下图。之前成功抓取的网站是没有弹出这个的。
file

最佳答案
  • Alex MOD 社区清洁工
    2018-10-08 10:31:42

    两个问题:
    1、这是使用 JSONP 方式获取的 JSON,开头通常会多出一个 JsonCallback 之类的参数,这里的是 jdSearchResultBkCbA
    这种格式的不能直接解析,需要把首尾两个括号之外的去掉。
    2、其中有一行是

    "warename": "创维(Skyworth)50\x2F55寸  G2A系 4K超高清 HDR 人工智能 智能网络平板电视机 55G2A",

    这里的反斜杠会被误以为是转义字符,从而引发报错,所以去掉或者替换成正斜杠什么的都可以。

    let
        源 = Text.FromBinary(Web.Contents("https://so.m.jd.com/ware/search._m2wq_list?keyword=%E5%88%9B%E7%BB%B455G3&datatype=1&callback=jdSearchResultBkCbA&page=2&pagesize=10&ext_attr=no&brand_col=no&price_col=no&color_col=no&size_col=no&ext_attr_sort=no&merge_sku=yes&multi_suppliers=yes&area_ids=1,72,2819&filt_type=redisstore,1;&sort_type=sort_totalsales15_desc&qp_disable=no&fdesc=%E5%8C%97%E4%BA%AC&t1=1538897256595")),
        去掉首位 = Text.Trim(Text.Replace(源,"jdSearchResultBkCbA(",""),{"#(lf)",")"}),
        替换斜杠 = Text.Replace(去掉首位,"\","/"),
        解析 = Json.Document(替换斜杠)
    in
        解析
回复数量: 2
  • Alex MOD 社区清洁工
    2018-10-08 10:31:42

    两个问题:
    1、这是使用 JSONP 方式获取的 JSON,开头通常会多出一个 JsonCallback 之类的参数,这里的是 jdSearchResultBkCbA
    这种格式的不能直接解析,需要把首尾两个括号之外的去掉。
    2、其中有一行是

    "warename": "创维(Skyworth)50\x2F55寸  G2A系 4K超高清 HDR 人工智能 智能网络平板电视机 55G2A",

    这里的反斜杠会被误以为是转义字符,从而引发报错,所以去掉或者替换成正斜杠什么的都可以。

    let
        源 = Text.FromBinary(Web.Contents("https://so.m.jd.com/ware/search._m2wq_list?keyword=%E5%88%9B%E7%BB%B455G3&datatype=1&callback=jdSearchResultBkCbA&page=2&pagesize=10&ext_attr=no&brand_col=no&price_col=no&color_col=no&size_col=no&ext_attr_sort=no&merge_sku=yes&multi_suppliers=yes&area_ids=1,72,2819&filt_type=redisstore,1;&sort_type=sort_totalsales15_desc&qp_disable=no&fdesc=%E5%8C%97%E4%BA%AC&t1=1538897256595")),
        去掉首位 = Text.Trim(Text.Replace(源,"jdSearchResultBkCbA(",""),{"#(lf)",")"}),
        替换斜杠 = Text.Replace(去掉首位,"\","/"),
        解析 = Json.Document(替换斜杠)
    in
        解析
  • Alex MOD 社区清洁工
    2018-10-08 10:36:33

    百度下关键词 json格式化,会找到很多 JSON 格式化校验工具,你把返回的 JSON 复制粘贴进去校验一下,工具会提示哪里不符合解析规范,根据提示想办法修改下就会很简单了。

暂无评论~~
  • 请务必阅读并严格遵守《社区管理规范与使用说明》
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 发送表情,可用的 Emoji 见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板粘贴上传, 格式限制 - jpg, png, gif
  • 不支持上传附件,请尽可能用文字和图片将问题描述清楚,如实在需要上传附件,可上传到 共享网盘 后分享链接
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
Ctrl+Enter