Cách Sử Dụng Proxy Với PowerShell Invoke-WebRequest
Expert Network Defense Engineer
Làm chủ cấu hình proxy PowerShell cho các yêu cầu web an toàn, ẩn danh. Định tuyến lưu lượng qua các proxy dân cư để vượt qua các rào cản địa lý và tránh bị chặn IP.
Những Điểm Chú Ý Chính
- Tham số -Proxy của Invoke-WebRequest cho phép định tuyến lưu lượng qua các máy chủ proxy
- PowerShell 7.x hỗ trợ proxy HTTPS và SOCKS; các phiên bản trước hỗ trợ HTTP chỉ
- Tham số ProxyCredential xử lý xác thực khi các proxy yêu cầu thông tin đăng nhập
- Proxy dân cư cung cấp IP được phân phối hợp pháp bởi nhà cung cấp dịch vụ Internet giúp vượt qua việc chặn dựa trên IP
- Đối tượng phiên giữ cài đặt proxy qua nhiều yêu cầu một cách tự động
Hiểu Về Proxy của Invoke-WebRequest
Invoke-WebRequest là cmdlet gốc của PowerShell để thực hiện các yêu cầu HTTP và HTTPS. Tham số -Proxy định tuyến các yêu cầu qua các máy chủ proxy được chỉ định thay vì kết nối trực tiếp đến các trang web đích. Khả năng này cho phép các script:
- Truy cập nội dung bị hạn chế địa lý từ các địa điểm cụ thể
- Phân phối yêu cầu trên nhiều IP để tránh giới hạn tốc độ
- Ẩn nguồn gốc script khỏi các trang web đích
- Kiểm tra khả năng kết nối mạng thông qua các proxy doanh nghiệp
Tham số proxy chấp nhận các URL có định dạng: <PROTOCOL>://<HOST>:<PORT>
Cấu Hình Proxy HTTP Cơ Bản
Thiết lập proxy đơn giản nhất chỉ định một địa chỉ và cổng HTTP:
powershell
$proxyUrl = "http://47.252.29.28:11222"
$response = Invoke-WebRequest -Uri "https://httpbin.io/ip" -Proxy $proxyUrl
Write-Output $response.Content
Lệnh này định tuyến yêu cầu qua máy chủ proxy được chỉ định. Trang web đích nhận yêu cầu từ địa chỉ IP của proxy thay vì địa chỉ IP của máy tính của bạn.
Xác Thực Proxy
Nhiều nhà cung cấp proxy yêu cầu xác thực để ngăn chặn việc sử dụng trái phép. Tham số -ProxyCredential truyền tên người dùng và mật khẩu:
powershell
$proxyUrl = "http://proxy.example.com:8080"
$proxyCreds = Get-Credential
$response = Invoke-WebRequest -Uri "https://httpbin.io/ip" `
-Proxy $proxyUrl `
-ProxyCredential $proxyCreds
Get-Credential mở một hộp thoại tương tác yêu cầu thông tin đăng nhập. Đối với các script tự động, tạo thông tin đăng nhập theo cách lập trình:
powershell
$username = "proxy_user"
$password = "proxy_password"
$secPassword = ConvertTo-SecureString $password -AsPlainText -Force
$proxyCreds = New-Object System.Management.Automation.PSCredential `
-ArgumentList $username, $secPassword
$response = Invoke-WebRequest -Uri "https://httpbin.io/ip" `
-Proxy "http://proxy.example.com:8080" `
-ProxyCredential $proxyCreds
URL Proxy Nhúng Thông Tin Đăng Nhập
Ngoài ra, nhúng thông tin đăng nhập trực tiếp vào URL proxy:
powershell
$proxyUrl = "http://username:password@proxy.example.com:8080"
$response = Invoke-WebRequest -Uri "https://httpbin.io/ip" -Proxy $proxyUrl
Cách tiếp cận này là thuận tiện cho các script mà quản lý thông tin đăng nhập ít quan trọng hơn.
Hỗ Trợ Proxy HTTPS và SOCKS
PowerShell 7.x+ thêm hỗ trợ cho proxy HTTPS và SOCKS. Nếu sử dụng các phiên bản trước, chỉ các proxy HTTP mới hoạt động. Cập nhật lên PowerShell 7 để hỗ trợ đầy đủ các giao thức proxy:
powershell
# Proxy HTTPS
$response = Invoke-WebRequest -Uri "https://example.com" `
-Proxy "https://username:password@proxy.example.com:8080"
# Proxy SOCKS5
$response = Invoke-WebRequest -Uri "https://example.com" `
-Proxy "socks5://username:password@proxy.example.com:1080"
Xác minh phiên bản PowerShell của bạn:
powershell
$PSVersionTable.PSVersion
Chiến Lược Xoay Vòng Proxy
Đối với việc thu thập thông tin quy mô lớn hoặc gọi API, xoay vòng giữa nhiều proxy phân phối yêu cầu qua các IP khác nhau, tránh giới hạn tốc độ và bị cấm IP:
powershell
$proxyList = @(
"http://user:pass@proxy1.example.com:8080",
"http://user:pass@proxy2.example.com:8080",
"http://user:pass@proxy3.example.com:8080"
)
$urls = @(
"https://api.example.com/page1",
"https://api.example.com/page2",
"https://api.example.com/page3"
)
foreach ($url in $urls) {
$randomProxy = $proxyList | Get-Random
$response = Invoke-WebRequest -Uri $url -Proxy $randomProxy
Write-Output "Phản hồi từ $url sử dụng $randomProxy"
}
Cách tiếp cận này chọn một proxy khác ngẫu nhiên cho mỗi yêu cầu, ngăn chặn việc tích lũy yêu cầu theo IP gây ra việc chặn.
Proxy Dân Cư Cao Cấp Với PowerShell
<a href="https://www.scrapeless.com/vi/product/proxy-solutions" rel="nofollow"><strong>Proxy Dân Cư Scrapeless</strong></a> cung cấp cơ sở hạ tầng proxy chuyên nghiệp cho tự động hóa PowerShell. Proxy dân cư sử dụng các IP hợp pháp được cấp bởi ISP, cải thiện đáng kể tỷ lệ thành công khi truy cập các trang web được bảo vệ:
```powershell
# Proxy dân cư Scrapeless với xác thực
$proxyUrl = "http://username:password@superproxy.scrapeless.com:1337"
$headers = @{
'User-Agent' = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
$response = Invoke-WebRequest -Uri "https://example.com" `
-Proxy $proxyUrl `
-Headers $headers
Write-Output $response.StatusCode
Scrapeless quản lý hơn 90 triệu IP dân cư trên 195 quốc gia với tính năng tự động quay vòng và nhắm mục tiêu địa lý.
Cấu Hình Proxy Theo Phiên
Đối với nhiều yêu cầu liên quan, các đối tượng phiên sẽ tự động duy trì cài đặt proxy:
powershell
$proxyUrl = "http://username:password@superproxy.scrapeless.com:1337"
$webSession = New-Object Microsoft.PowerShell.Commands.WebRequestSession
$webSession.Proxy = New-Object System.Net.WebProxy($proxyUrl)
# Yêu cầu đầu tiên
$response1 = Invoke-WebRequest -Uri "https://example.com/page1" `
-WebSession $webSession
# Yêu cầu thứ hai tự động sử dụng cùng một proxy
$response2 = Invoke-WebRequest -Uri "https://example.com/page2" `
-WebSession $webSession
# Yêu cầu thứ ba với cùng cài đặt proxy
$response3 = Invoke-WebRequest -Uri "https://example.com/page3" `
-WebSession $webSession
Các đối tượng phiên loại bỏ việc xác định proxy lặp lại cho các yêu cầu tuần tự.
Danh Sách Bỏ Qua Proxy
Một số môi trường yêu cầu kết nối trực tiếp đến các máy chủ cụ thể, bỏ qua proxy. Định nghĩa danh sách bỏ qua để truy cập trực tiếp:
powershell
$proxy = New-Object System.Net.WebProxy("http://proxy.example.com:8080")
$proxy.BypassList += "*.internal.company.com"
$proxy.BypassList += "localhost"
[System.Net.WebRequest]::DefaultWebProxy = $proxy
$response = Invoke-WebRequest -Uri "https://internal.company.com"
Các máy chủ bỏ qua sẽ kết nối trực tiếp thay vì định tuyến qua máy chủ proxy.
Xử Lý Lỗi Chứng Chỉ SSL
Một số cấu hình proxy hoặc chứng chỉ tự ký gây ra lỗi SSL. Để thử nghiệm, bỏ qua việc xác thực chứng chỉ:
powershell
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
$response = Invoke-WebRequest -Uri "https://example.com" `
-Proxy "http://proxy.example.com:8080"
Cảnh Báo: Vô hiệu hóa việc xác thực chứng chỉ khiến bạn dễ bị tấn công man-in-the-middle. Chỉ sử dụng trong các môi trường được kiểm soát.
PowerShell 7.4+ cung cấp tham số an toàn hơn -SkipCertificateCheck:
powershell
$response = Invoke-WebRequest -Uri "https://example.com" `
-Proxy "http://proxy.example.com:8080" `
-SkipCertificateCheck
Trường Hợp Sử Dụng Nâng Cao: Cào Dữ Liệu Web Với Proxy
Kết hợp proxy dân cư với tiêu đề và độ trễ hợp lý để cào dữ liệu web hiệu quả:
powershell
function Invoke-ScrapingRequest {
param(
[Parameter(Mandatory=$true)]
[string]$Url,
[Parameter(Mandatory=$true)]
[string]$ProxyUrl,
[int]$DelayMs = 2000
)
$headers = @{
'User-Agent' = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
'Accept' = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
'Accept-Language' = 'en-US,en;q=0.9'
}
Start-Sleep -Milliseconds $DelayMs
$response = Invoke-WebRequest -Uri $Url `
-Proxy $ProxyUrl `
-Headers $headers `
-ErrorAction SilentlyContinue
return $response
}
# Cách sử dụng
$proxyUrl = "http://user:pass@superproxy.scrapeless.com:1337"
$response = Invoke-ScrapingRequest -Url "https://example.com" -ProxyUrl $proxyUrl
Mẫu này thực hiện độ trễ giữa các cuộc gọi, tiêu đề giả lập trình duyệt hợp pháp và quay vòng proxy dân cư để cào dữ liệu quy mô lớn một cách đáng tin cậy.
Khắc Phục Sự Cố Liên Quan Đến Proxy
Kết Nối Bị Từ Chối: Xác minh máy chủ proxy và cổng. Kiểm tra khả năng kết nối trực tiếp:
powershell
Test-NetConnection -ComputerName "proxy.example.com" -Port 8080
Xác thực không thành công: Xác nhận tên người dùng và mật khẩu là chính xác. Thông tin đăng nhập nhúng trong các URL yêu cầu mã hóa URL nếu chúng chứa ký tự đặc biệt.
Hiệu suất chậm: Thử các proxy khác nếu có sẵn. Một số proxy có thể ở xa về mặt địa lý hoặc bị tắc nghẽn.
Proxy không được sử dụng: Xác minh rằng Invoke-WebRequest sử dụng tham số -Proxy. Các biến môi trường hoặc cài đặt proxy hệ thống không tự động ảnh hưởng đến Invoke-WebRequest.
Proxy biến môi trường
PowerShell 7.x+ tôn trọng các biến môi trường HTTP_PROXY và HTTPS_PROXY nếu được thiết lập:
powershell
$env:HTTP_PROXY = "http://proxy.example.com:8080"
$env:HTTPS_PROXY = "http://proxy.example.com:8080"
$response = Invoke-WebRequest -Uri "https://example.com"
Các phiên bản PowerShell trước đó sẽ bỏ qua các biến môi trường—hãy chỉ định rõ tham số -Proxy.
Gọi REST API qua Proxy
Lệnh Invoke-RestMethod tương tự cũng chấp nhận tham số -Proxy cho các cuộc gọi API JSON:
powershell
$proxyUrl = "http://username:password@superproxy.scrapeless.com:1337"
$response = Invoke-RestMethod -Uri "https://api.example.com/data" `
-Proxy $proxyUrl `
-Method Get
$response | ConvertTo-Json
Câu hỏi thường gặp
Q: Tôi có thể sử dụng Invoke-WebRequest mà không cần chỉ định một proxy không?
A: Có. Bỏ qua tham số -Proxy cho các kết nối trực tiếp. Tuy nhiên, điều này làm lộ địa chỉ IP thực tế của bạn và ngăn cản việc vượt qua các hạn chế địa lý hoặc giới hạn tốc độ.
Q: Tôi có thể thực hiện bao nhiêu cuộc gọi Invoke-WebRequest đồng thời qua một proxy?
A: PowerShell giới hạn các hoạt động đồng thời dựa trên tài nguyên hệ thống. Hầu hết các kịch bản chạy thành công 10-50 yêu cầu song song. Các proxy dân cư cao cấp như Scrapeless hỗ trợ đồng thời không giới hạn ở cấp độ hạ tầng proxy.
Q: Sự khác biệt giữa các tham số -Proxy và -ProxyCredential là gì?
A: Tham số -Proxy chỉ định địa chỉ máy chủ proxy. Tham số -ProxyCredential cung cấp thông tin xác thực đăng nhập tách biệt với URL, hữu ích khi thông tin xác thực chứa các ký tự đặc biệt cần mã hóa URL.
Q: Tôi có cần quyền nâng cao để sử dụng proxy với Invoke-WebRequest không?
A: Không. Việc sử dụng proxy chỉ yêu cầu kết nối mạng tới máy chủ proxy. Quyền quản trị không cần thiết cho các hoạt động proxy tiêu chuẩn.
Q: Có thể sử dụng Invoke-WebRequest với các proxy SOCKS trên Windows PowerShell 5.1 không?
A: Không. Windows PowerShell 5.1 chỉ hỗ trợ các proxy HTTP. Nâng cấp lên PowerShell 7.x để truy cập hỗ trợ proxy SOCKS. Tải xuống PowerShell 7 từ kho lưu trữ chính thức của Microsoft—nó sẽ được cài đặt song song với Windows PowerShell mà không có xung đột.
Tại Scrapless, chúng tôi chỉ truy cập dữ liệu có sẵn công khai trong khi tuân thủ nghiêm ngặt các luật, quy định và chính sách bảo mật trang web hiện hành. Nội dung trong blog này chỉ nhằm mục đích trình diễn và không liên quan đến bất kỳ hoạt động bất hợp pháp hoặc vi phạm nào. Chúng tôi không đảm bảo và từ chối mọi trách nhiệm đối với việc sử dụng thông tin từ blog này hoặc các liên kết của bên thứ ba. Trước khi tham gia vào bất kỳ hoạt động cạo nào, hãy tham khảo ý kiến cố vấn pháp lý của bạn và xem xét các điều khoản dịch vụ của trang web mục tiêu hoặc có được các quyền cần thiết.



