PowerShell 抓取网页表格

本文介绍了如何使用PowerShell的ConvertFrom-String函数抓取网页中的表格数据。通过Invoke-RestMethod获取网页内容,然后设计模板匹配HTML表格,将数据转化为对象。示例中演示了抓取澳洲代理服务器列表并测试其可用性的过程,以及抓取低GI食物列表,展示了这种方法在处理网页列表信息时的实用性。

因为我是英文版的系统,中文系统的界面转换成字符串都成了乱码,因此测试都是在英文网页上操作的。

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

首先看个基本例子
$a=
@’
1 2 3 4
5 6 7 8
9 2 2 3
‘@
$t=
@’
{Co1*:1} {Co2:2} {Co3:3} {Co4:4}
{Co1*:5} 6 7 8
'@
c = c= c=a | ConvertFrom-String -Delimiter “\r\n”
d = d= 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} HTTP High anonymous / Elite proxy No Australia 13 Months 2.699 Sec
{Reliability:50%}
{IP*:103.25.182.1} {Port:8081} HTTP Anonymous proxy No Australia 15 Months 7.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= t r u e , V a l u e F r o m P i p e l i n e = true, ValueFromPipeline= true,ValueFromPipeline=true,
ValueFromPipelineByPropertyName= t r u e , p o s i t i o n = 0 ) ] [ s t r i n g ] true, position=0 ) ] [string] true,position=0)][string]server,
[string] u r l = " h t t p : / / w w w . m i c r o s o f t . c o m " ) w r i t e − h o s t " T e s t P r o x y S e r v e r :   url = "http://www.microsoft.com" ) write-host "Test Proxy Server:  url="http://www.microsoft.com")writehost"TestProxyServer: server" -NoNewline
p r o x y = n e w − o b j e c t S y s t e m . N e t . W e b P r o x y ( proxy = new-object System.Net.WebProxy( proxy=newobjectSystem.Net.WebProxy(server)
$WebClient = new-object System.Net.WebClient
$WebClient.proxy = $proxy
Try
{
$content = W e b C l i e n t . D o w n l o a d S t r i n g ( WebClient.DownloadString( WebClient.DownloadString(url)
Write-Host " Opened $url successfully" -ForegroundColor Cyan
}
catch
{
Write-Host " Unable to access KaTeX parse error: Expected 'EOF', got '}' at position 31: …dColor Yellow }̲ } foreach (r in $result){
s e r v e r n a m e = " h t t p : / / " + servername="http://"+ servername="http://"+r.IP+":"+$r.Port
Test-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格式的内容 那就更省事了。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值