ค้นหาเว็บไซต์

ความสนุกวันศุกร์: ช้อปปิ้งช่วงวันหยุดด้วย PowerShell


เทศกาลช้อปปิ้งช่วงวันหยุดมาถึงเราอีกครั้ง แต่บางที PowerShell อาจทำให้ง่ายขึ้นนิดหน่อยหรืออย่างน้อยก็สนุกขึ้นอีกหน่อย ฉันแน่ใจว่าหลายท่านเคยซื้อสินค้าที่ NewEgg.com บางทีคุณอาจวางแผนที่จะทำเช่นนั้นอีกครั้งในปีนี้เพื่อเพื่อน ครอบครัว หรือแม้แต่ตัวคุณเอง เหตุใดจึงไม่ปล่อยให้ PowerShell ทำให้สิ่งนี้ง่ายขึ้นสักหน่อย

NewEgg มีความเชี่ยวชาญเพียงพอที่จะเผยแพร่ฟีด RSS สำหรับหมวดหมู่การขายบางประเภท คุณสามารถดูรายการหลักได้ที่ http://www.newegg.com/RSS/Index.aspx มาดูฟีด Deal of the Day กัน

$uri = "http://www.newegg.com/Product/RSS.aspx?Submit=RSSDailyDeals&Depa=0"

การใช้ Invivo-RestMethod ทำให้สามารถดึงข้อมูลไอเท็มได้ง่ายมาก

Invoke-RestMethod -Uri $uri

แต่ก็ยังมีความสับสนอยู่บ้าง ดังนั้นเรามาเลือกสรรกันสักหน่อยดีกว่า

$data = Invoke-RestMethod -Uri $uri | Select -property @{Name="Published";Expression= {$_.pubDate -as [datetime]}},Title,Link

ฉันยังสร้างคุณสมบัติใหม่ที่เรียกว่า Published ซึ่งใช้ PubDate ดั้งเดิมและถือเป็นวันที่ซึ่งทำให้จัดเรียงหรือกรองข้อมูลได้ง่ายขึ้น

นี่คือตัวอย่างสิ่งที่ฉันได้รับ

ด้วยข้อมูลนี้ ฉันสามารถใช้ Out-Gridview เป็นตัวเลือกออบเจ็กต์ได้

$data | out-gridview -Title "Deal of the Day" -OutputMode Multiple | foreach { Start $_.link }

ฉันสามารถเลือกได้หลายรายการ คลิกตกลง และแต่ละลิงก์ควรเปิดขึ้นในเบราว์เซอร์ของฉัน

แต่มาทำให้สิ่งต่าง ๆ น่าสนใจยิ่งขึ้นกันดีกว่า คุณสมบัติ Title มีราคาและคำอธิบาย ฉันไม่รู้ว่าลิงก์เหล่านี้มีลักษณะอย่างไรในส่วนอื่นๆ ของโลก ดังนั้นคุณอาจต้องปรับเปลี่ยนตัวอย่างต่อไปนี้

ก่อนอื่น ฉันจะกำหนดรูปแบบนิพจน์ทั่วไปเพื่อใช้การบันทึกที่มีชื่อเพื่อรับสกุลเงิน ในกรณีของฉันคือ $ราคา และคำอธิบายรายการ

[regex]$rx = "(?<currency>.)(?<price>\d+\.\d{2})\s-\s(?<item>.*)"

ฉันจะดาวน์โหลดข้อมูลอีกครั้งโดยข้ามรายการใดๆ ที่ไม่มีราคาในช่องชื่อ

$dl = Invoke-RestMethod -Uri $uri | where {$_.Title -match "\d+\.\d{2}"}

เป้าหมายของฉันคือใช้ Out-Gridview อีกครั้งโดยแยกคุณสมบัติสำหรับสกุลเงินและราคา ฉันต้องการให้ราคาเป็นตัวเลขจึงจะสามารถเรียงลำดับได้ ต่อไปฉันจะได้สัญลักษณ์สกุลเงินโดยใช้นิพจน์ regex

$c = $rx.match($dl[0].title).groups["currency"].value

จากนั้น ฉันสามารถประมวลผลข้อมูล RSS ที่เหลือได้โดยใช้ออบเจ็กต์ regex เพื่อแยกวิเคราะห์ราคาและคำอธิบาย

$data = $dl |
Select -property @{Name="Published";Expression= {$_.pubDate -as [datetime]}},
@{Name=$c;Expression = {$rx.match($_.title).groups["price"].value -as [double]}},
@{Name="Item";Expression = {$rx.match($_.title).groups["item"].value }},
Link

หากคุณสังเกตเห็น ฉันใช้ค่าสกุลเงินเป็นชื่อคุณสมบัติ ตอนนี้เมื่อฉันใช้ Out-Gridview ฉันจะมีจอแสดงผลที่ยืดหยุ่นมากขึ้น

$data | Sort $c -descending | Out-GridView -Title $uri -OutputMode Multiple |
foreach {
#open each selected link
start $_.link
}

หากฉันกำลังซื้อแล็ปท็อปเครื่องใหม่ ฉันสามารถเลือกได้หลายรายการ คลิกตกลง และตรวจสอบรายการเหล่านั้นในเบราว์เซอร์ของฉัน

ฉันสามารถทำซ้ำขั้นตอนนี้ได้โดยเปลี่ยนฟีด RSS โดยพูดกับ Shell Shocker

$uri = "http://www.newegg.com/Product/RSS.aspx?Submit=ShellShocker"

หากฉันทำซ้ำขั้นตอนก่อนหน้านี้ สิ่งนี้จะล้มเหลว ซึ่งจะแสดงสิ่งที่ต้องคำนึงถึงด้วยนิพจน์ทั่วไป: รู้จักข้อมูลของคุณ คุณต้องรู้ว่าคุณกำลังประมวลผลอะไรอยู่ และเป็นไปตามรูปแบบที่คาดเดาได้ อย่างน้อยที่สุดถ้าคุณต้องการให้รูปแบบนิพจน์ทั่วไปของคุณค่อนข้างเรียบง่าย ปัญหาคือมีเพียงรายการเดียวเท่านั้น ดังนั้นรหัสของฉันในการรับตัวเลขสกุลเงินจึงล้มเหลวเพราะฉันไม่มีอาร์เรย์ ในสถานการณ์นี้ฉันสามารถทำได้:

$c = $rx.match($dl.title).groups["currency"].value

แม้ว่ามันอาจจะสมเหตุสมผลกว่าหากคิดโค้ดที่ฉันสามารถนำมาใช้ซ้ำได้

$entry = $dl | select -first 1
$c = $rx.match($dl.title).groups["currency"].value

แต่จากที่นี่รหัสจะเหมือนกัน

นั่นอาจเป็นสิ่งที่ฉันอยากจะพิจารณา แม้ว่าบางครั้งฟีด RSS จะอยู่ด้านหลังไซต์เล็กน้อยก็ตาม น่าเศร้าที่ในกรณีนี้ลิงก์ใช้งานได้ แต่ผลิตภัณฑ์เป็นอย่างอื่น แต่คุณได้รับความคิด

สนุกกับวันหยุดสุดสัปดาห์ของคุณและระวังตัวด้วย!

บทความที่เกี่ยวข้อง