网页抓取-翻页页面地址不变

Power Query 阿姨我喜欢你女儿 ⋅ 于 2018-08-15 22:54:14 ⋅ 最后回复由 Alex 2018-08-15 22:58:21 ⋅ 3390 阅读

尝试抓取 http://data.eastmoney.com/rzrq/detail/all.html 这个网页,按F12后找到页面[图片],自己写的代码是

let
    url="http://dcfm.eastmoney.com/em_mutisvcexpandinterface/api/js/get",  
    query=[type=RZRQ_DETAIL_NJ&token=70f12f2f4f091e459a279469fe49eca5&filter=(tdate=%272018-06-27T00:00:00%27)&st=rzjmre&sr=-1&p=1&ps=50&js=var%20vrHDUyaU={pages:(tp),data:(x)}&type=RZRQ_DETAIL_NJ&time=1&rt=51006152], 
in
    web

其中token=70f12f2f4f091e459a279469fe49eca5这段报错,是什么情况,另外想知道页码是在哪里看的,烦请大家指点下

本帖已被设为精华帖!
本帖由 Alex 于 5年前 加精
最佳答案
  • Alex MOD 社区清洁工
    2018-08-15 22:58:21

    1、URL 中的每个参数都有自己的作用,只是可能对于获取你需要的数据而言,某些参数填与不填对返回结果没有影响,所以可以省略。
    参数是由程序员人为命名及定义的,在不同的网页中请求参数都各不相同,那么我是如何知道各个参数的作用以及是否可以省略的呢?只有通过手动测试。
    因为是 GET 方法,请求参数全部附加在 URL 末尾,所以可以直接把 URL 输入到浏览器里打开看下返回的结果。通过不断的删减修改各参数,观察返回结果的变化,最终只保留了其中的几个必要参数,当然你也完全可以不做任何修改将所有参数填上去。
    2、不难发现原 URL 中表示日期的参数为 filter=(tdate=%272018-06-27T00:00:00%27),那么如果要修改日期,也必须要按照原来的格式。代码为:

    let
        url  =  "http://dcfm.eastmoney.com/em_mutisvcexpandinterface/api/js/get?type=RZRQ_DETAIL_NJ&token=70f12f2f4f091e459a279469fe49eca5",
        date =  List.Dates(#date(2018,06,25),5,#duration(1,0,0,0)),
        web  =  Table.Combine(
                    List.Transform(date,each Table.FromRecords(
                        Json.Document(Web.Contents(
                            url&"&filter=(tdate=%27"&Date.ToText(_,"yyyy-MM-dd")&"T00:00:00%27)"
                        ))
                    ))
                )
    in
        web

    其中 Json.Document 参数要求为 any,也就是说可以是由 Web.Contents 返回的 binary,也可以是由 Text.FromBinary 返回的 text,加或不加都可以。对于新手而言,建议是加上,因为如果出错了可以通过返回的 text 内容进行调试排错。

回复数量: 3
  • Alex MOD 社区清洁工
    2018-08-15 22:55:40

    有问题的地方挺多的,第二步如果写成 record 的形式,应该是一个字段对应一个值,值是文本要加引号,各个字段中间逗号隔开。最后的 in 之后应为最后一步的步骤名。
    这个网页的请求方式是 GET ,所以还是比较简单的,直接把请求参数附加在 URL 之后即可,在 F12 中能够找到。

    file

    其中大部分参数可省略,如抓取第 4 页,代码为:

    let
        url = "http://dcfm.eastmoney.com/em_mutisvcexpandinterface/api/js/get?type=RZRQ_DETAIL_NJ&token=70f12f2f4f091e459a279469fe49eca5&filter=(tdate=%272018-06-27T00:00:00%27)&p=4&ps=50",
        data = Json.Document(Web.Contents(url)),
        result = Table.FromRecords(data)
    in
        result

    如果要抓所有页码,可以把 URL 中表示页码的参数 p=4 做成变量,再用 List.Transform 批量抓取。
    但实际上在这个网页中,把 URL 末尾最后两个分别表示 page 和 pagesize 的参数去掉,返回的就是全部页码中的数据。

  • 阿姨我喜欢你女儿
    2018-08-15 22:56:52

    谢谢大神的解答,想问下对于这种网址,
    1.是不是一般都是去掉&js=这后面的

    file
    然后后面的参数是不是一般网址都通用的,有点不是特别明白意思,比如token,type.rt.

    2.网址中有时间参数,

    file
    怎样把时间设置成变量,我自己尝试了下

    let
        url = "http://dcfm.eastmoney.com/em_mutisvcexpandinterface/api/js/get? 
        type=RZRQ_DETAIL_NJ&token=70f12f2f4f091e459a279469fe49eca5&st=rzjmre&sr=-1",
        date=List.Dates(#date(2018, 06, 25), 5, #duration(1, 0, 0, 0)),
        web=List.Transform(date,(x)=> url&"&"&Text.From(x)),
        data = List.Transform(web,each Json.Document(Text.FromBinary(Web.Contents(_)) )),
        combine = List.Combine(data),
        result = Table.FromRecords(combine)
    in
        result

    然后有两个问题,a.与设置的date 日期时间不符,如何导出我需要的date 日期数据。b.我是根据提示加的 Text.FromBinary 然后出的数据,是否这里有问题,如果没问题,上面单独只有一个网址时为何没有Text.FromBinary
    问题较多,还望大神费心,相信初学者应该都有这样的疑问。

  • Alex MOD 社区清洁工
    2018-08-15 22:58:21

    1、URL 中的每个参数都有自己的作用,只是可能对于获取你需要的数据而言,某些参数填与不填对返回结果没有影响,所以可以省略。
    参数是由程序员人为命名及定义的,在不同的网页中请求参数都各不相同,那么我是如何知道各个参数的作用以及是否可以省略的呢?只有通过手动测试。
    因为是 GET 方法,请求参数全部附加在 URL 末尾,所以可以直接把 URL 输入到浏览器里打开看下返回的结果。通过不断的删减修改各参数,观察返回结果的变化,最终只保留了其中的几个必要参数,当然你也完全可以不做任何修改将所有参数填上去。
    2、不难发现原 URL 中表示日期的参数为 filter=(tdate=%272018-06-27T00:00:00%27),那么如果要修改日期,也必须要按照原来的格式。代码为:

    let
        url  =  "http://dcfm.eastmoney.com/em_mutisvcexpandinterface/api/js/get?type=RZRQ_DETAIL_NJ&token=70f12f2f4f091e459a279469fe49eca5",
        date =  List.Dates(#date(2018,06,25),5,#duration(1,0,0,0)),
        web  =  Table.Combine(
                    List.Transform(date,each Table.FromRecords(
                        Json.Document(Web.Contents(
                            url&"&filter=(tdate=%27"&Date.ToText(_,"yyyy-MM-dd")&"T00:00:00%27)"
                        ))
                    ))
                )
    in
        web

    其中 Json.Document 参数要求为 any,也就是说可以是由 Web.Contents 返回的 binary,也可以是由 Text.FromBinary 返回的 text,加或不加都可以。对于新手而言,建议是加上,因为如果出错了可以通过返回的 text 内容进行调试排错。

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