视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
PowerShell抓取网页表格_html/css
2020-11-27 16:29:25 责编:小采
文档
今天无意中看到了传教士写的一篇博文 http://www.cnblogs.com/piapia/p/5367556.html (PowerShell中的两只爬虫),很受启发,自己试着抓了一下,成功地抓取了网页的表格。因为我是英文版的系统,中文系统的界面转换成字符串都成了乱码,因此测试都是在英文网页上操作的。

PowerShell 5里面有一个新的函数叫做ConvertFrom-String, 他的作用是把字符串转换成对象。其中一个参数是可以根据指定的模板,把对应的那一部分字符串匹配出来生成对象,我们可以利用这个功能抓取网页中的表格。

详细帮助文档链接

https://technet.microsoft.com/library/dn807178(v=wps.0).aspx

首先看个基本例子

$a=@'1 2 3 45 6 7  2 2 3'@$t=@'{Co1*:1} {Co2:2} {Co3:3} {Co4:4}{Co1*:5} 6 7 8'@$c=$a | ConvertFrom-String -Delimiter "\r\n"$d=$a | ConvertFrom-string -TemplateContent $t

同样的字符串,第一个我用分隔符回车换行来生成一个对象;第二个我用自定义的模板格式来进行匹配。注意属性定义的格式写法 {}隔开,然后第一个需要{属性名字*:},后面不需要加*,至少需要匹配2行数据才行。

可以看见第一个对象有3个属性,P1是1 2 3 4,P2 是 4 5 6 7 ,P3是9 2 2 3;

第二个对象则是根据每一列来自动匹配的(已经有一个模板匹配了前2行)

接下来我们来看2个实例。

第一个例子是这个网页,里面有一个澳洲代理服务器的列表,如下所示,我想抓出来

http://www.proxylisty.com/country/Australia-ip-list

基本思路:invoke-restmethod直接抓取整个网页,自动转换为string对象。

然后设计对应的模板。因为是html文件,转换为string以后对应的html代码都在里面。因此关键是怎么把这些带有html代码的表格模板弄出来。

很简单,网页都可以查看html的源代码,下面一大段html的代码可以直接从网页上复制粘贴对应的2行表格代码即可,稍加修改添加属性名字就行了。

然后根据模板匹配就会自动生成对应的表格对象了

$web = 'http://www.proxylisty.com/country/Australia-ip-list'$template = @'{IP*:203.56.188.145}{Port:8080}HTTPHigh anonymous / Elite proxyNoAustralia13 Months2.699 Sec{Reliability:50%}{IP*:103.25.182.1}{Port:8081}HTTPAnonymous proxyNoAustralia15 Months7.242 Sec{Reliability:55%}'@$temp=Invoke-RestMethod -uri $web $result = ConvertFrom-String -TemplateContent $template -InputObject $temp $result | sort reliability

成功抓取

我还可以更进一步,我想测试一下这些抓取下来的地址是否真的可以用,写个function测试看看

function Test-Proxy{[cmdletbinding()]param( [Parameter(Mandatory=$true, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true, position=0 ) ] [string]$server, [string]$url = "http://www.microsoft.com")write-host "Test Proxy Server: $server" -NoNewline$proxy = new-object System.Net.WebProxy($server)$WebClient = new-object System.Net.WebClient$WebClient.proxy = $proxyTry{ $content = $WebClient.DownloadString($url) Write-Host " Opened $url successfully" -ForegroundColor Cyan}catch{ Write-Host " Unable to access $url" -ForegroundColor Yellow }}foreach ($r in $result){$servername="http://"+$r.IP+":"+$r.PortTest-proxy -server $servername -url "www.google.com"}

测试标明都是坑货

类似的,豆子最近比较关注健康食物,我想看看低GI的食物有哪些

http://ultimatepaleoguide.com/glycemic-index-food-list

需要把下面这个表格抓出来

$t2=@'{Food*:Banana cake, made with sugar}{GI:47}{Size:60}{Food*:Banana cake, made without sugar}{GI:55}{Size:60}'@$web2='http://ultimatepaleoguide.com/glycemic-index-food-list/'$temp=Invoke-RestMethod -uri $web2 $result1 = ConvertFrom-String -TemplateContent $t2 -InputObject $temp $result1 | Out-GridView

成功!

这种方式很有用,尤其是需要获取网页某些列表信息的时候,当然,如果网页本身就提供RESTFUL的接口,可以直接获取JSON格式的内容 那就更省事了。

下载本文
显示全文
专题