有一個名為 https://www.guidgenerator.com/online-guid-generator.aspx 的網站,它產生全域唯一識別碼。我正在嘗試使用 perl 的 Mechanize 發佈到網站以提取該指南。我意識到這是基於 javascript 的,但想知道我是否可以發布正確的帖子來提取號碼。我從瀏覽器中追蹤它,並在請求中獲得了所有標頭,但返回的 html 不包含 guid。
這是成功運行的結果:
<textarea name="txtResults" rows="2" cols="20" id="txtResults" style="font-family:Courier New,Courier,monospace;font-size:Larger;font-weight: bold;高度:152px;寬度:421px;">qk5DF22bhkm4C2AwZ5OcZw==</textarea>
這是我的腳本:
<textarea name="txtResults" rows="2" cols="20" id="txtResults" style="font-family:Courier New,Courier,monospace;font-size:Larger;font-weight: bold;高度:152px;寬度:421px;"></textarea>
這是頁面內的表單:
在我的腳本中,我轉儲了以下所需的表單和輸入欄位:
my @forms = $mech->forms; foreach my $form (@forms) { my @inputfields = $form->param; print Dumper \@inputfields; }
結果
$VAR1 = [ '__EVENTTARGET', '__EVENTARGUMENT', '__LASTFOCUS', '__VIEWSTATE', '__VIEWSTATEGENERATOR', '__EVENTVALIDATION', 'txtCount', 'chkUppercase', 'chkBrackets', 'chkHypens', 'chkBase64', 'chkRFC7515', 'chkURL', 'LocalTimestampValue', 'btnGenerate', 'txtResults' ];
這就是帖子
my $mainpage = "https://www.guidgenerator.com/online-guid-generator.aspx"; $mech->post( "$mainpage", fields => { 'txtCount' => "1", 'chkBase64' => "on", 'LocalTimestampValue' => "Date%28%29.getTime%28%29", 'btnGenerate' => "Generate+some+GUIDs%21", 'txtResults' => "", '__EVENTTARGET' => 'on', '__EVENTARGUMENT', => 'on', '__LASTFOCUS', => 'on', '__VIEWSTATEGENERATOR' => "247C709F", '__VIEWSTATE' => 'on', '__EVENTVALIDATION' => 'on', 'chkUppercase' => 'off', 'chkBrackets' => 'off', 'chkHypens' => 'off', 'chkRFC7515' => 'off', 'chkURL' => 'off', }, );
當我在網站上進行追蹤時,我得到了標頭,但還有另一個名為「有效負載」的選項卡。其中包含上面列出的大部分欄位。我嘗試將這些欄位輸入到 POST 中,但不確定我是否應該以不同的方式執行此操作,或者它並不重要,因為它是 javascript?
我知道這是很多資訊。我什至不確定 Perl 的機械化可以提取這些資訊。任何幫助,將不勝感激。請讓我知道您希望我在此處發布的任何其他數據。
P粉7148900532024-04-03 09:56:29
您可以使用 Mech 的內建功能來執行此操作。無需提交任何額外的欄位或標頭。
use strict;
use warnings;
use feature 'say';
use WWW::Mechanize;
my $mech = WWW::Mechanize->new;
$mech->get('https://www.guidgenerator.com/online-guid-generator.aspx');
$mech->field( txtCount => 10 );
$mech->click;
say $mech->value('txtResults');
這將輸出如下內容:
$ perl mech.pl 211b3cad1665483ca303360bdbda0c61 ecc3348d83cb4bb5bdcb11c6148c5ae1 0a3f2fe5748946a1888a4a5bde8ef2e6 acb26deb9fda4411aa64638cdd1ec5f1 2afe609c355b4a10b6a0ae8c74d3aef1 30fd89ab170147cfb24f131346a203e3 2301d258e1d045aa8f0682f2ea14464c f064507ca3e14a4eb860b0a30ba096ed 9a42b15d5c79420c921dcc07c306459b 5bea2e345f75453caaf795681963866a
這裡的關鍵是你不能使用 $mech- >submit
因為這不會提交提交按鈕的值。這有點煩人。因此,您必須使用 $mech->click
,它假裝點擊了預設表單的預設提交按鈕,因此也提交了該值。這就是按鈕在表單上的工作方式,在本例中,後端檢查值以查看單擊了哪一個。
然後您可以使用 $mech->value
來取得欄位值。您可能想要 split
來進一步處理它。
該頁面中的 JavaScript 其實與功能完全無關。它所做的只是保存和恢復您在 cookie 中選擇的設置,這樣當您回來時,相同的複選框將被選中。這很好,但現在在前端使用本地存儲可能會更好。然而,你根本不需要處理 JS 來抓取這個頁面。主要功能是後端。
您可能也會對 $mech->dump_forms
,這是一個很好的偵錯輔助工具,可以列印所有帶有欄位和值的表單。使用 Mech(或任何基於 LWP 的類別)時另一個很好的調試輔助工具是 LWP::ConsoleLogger ::無處不在。這就是我用來將程式的請求與瀏覽器的請求進行比較以找到遺失的按鈕表單欄位的方法。
免責聲明:我是 WWW::Mechanize 的維護者,我編寫了 LWP::ConsoleLogger::Everywhere。