此为沪深A股数据,须要抓取1-20页的所有数据。点击下一页后不雅观察URL创造,html前面末了一个数字即为页数,那么只须要自定义函数,将其做成变量然后调用即可。其余创造每一页的末了一行都是多余的,可以用Table.RemoveLastN删掉。
let get_data =(x)=>Table.RemoveLastN(Web.Page(Web.Contents(\公众http://quote.stockstar.com/stock/ranklist_a_3_1_\"大众&Text.From(x)&\"大众.html\"大众)){0}[Data],1), result = Table.Combine(List.Transform({1..20},get_data))in result 2、翻页URL不会变革,F12找出真实地址
URL:http://221.215.38.136/grcx/kscx/list.action?kscxVo.jsp=ylypmlcx.jsp
要抓取1-20页数据,但创造翻页URL不会变,无法根据URL掌握页数。浏览器按F12创造,网页以get办法提交,图中参数4即为页数,表格的真实URL为http://221.215.38.136/grcx/pages/kscx/ylypmlcx.jsp?page_ylypmlcxQuery=4,于是方法同上。
let source = Table.Combine(List.Transform({1..20},each Web.Page(Web.Contents(\"大众http://221.215.38.136/grcx/pages/kscx/ylypmlcx.jsp?page_ylypmlcxQuery=\"大众&Text.From(_))){2}[Data])), result = Table.SelectRows(source, each not Text.StartsWith([药品编码], \公众当前\公众))in result3、post办法提交
URL:http://www.drugfuture.com/cndrug/national.aspx?ApprovalDateStart=2016-01-01&ApprovalDateEnd=2016-12-31
和之前不同的是,该网页因此post办法提交,如果只是在URL后加参数无法得到精确的页数,于是要用到Web.Contents中的Content提交post参数,其余headers中的Content-Type是必须的,以是也要加进来。由于有个\"大众-\公众为分外符号,以是要加个#\"大众\公众。
须要把稳的是,提交的参数须要是encode后的,__VIEWSTATE参数太长了,我没放进来,自己改一下。
let get_data = (page)=> let url=\"大众http://www.drugfuture.com/cndrug/national.aspx\公众, headers=[#\"大众Content-Type\"大众=\"大众application/x-www-form-urlencoded\公众], content=\"大众__EVENTTARGET=GridViewNational&__EVENTARGUMENT=Page%24\"大众&Text.From(page)&\"大众&__VIEWSTATE=太长了自己改吧\"大众, query=[ApprovalDateStart=\"大众2016-01-01\"大众,ApprovalDateEnd=\公众2016-12-31\"大众], web_data=Web.Contents(url,[Query=query,Headers=headers,Content=Text.ToBinary(content)]), data=Table.RemoveLastN(Web.Page(Text.FromBinary(web_data))[Data]{0},1) in data, result = Table.Combine(List.Transform({1..78},get_data))in result 4、须要登录,加cookies
URL:http://www.51mis.com/biaozhun/index.php?module=Accounts&action=index&parenttab=Parent%20Accounts
这是一个CRM的试用账户,现要抓出客户分类中的vip客户下的1-4页的所有信息。这里面有三个问题要办理:①须要上岸 ②点击客户分类下的任何子分类URL都不会变,如何定位到我们想要的vip客户 ③翻页问题
我们首先打开这个URL验证下手机号上岸,然后打开一个新窗口,再次打开这个URL,创造看到的已经和刚才不一样了,这是由于刚才上岸后做事器已经把所有的身份识别信息记录在cookies中,当再次访问的时候浏览器检讨到本地有cookies,于是向做事器提交了一个headers中带有cookies的要求,验证通过。以是我们只须要复制cookies添加到headers中即可,问题①办理。
然后考试测验点击客户分类下的不同子分类,比拟创造有一个叫viewname的参数在变革,而vip客户对应的参数为179,问题②办理。
页码对应的则是start参数,上面先容过,问题③办理。
let get_data=(page)=> let url=\"大众http://www.51mis.com/biaozhun/index.php\"大众, headers=[#\公众Content-type\公众=\"大众application/x-www-form-urlencoded\"大众,Cookie=\"大众ck_login_id_lingdang=201; ck_login_theme_lingdang=softed; ck_login_language_lingdang=zh_cn; IESESSION=alive; _qddamta_4008885110=3-0; pgv_pvi=1109719040; pgv_si=s9133628416; tencentSig=2914921472; Hm_lvt_15823373277d5586cce1d8fa22740e98=1498477295,1498478011; Hm_lpvt_15823373277d5586cce1d8fa22740e98=1498478011; LXB_REFER=www.baidu.com; _qddaz=QD.evgckn.ew8amb.j4e2ox3t; PHPSESSID=j0m2ou15d8hcumonfcul46kj64; _qdda=3-1.3bt43b; _qddab=3-i0t2ae.j4e2ox3v\"大众], content=\"大众viewname=179&start=\"大众&Text.From(page), query=[action=\"大众index\"大众,module=\公众Accounts\"大众], web_data=Web.Contents(url,[Query=query,Headers=headers,Content=Text.ToBinary(content)]), table=Web.Page(Text.FromBinary(web_data)){0}[Data] in table, result=Table.RemoveColumns(Table.Combine(List.Transform({1..4},get_data)),{\公众\"大众})in result 5、返回json:
URL:http://sports.sina.com.cn/g/ucl/table.html
要抓取2011-2016所有欧冠积分榜数据。通过F12不难找到真实地址,去掉无关参数后为http://platform.sina.com.cn/sports_all/client_api?_sport_t_=football&_sport_s_=opta&_sport_a_=teamOrder&app_key=3571367214&type=10&season=2016。把这个地址复制到浏览器打开,创造出来的和上面的案例都不一样,返回的是json,那么就须要利用Json.Document来解析,个中season参数掌握赛季,自定义函数后构建{2011..2016}的list调用即可:
let get_data=(x)=>Table.FromRecords(Json.Document(Web.Contents(\"大众http://platform.sina.com.cn/sports_all/client_api?_sport_t_=football&_sport_s_=opta&_sport_a_=teamOrder&app_key=3571367214&type=10&season=\"大众&Text.From(x)))[result][data]), result = Table.Combine(List.Transform({2011..2016},get_data))in result 6、非构造化数据:
以上案例都有一个共同点:都为构造化数据,可以直接通过解析表或json等办法从而获取数据,但有些网页中的数据是非构造化的。
例如:爬取本站页面https://pqfans.com/catalog中所有的锚链接。
对付这种非构造化的网页,只能通过Text.FromBinary解析出源码,然后当文本处理。如果网页的编码为GBK或GB2312,Text.FromBinary的第二参数要加个0,否则会涌现乱码,如果是UTF-8则不用第二参数。
let source = Text.FromBinary(Web.Contents(\"大众https://pqfans.com/catalog\"大众)), result = List.Transform({0..List.Count(Text.PositionOf(源,\公众<a href=\"大众\"大众https://pqfans.com/\"大众,2))-1},each \公众https://pqfans.com/\"大众&Text.BetweenDelimiters(源,\"大众<a href=\公众\"大众https://pqfans.com/\"大众,\"大众\"大众\"大众\"大众,_))in result 处理动态参数
对付动态参数,可以把变量写在单元格中,然后将单元格导入PQ,效果如下图:
修正单元格中的值,刷新即可得到不同日期、不同类型等数据,体验类似于网页中的查询。
练习URL:http://datacenter.mep.gov.cn/index!MenuAction.action?name=402880fb24e695b60124e6973db30011
请用以上先容的方法,抓出2017/6/20-2017/6/23全部49页的全国城市空气质量日报。
来源于施阳大神。