用PowerShell登录网站和人工登录网站一样,需要建立一个持久的会话。有的相对容易一些,而有的却非常麻烦(比如ADFS),因此有的时候,我们可以在浏览器中登录,然后将浏览器中的会话导入。会话在客户端是由cookie维护的。
比如要想快速登录到新浪微博,那我就先用chrome登录,在F12工具中然后将weibo站点的cookie复制到剪贴板,然后就可以以登录者的身份去微博上爬数据了。
$session = New-Object Microsoft.PowerShell.Commands.WebRequestSession Get-Content .\cookie.txt | foreach { #vr 6 .weibo.com / $line=$_ -split '/' | select -First 1 $tokens=$_.Split(' ',[System.StringSplitOptions]::RemoveEmptyEntries) $c=@{ name=$tokens[0] value=$tokens[1] domain=$tokens[2] } $cookie = New-Object System.Net.Cookie $cookie.Name=$c.name $cookie.Value=$c.Value $cookie.Domain=$c.domain $session.Cookies.Add($cookie) } for($i=1;$i -le 214555;$i++){ $r=Invoke-RestMethod "http://weibo.com/aj/v6/comment/big?ajwvr=6&id=4009043251108698&page=$i&__rnd=1471928579930" -WebSession $session -UserAgent 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36' $page = $i.ToString().PadLeft('7','0') $r.data.html | Out-File "E:\weibo.data\$page.html" Write-Host "正在下载 $page 页" }
我上面爬的数据是某知名博主在网上赢得的骂声。
(声明:本人持中立态度,一个人再恶,也有法律管着,用不着网络暴力口诛笔伐)
假如数据已经被保存到文本文件中了,我们可以用下面的代码片段来通过正则表达式解析评论和用户名:
function GetWeibo() { param($file) $raw = Get-Content $file $group = [regex]::Matches($raw,'<div class="WB_text"(?<CommentText>.*?)</div>') $weboList = $group | foreach { $_.Groups['CommentText'].value } foreach($v in $weboList){ $uMatch= [regex]::Match($v,'ucardconf="type=1">(?<user>.*?)</a>') $user = $uMatch.Groups['user'].value $text = $v.Substring($v.LastIndexOf('a>:')+3) $text = [regex]::Replace($text,'<[^>]*>','') $text = [regex]::Replace($text,' ',' ') @{user=$user; text=$text} } }
此时将解析后的文本存到临时文件中,再使用下面的PowerShell脚本,使用Powershell中的工作流将它们上传到自己的网站上:
function Add-WeiboPost { param( $User, $Post ) $body = @{ AuthKey='*************' User=$User Post=$Post} Invoke-RestMethod http://mr.lonsoon.com/query.php -Method post -Body $body } workflow Push-Data { param($Posts) foreach -parallel ($post in $posts) { $a=Add-WeiboPost -User $post.user -Post $post.text Write-Output $a } } $num=0; ls E:\weibo.data | foreach { $posts = GetWeibo -file $_.FullName Push-Data -Posts $posts $_ | del $num += $posts.Count Write-Host "Upload $num posts" }
我们通过fiddler的请求状态可以证明,Powershell 工作流中的foreach -parallel的确是并行的。
最后再调用自己网站的接口看下上传的数据:
至此,一个经典的例子从爬数据,存数据,展示数据,一条龙服务,先后用到PowerShell,php,html,JavaScript。
本文链接: https://www.pstips.net/mock-login.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
博主 你有多无聊 哈哈哈
学习嘛,总得给自己找出点可玩弄的素材!
感谢博主分享! 我试着借用你的脚本调取cookies,但似乎失败了。最后down到的页面仍然是要求提供用户名和密码的登陆页前页面。博主可不可以指教一下,我不知道问题出在哪里?
====这是get cookie的部分~ 稍作了一点改动========
$session = New-Object Microsoft.PowerShell.Commands.WebRequestSession
Get-Content .\cookie.txt | foreach {
$line=$_ -split ‘/’ | select -First 1
$tokens=$_.Split(“`t”).TrimEnd()
$c=@{
name=$tokens[0]
value=$tokens[1]
domain=$tokens[2]
}
$cookie = New-Object System.Net.Cookie
$cookie.Name=$c.name
$cookie.Value=$c.Value
$cookie.Domain=$c.domain
$session.Cookies.Add($cookie)
}
========================
=========这是cookie.txt的内容=============
JSESSIONID XXXXXXXXXXXXXXXXXXXXXXXXXXXXX.tomcat1 tz.cscec.com /x5 Wed Feb 07 2018 14:47:48 GMT+0800 (中国标准时间)
justep-remember true tz.cscec.com / Tue Feb 14 2017 10:22:03 GMT+0800 (中国标准时间)
justep-username anyone tz.cscec.com / Tue Feb 14 2017 14:47:39 GMT+0800 (中国标准时间)
request-use-base64 false tz.cscec.com / Wed Feb 07 2018 14:47:48 GMT+0800 (中国标准时间)
yunsuo_session_verify SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS .cscec.com / Mon Dec 27 2021 02:58:58 GMT+0800 (中国标准时间)
===================================
这段代码并没有报错。。。
博主我查到问题了,cookie文件过期。。。
受教了,过来学习