各位老师好,我最近写了一个多页数据的网抓,可是发现抓取的数据不稳定,有时候刷新有些数据能刷出来,有些数据刷新不出来,我刚怀疑是刷新太频繁,被网站限制了,于是想着增加一些网抓的延时,来保证抓取数据的稳定性。
现在我有一个疑问,增加延时使用Function.InvokeAfter时,我应该是
方案一:先网抓---设置延时----网抓结果出来后的数据清洗
方案二:网抓---数据清洗----然后再设置延时。
其实就是我再自定义参数fx的时候,是指定义网抓部分,还是把网抓部分还数据清洗部分都直接给定义进去。
还有就是想请老师看下 我这样写的延时对不对 是不是最优的 延迟30秒网抓,设置30秒的延时会不会好网抓多个数据时稳定很多。
已调用自定义函数 = Table.AddColumn(替换的值, "fx", each Function.InvokeAfter(()=>fx([#"Booking#"]),Duration.FromText("00:00:30"))),
网抓多页数据的fx函数如下:
- (page)=>let
- url="https://www.cma-cgm.com.cn/LaraToolkit/BookingInquery/BookingInqueryData",//必填项:网页真实的网址链接
- headers=[#"Content-Type"="application/x-www-form-urlencoded; charset=UTF-8",Referer="https://www.cma-cgm.com.cn/LaraToolkit/BookingInquery"], //必填项:Content-Type必填,Referer防盗链接最好填写上
- query=[],//选填项:网址的一些查询参数,一般Requset URL中?后面的部分,既可以写在URl里面,也可以写在这里面
- content="BookingNo="&page, //必填项
- web=Text.FromBinary(Web.Contents(url,[Headers=headers,Query=query,Content=Text.ToBinary(content)])),
- #"解析的 JSON" = Json.Document(web),
- data = #"解析的 JSON"[data],
- 拆分文本 = Text.Split(data, "<br/>"),
- 转换为表 = Table.FromList(拆分文本, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
- 筛选的行 = Table.SelectRows(转换为表, each Text.Contains([Column1], ": ")),
- 筛选的行1 = Table.SelectRows(筛选的行, each not Text.Contains([Column1], "<p")),
- 按分隔符拆分列 = Table.SplitColumn(筛选的行1, "Column1", Splitter.SplitTextByEachDelimiter({": "}, QuoteStyle.Csv, false), {"Column1.1", "Column1.2"}),
- 更改的类型 = Table.TransformColumnTypes(按分隔符拆分列,{{"Column1.1", type text}, {"Column1.2", type text}}),
- 转置表 = Table.Transpose(更改的类型),
- 提升的标题 = Table.PromoteHeaders(转置表, [PromoteAllScalars=true]),
- 更改的类型1 = Table.TransformColumnTypes(提升的标题,{{"提单号", type text}, {"目的港名称", type text}, {"目的地名称", type text}, {"船名", type text}, {"航次", type text}, {"航线", type text}, {"开船日期", type datetime}, {"尺寸", type text}}),
- 替换的值 = Table.ReplaceValue(更改的类型1," ","",Replacer.ReplaceText,{"尺寸"}),
- 已添加自定义 = Table.AddColumn(替换的值, "箱子信息", each "尺寸:"&[尺寸]),
- 删除的列 = Table.RemoveColumns(已添加自定义,{"尺寸"}),
- 按分隔符拆分列1 = Table.SplitColumn(删除的列, "箱子信息", Splitter.SplitTextByDelimiter(";", QuoteStyle.Csv), {"箱子信息.1", "箱子信息.2", "箱子信息.3"}),
- 更改的类型2 = Table.TransformColumnTypes(按分隔符拆分列1,{{"箱子信息.1", type text}, {"箱子信息.2", type text}, {"箱子信息.3", type text}}),
- 重命名的列 = Table.RenameColumns(更改的类型2,{{"箱子信息.1", "尺寸"}, {"箱子信息.2", "类型"}, {"箱子信息.3", "箱量"}}),
- 替换的值1 = Table.ReplaceValue(重命名的列,"尺寸:","",Replacer.ReplaceText,{"尺寸"}),
- 替换的值2 = Table.ReplaceValue(替换的值1,"类型: ","",Replacer.ReplaceText,{"类型"}),
- 替换的值3 = Table.ReplaceValue(替换的值2,"箱量: ","",Replacer.ReplaceText,{"箱量"}),
- 合并的列 = Table.CombineColumns(替换的值3,{"尺寸", "类型"},Combiner.CombineTextByDelimiter(" ", QuoteStyle.None),"尺寸类型")
- in
- 合并的列
复制代码
然后调取多个page的代码
- let
- 源 = Excel.CurrentWorkbook(){[Name="表2"]}[Content],
- 更改的类型 = Table.TransformColumnTypes(源,{{"Booking#", type text}, {"Carrier name", type text}}),
- 筛选的行 = Table.SelectRows(更改的类型, each ([#"Booking#"] <> null)),
- 替换的值 = Table.ReplaceValue(筛选的行," ","",Replacer.ReplaceText,{"Booking#"}),
- 已调用自定义函数 = Table.AddColumn(替换的值, "fx", each Function.InvokeAfter(()=>fx([#"Booking#"]),Duration.FromText("00:00:30"))),
- 删除的错误 = Table.RemoveRowsWithErrors(已调用自定义函数, {"fx"}),
- #"展开的“fx”" = Table.ExpandTableColumn(删除的错误, "fx", {"提单号", "目的港名称", "目的地名称", "船名", "航次", "航线", "开船日期", "尺寸类型", "箱量"}, {"提单号", "目的港名称", "目的地名称", "船名", "航次", "航线", "开船日期", "尺寸类型", "箱量"})
- in
- #"展开的“fx”"
复制代码
|