PowerShell nhận HTML

PowerShell bao gồm một số khả năng tuyệt vời để làm việc với hai dạng dữ liệu có cấu trúc phổ biến. HTML và XML. Tại sao nó lại quan trọng? . Nếu bạn sử dụng PowerShell, các tệp trợ giúp, định dạng và loại là XML. Chức năng "cmdlet over objects" mới trong PowerShell v3 dựa trên XML. Chức năng liên quan đến HTML và XML không có bất kỳ thay đổi lớn nào trong PowerShell v3. Chúng tôi sẽ đề cập đến các khả năng khác nhau và cung cấp một số ví dụ ngắn gọn về cách bạn có thể muốn sử dụng chúng

PowerShell bao gồm một số khả năng tuyệt vời để làm việc với hai dạng dữ liệu có cấu trúc phổ biến. HTML và XML. Tại sao nó lại quan trọng? . Nếu bạn sử dụng PowerShell, các tệp trợ giúp, định dạng và loại là XML. Chức năng “cmdlet over objects” được giới thiệu trong PowerShell v3 dựa trên XML. Chức năng liên quan đến HTML và XML không có bất kỳ thay đổi lớn nào trong PowerShell v4. Chúng tôi sẽ đề cập đến các khả năng khác nhau và cung cấp một số ví dụ ngắn gọn về cách bạn có thể muốn sử dụng chúng

Đôi khi bạn cần phân tích một số trang web hoặc trang web lớn. Google cung cấp nhiều chương trình và thậm chí cả tổ hợp phần mềm để thực hiện tác vụ này, nhưng tôi muốn chỉ ra cách bạn có thể thực hiện việc này một cách đơn giản với sự trợ giúp của Powershell

Có một lệnh ghép ngắn Invoke-WebRequest trong Powershell, lệnh này thực sự phân tích cú pháp trang HTML theo thẻ và nội dung. Cmdlet cung cấp cho bạn một đối tượng của trang với thuộc tính ParsedHtml. Đối với trường này, bạn có thể áp dụng các phương pháp để trích xuất dữ liệu cần thiết

Giả sử bạn cần lấy tất cả các liên kết từ trang. Xem làm thế nào nó hoạt động

$url = "http://site.com/page.html";
$page = Invoke-WebRequest $url -Method Get -DisableKeepAlive;
$elements_a = $page.ParsedHtml.getElementsByTagName('a') | ?{$_.getAttribute('itemprop') -eq "url"};

Sau khi bạn nhận được kết quả của chuỗi cuối cùng vào $elements_a, bạn sẽ cần đi sâu vào các thuộc tính của đối tượng này và lấy thông tin cần thiết. Trong mọi trường hợp, dữ liệu mẫu của bạn sẽ khác nhau vì tất cả các trang web đều khác nhau. Nhưng bây giờ chúng ta có thể sử dụng ví dụ chung - lấy tiêu đề của trang. Điều đó sẽ hoạt động trên mọi trang web

$title = $($page.ParsedHtml.getElementsByTagName('title')).innertext;

Đối với các trang web phức tạp, hãy tạo các bộ lọc phức tạp hơn

$address = $( $page.ParsedHtml.getElementsByTagName('p') | ?{$_.className -eq 'address'} ).innertext;

 

Gọi-WebRequest và hiệu suất getElementsByTagName

getElementsByTagName theo nhận thức của Microsoft - khá nặng và chậm. Nếu bạn đưa kết quả vào một số lệnh ghép ngắn khác, thì hiệu suất của tập lệnh có thể chậm một cách thảm hại. Ví dụ: ví dụ cuối cùng có thể chạy tới 30 giây (nếu trang thực sự lớn)

tôi không biết lý do của việc này. Tôi đã tìm thấy cuộc thảo luận này. http. // stackoverflow. com/câu hỏi/14202054/why-is-this-powershell-code-invoke-webrequest-getelementsbytagname-so-incred. Từ đó, tôi nhận ra rằng getElementsByTagName cung cấp cho chúng tôi một loạt các đối tượng COM và chúng tôi chuyển các đối tượng COM này vào lệnh ghép ngắn khác. Đây là một quá trình rất chậm chiếm tới 86% thời gian của CPU

Lần này, tôi chỉ tìm thấy một giải pháp cho vấn đề này. sử dụng Powershell 32-bit trong những trường hợp như vậy. Không biết tại sao, nhưng nó cho hiệu suất tốt

Vài tháng trước, tôi đã tạo hàm ConvertFrom-HTMLTable để giúp tôi trích xuất các bảng HTML từ các tệp HTML được lưu cục bộ hoặc các trang web trực tiếp và chuyển đổi chúng thành các đối tượng PowerShell có thể sử dụng được. Vì vậy, nó không phải là một chức năng mới nhưng tôi nghĩ nó xứng đáng có một bài đăng độc lập vì nó có thể khá tiện dụng

Tôi đã sử dụng nó khi nói về cách làm việc với các bảng Confluence và bây giờ nó đã giúp tôi truy xuất danh sách tất cả các nhật ký SCCM từ trang tài liệu chính thức cho chức năng Get-CMLog của tôi

Nếu bạn kiểm tra trang tài liệu đó, bạn sẽ thấy có một số bảng với hàng chục tên nhật ký, vì vậy sẽ là một cơn ác mộng khi lấy chúng bằng tay

Đôi khi, bạn rơi vào tình huống muốn lấy thông tin từ một nguồn trực tuyến chẳng hạn như trang web, nhưng dịch vụ không có sẵn API để bạn lấy thông tin và có quá nhiều dữ liệu để sao chép và dán theo cách thủ công. Hoặc có thể bạn cần đăng ký rất nhiều mục trên một trang web, nhưng không có một người bạn nào buồn chán để giúp đỡ. Đừng sợ, PowerShell có thể là người bạn buồn chán của bạn nếu bạn hỏi một cách tử tế

Nếu bạn đang sử dụng PowerShell 7 trở lên, bạn có thể không chạy được tất cả các ví dụ trong bài đăng này mà không sửa đổi, vì cách các yêu cầu web phân tích cú pháp dữ liệu đã bị thay đổi

PowerShell và nội dung web

PowerShell có một số cách để lấy dữ liệu từ một nguồn trên web, có thể là trang web bình thường hoặc API REST. Có sẵn hai lệnh ghép ngắn để thực hiện các yêu cầu web và PowerShell tất nhiên cũng có quyền truy cập vào mọi thứ mà. NET phải cung cấp. Nếu cả

PipeHow:\Blog> Invoke-WebRequest 'https://jsonplaceholder.typicode.com/posts/1'

StatusCode        : 200
StatusDescription : OK
Content           : {
                      "userId": 1,
                      "id": 1,
                      "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
                      "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nrepr..."
RawContent        : HTTP/1.1 200 OK
                    Connection: keep-alive
                    Vary: Origin, Accept-Encoding
                    Access-Control-Allow-Credentials: true
                    Pragma: no-cache
                    X-Content-Type-Options: nosniff
                    CF-Cache-Status: HIT
                    Age: 4743
                    Expe...
Forms             : {}
Headers           : {[Connection, keep-alive], [Vary, Origin, Accept-Encoding], [Access-Control-Allow-Credentials, true], [Pragma, no-cache]...}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 292

PipeHow:\Blog> Invoke-RestMethod 'https://jsonplaceholder.typicode.com/posts/1'

userId id title                                                                      body
------ -- -----                                                                      ----
     1  1 sunt aut facere repellat provident occaecati excepturi optio reprehenderit quia et suscipit...
4 hoặc
PipeHow:\Blog> Invoke-WebRequest 'https://jsonplaceholder.typicode.com/posts/1'

StatusCode        : 200
StatusDescription : OK
Content           : {
                      "userId": 1,
                      "id": 1,
                      "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
                      "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nrepr..."
RawContent        : HTTP/1.1 200 OK
                    Connection: keep-alive
                    Vary: Origin, Accept-Encoding
                    Access-Control-Allow-Credentials: true
                    Pragma: no-cache
                    X-Content-Type-Options: nosniff
                    CF-Cache-Status: HIT
                    Age: 4743
                    Expe...
Forms             : {}
Headers           : {[Connection, keep-alive], [Vary, Origin, Accept-Encoding], [Access-Control-Allow-Credentials, true], [Pragma, no-cache]...}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 292

PipeHow:\Blog> Invoke-RestMethod 'https://jsonplaceholder.typicode.com/posts/1'

userId id title                                                                      body
------ -- -----                                                                      ----
     1  1 sunt aut facere repellat provident occaecati excepturi optio reprehenderit quia et suscipit...
5 đều không đủ tốt, bạn có thể đào sâu vào Hệ thống. Web và xây dựng các giải pháp bằng cách sử dụng đó. Bạn có thể gặp các trường hợp mã hóa không hoạt động như mong đợi và tạo các chức năng của riêng bạn với các lớp từ. NET có thể là một cách để giải quyết nó

Gọi-WebRequest

PipeHow:\Blog> Invoke-WebRequest 'https://jsonplaceholder.typicode.com/posts/1'

StatusCode        : 200
StatusDescription : OK
Content           : {
                      "userId": 1,
                      "id": 1,
                      "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
                      "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nrepr..."
RawContent        : HTTP/1.1 200 OK
                    Connection: keep-alive
                    Vary: Origin, Accept-Encoding
                    Access-Control-Allow-Credentials: true
                    Pragma: no-cache
                    X-Content-Type-Options: nosniff
                    CF-Cache-Status: HIT
                    Age: 4743
                    Expe...
Forms             : {}
Headers           : {[Connection, keep-alive], [Vary, Origin, Accept-Encoding], [Access-Control-Allow-Credentials, true], [Pragma, no-cache]...}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 292

PipeHow:\Blog> Invoke-RestMethod 'https://jsonplaceholder.typicode.com/posts/1'

userId id title                                                                      body
------ -- -----                                                                      ----
     1  1 sunt aut facere repellat provident occaecati excepturi optio reprehenderit quia et suscipit...
4 đúng như tên gọi của nó, nó tạo và gửi một yêu cầu đến một địa chỉ web cụ thể rồi trả về một phản hồi. Hãy nghĩ về nó giống như mở một trang web trong trình duyệt của bạn, bạn nhận được tất cả HTML trên địa chỉ bạn đã nhập nhưng cũng có tất cả siêu dữ liệu mà trình duyệt xử lý để bạn trình bày trang web

PipeHow:\Blog> Invoke-WebRequest 'www.google.com'

StatusCode          : 200
StatusDescription   : OK
Content             : doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="sv"><head><meta content="text/html; charset=UTF-8" http-equiv="Content-Type"><meta...
RawContent          : HTTP/1.1 200 OK
                      X-XSS-Protection: 0
                      X-Frame-Options: SAMEORIGIN
                      Cache-Control: private, max-age=0
                      Content-Type: text/html; charset=UTF-8
                      Date: Mon, 14 Oct 2019 16:57:41 GMT
                      Expires: -1
                      P3P: CP=...
Forms               : {f}
Headers             : {[X-XSS-Protection, 0], [X-Frame-Options, SAMEORIGIN], [Cache-Control, private, max-age=0], [Content-Type, text/html; charset=UTF-8]...}
...

Bạn có thể thấy rằng có rất nhiều siêu dữ liệu được trả về cùng với phản hồi. Sử dụng

PipeHow:\Blog> Invoke-WebRequest 'https://jsonplaceholder.typicode.com/posts/1'

StatusCode        : 200
StatusDescription : OK
Content           : {
                      "userId": 1,
                      "id": 1,
                      "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
                      "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nrepr..."
RawContent        : HTTP/1.1 200 OK
                    Connection: keep-alive
                    Vary: Origin, Accept-Encoding
                    Access-Control-Allow-Credentials: true
                    Pragma: no-cache
                    X-Content-Type-Options: nosniff
                    CF-Cache-Status: HIT
                    Age: 4743
                    Expe...
Forms             : {}
Headers           : {[Connection, keep-alive], [Vary, Origin, Accept-Encoding], [Access-Control-Allow-Credentials, true], [Pragma, no-cache]...}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 292

PipeHow:\Blog> Invoke-RestMethod 'https://jsonplaceholder.typicode.com/posts/1'

userId id title                                                                      body
------ -- -----                                                                      ----
     1  1 sunt aut facere repellat provident occaecati excepturi optio reprehenderit quia et suscipit...
4, bạn nhận được mọi thứ từ nội dung của trang web đến mã trạng thái HTTP để xem máy chủ nói gì về yêu cầu của bạn. Điều này hữu ích nhưng không phải lúc nào cũng cần thiết, đôi khi chúng tôi chỉ muốn xem dữ liệu thực tế trên trang, được lưu trữ trong thuộc tính
PipeHow:\Blog> Invoke-WebRequest 'https://jsonplaceholder.typicode.com/posts/1'

StatusCode        : 200
StatusDescription : OK
Content           : {
                      "userId": 1,
                      "id": 1,
                      "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
                      "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nrepr..."
RawContent        : HTTP/1.1 200 OK
                    Connection: keep-alive
                    Vary: Origin, Accept-Encoding
                    Access-Control-Allow-Credentials: true
                    Pragma: no-cache
                    X-Content-Type-Options: nosniff
                    CF-Cache-Status: HIT
                    Age: 4743
                    Expe...
Forms             : {}
Headers           : {[Connection, keep-alive], [Vary, Origin, Accept-Encoding], [Access-Control-Allow-Credentials, true], [Pragma, no-cache]...}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 292

PipeHow:\Blog> Invoke-RestMethod 'https://jsonplaceholder.typicode.com/posts/1'

userId id title                                                                      body
------ -- -----                                                                      ----
     1  1 sunt aut facere repellat provident occaecati excepturi optio reprehenderit quia et suscipit...
8 của phản hồi

Tất nhiên, chúng tôi có thể lưu phản hồi trong một biến và mở rộng nó để lấy dữ liệu của mình, nhưng nếu chúng tôi hoàn toàn không sử dụng siêu dữ liệu, thì có một lệnh ghép ngắn khác mà chúng tôi có thể sử dụng

Gọi phương thức nghỉ ngơi

PipeHow:\Blog> Invoke-WebRequest 'https://jsonplaceholder.typicode.com/posts/1'

StatusCode        : 200
StatusDescription : OK
Content           : {
                      "userId": 1,
                      "id": 1,
                      "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
                      "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nrepr..."
RawContent        : HTTP/1.1 200 OK
                    Connection: keep-alive
                    Vary: Origin, Accept-Encoding
                    Access-Control-Allow-Credentials: true
                    Pragma: no-cache
                    X-Content-Type-Options: nosniff
                    CF-Cache-Status: HIT
                    Age: 4743
                    Expe...
Forms             : {}
Headers           : {[Connection, keep-alive], [Vary, Origin, Accept-Encoding], [Access-Control-Allow-Credentials, true], [Pragma, no-cache]...}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 292

PipeHow:\Blog> Invoke-RestMethod 'https://jsonplaceholder.typicode.com/posts/1'

userId id title                                                                      body
------ -- -----                                                                      ----
     1  1 sunt aut facere repellat provident occaecati excepturi optio reprehenderit quia et suscipit...
5 hoạt động và được sử dụng giống như
PipeHow:\Blog> Invoke-WebRequest 'https://jsonplaceholder.typicode.com/posts/1'

StatusCode        : 200
StatusDescription : OK
Content           : {
                      "userId": 1,
                      "id": 1,
                      "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
                      "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nrepr..."
RawContent        : HTTP/1.1 200 OK
                    Connection: keep-alive
                    Vary: Origin, Accept-Encoding
                    Access-Control-Allow-Credentials: true
                    Pragma: no-cache
                    X-Content-Type-Options: nosniff
                    CF-Cache-Status: HIT
                    Age: 4743
                    Expe...
Forms             : {}
Headers           : {[Connection, keep-alive], [Vary, Origin, Accept-Encoding], [Access-Control-Allow-Credentials, true], [Pragma, no-cache]...}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 292

PipeHow:\Blog> Invoke-RestMethod 'https://jsonplaceholder.typicode.com/posts/1'

userId id title                                                                      body
------ -- -----                                                                      ----
     1  1 sunt aut facere repellat provident occaecati excepturi optio reprehenderit quia et suscipit...
4, sự khác biệt lớn là bạn chỉ nhận được nội dung và không có siêu dữ liệu. Nếu dữ liệu ở dạng JSON, nó cũng sẽ tự động phân tích nó thành một đối tượng. Điều này đặc biệt hữu ích khi làm việc với các API REST phản hồi với dữ liệu ở dạng JSON và loại bỏ nhu cầu chạy nội dung của phản hồi thông qua
$title = $($page.ParsedHtml.getElementsByTagName('title')).innertext;
11 sau đó

$title = $($page.ParsedHtml.getElementsByTagName('title')).innertext;
2

Chúng tôi đã chạy cùng một lệnh, nhưng lần này chúng tôi chỉ nhận được dữ liệu HTML thực của www. Google. com. Nếu chúng ta xem nhanh một trang web có API với thông tin có cấu trúc hơn, chúng ta có thể thấy sự khác biệt rõ ràng hơn

Tôi thích sử dụng API JSONPlaceholder khi trình bày các yêu cầu API, đó là một API giả mạo có thể được sử dụng để kiểm tra mã của bạn

PipeHow:\Blog> Invoke-WebRequest 'https://jsonplaceholder.typicode.com/posts/1'

StatusCode        : 200
StatusDescription : OK
Content           : {
                      "userId": 1,
                      "id": 1,
                      "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
                      "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nrepr..."
RawContent        : HTTP/1.1 200 OK
                    Connection: keep-alive
                    Vary: Origin, Accept-Encoding
                    Access-Control-Allow-Credentials: true
                    Pragma: no-cache
                    X-Content-Type-Options: nosniff
                    CF-Cache-Status: HIT
                    Age: 4743
                    Expe...
Forms             : {}
Headers           : {[Connection, keep-alive], [Vary, Origin, Accept-Encoding], [Access-Control-Allow-Credentials, true], [Pragma, no-cache]...}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 292

PipeHow:\Blog> Invoke-RestMethod 'https://jsonplaceholder.typicode.com/posts/1'

userId id title                                                                      body
------ -- -----                                                                      ----
     1  1 sunt aut facere repellat provident occaecati excepturi optio reprehenderit quia et suscipit...

Gọi các lệnh ghép ngắn cạnh nhau sẽ làm rõ hơn sự khác biệt là gì. Nếu chúng tôi xem xét

PipeHow:\Blog> Invoke-WebRequest 'https://jsonplaceholder.typicode.com/posts/1'

StatusCode        : 200
StatusDescription : OK
Content           : {
                      "userId": 1,
                      "id": 1,
                      "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
                      "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nrepr..."
RawContent        : HTTP/1.1 200 OK
                    Connection: keep-alive
                    Vary: Origin, Accept-Encoding
                    Access-Control-Allow-Credentials: true
                    Pragma: no-cache
                    X-Content-Type-Options: nosniff
                    CF-Cache-Status: HIT
                    Age: 4743
                    Expe...
Forms             : {}
Headers           : {[Connection, keep-alive], [Vary, Origin, Accept-Encoding], [Access-Control-Allow-Credentials, true], [Pragma, no-cache]...}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 292

PipeHow:\Blog> Invoke-RestMethod 'https://jsonplaceholder.typicode.com/posts/1'

userId id title                                                                      body
------ -- -----                                                                      ----
     1  1 sunt aut facere repellat provident occaecati excepturi optio reprehenderit quia et suscipit...
8 của dữ liệu chúng tôi nhận được từ
PipeHow:\Blog> Invoke-WebRequest 'https://jsonplaceholder.typicode.com/posts/1'

StatusCode        : 200
StatusDescription : OK
Content           : {
                      "userId": 1,
                      "id": 1,
                      "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
                      "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nrepr..."
RawContent        : HTTP/1.1 200 OK
                    Connection: keep-alive
                    Vary: Origin, Accept-Encoding
                    Access-Control-Allow-Credentials: true
                    Pragma: no-cache
                    X-Content-Type-Options: nosniff
                    CF-Cache-Status: HIT
                    Age: 4743
                    Expe...
Forms             : {}
Headers           : {[Connection, keep-alive], [Vary, Origin, Accept-Encoding], [Access-Control-Allow-Credentials, true], [Pragma, no-cache]...}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 292

PipeHow:\Blog> Invoke-RestMethod 'https://jsonplaceholder.typicode.com/posts/1'

userId id title                                                                      body
------ -- -----                                                                      ----
     1  1 sunt aut facere repellat provident occaecati excepturi optio reprehenderit quia et suscipit...
4, chúng tôi sẽ thấy rằng đó là một chuỗi JSON đơn giản, trong khi những gì chúng tôi nhận được từ
PipeHow:\Blog> Invoke-WebRequest 'https://jsonplaceholder.typicode.com/posts/1'

StatusCode        : 200
StatusDescription : OK
Content           : {
                      "userId": 1,
                      "id": 1,
                      "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
                      "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nrepr..."
RawContent        : HTTP/1.1 200 OK
                    Connection: keep-alive
                    Vary: Origin, Accept-Encoding
                    Access-Control-Allow-Credentials: true
                    Pragma: no-cache
                    X-Content-Type-Options: nosniff
                    CF-Cache-Status: HIT
                    Age: 4743
                    Expe...
Forms             : {}
Headers           : {[Connection, keep-alive], [Vary, Origin, Accept-Encoding], [Access-Control-Allow-Credentials, true], [Pragma, no-cache]...}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 292

PipeHow:\Blog> Invoke-RestMethod 'https://jsonplaceholder.typicode.com/posts/1'

userId id title                                                                      body
------ -- -----                                                                      ----
     1  1 sunt aut facere repellat provident occaecati excepturi optio reprehenderit quia et suscipit...
5 đã được chuyển đổi thành
$title = $($page.ParsedHtml.getElementsByTagName('title')).innertext;
15 với các thuộc tính được phân tích cú pháp từ dữ liệu JSON

Duyệt các trang web bằng PowerShell

Bây giờ chúng ta đã biết cách lấy dữ liệu từ web, hãy tìm hiểu sâu hơn để tìm hiểu cách chúng ta có thể phân tích cú pháp dữ liệu, nhấp vào nút và duy trì phiên hoạt động sau khi đăng nhập vào trang web

Giống như API giả từ ví dụ trước, có nhiều trang web trực tuyến chỉ nhằm mục đích thử nghiệm quét web, chúng tôi sẽ sử dụng Báo giá để cạo có tính năng đăng nhập

Phân tích dữ liệu

Nếu chúng tôi xem trang web bằng trình duyệt, chúng tôi có thể thấy rằng trang web được chia thành nhiều trích dẫn, có thẻ và tác giả

PowerShell nhận HTML

Hãy đặt mục tiêu của chúng tôi là nhận được tất cả các trích dẫn trên trang đầu tiên, lưu trích dẫn và tác giả của nó và các thẻ vào danh sách. Để làm điều này, chúng tôi sẽ cần phân tích cú pháp HTML và thực hiện điều đó theo cách hiệu quả nhất là sử dụng Biểu thức chính quy hoặc biểu thức chính quy

Nhìn vào HTML của trang web trong PowerShell hoặc bằng cách sử dụng trình duyệt, chúng tôi có thể tìm ra cấu trúc của từng trích dẫn

$title = $($page.ParsedHtml.getElementsByTagName('title')).innertext;
1

  • Trích dẫn nằm trong thẻ
    $title = $($page.ParsedHtml.getElementsByTagName('title')).innertext;
    16 đầu tiên
  • Tác giả ở thẻ
    $title = $($page.ParsedHtml.getElementsByTagName('title')).innertext;
    17
  • Các thẻ nằm trong thuộc tính nội dung của thẻ
    $title = $($page.ParsedHtml.getElementsByTagName('title')).innertext;
    18

Biết được điều này cho phép chúng ta tạo một biểu thức chính quy để thu thập các giá trị này từ một mẫu mà chúng ta có thể sử dụng với toán tử

$title = $($page.ParsedHtml.getElementsByTagName('title')).innertext;
19 trong PowerShell

$address = $( $page.ParsedHtml.getElementsByTagName('p') | ?{$_.className -eq 'address'} ).innertext;
3

PowerShell trả về true hoặc false cho dù chúng tôi có tìm thấy kết quả trùng khớp hay không và cũng tự động lưu trữ bất kỳ kết quả trùng khớp nào trong một bảng băm có tên là

$address = $( $page.ParsedHtml.getElementsByTagName('p') | ?{$_.className -eq 'address'} ).innertext;
30. Mẫu ở trên khớp với văn bản vì
$address = $( $page.ParsedHtml.getElementsByTagName('p') | ?{$_.className -eq 'address'} ).innertext;
31 có nghĩa là “bất kỳ ký tự nào” và
$address = $( $page.ParsedHtml.getElementsByTagName('p') | ?{$_.className -eq 'address'} ).innertext;
32 có nghĩa là “không hoặc nhiều lần”. Chúng ta có thể xem biến
$address = $( $page.ParsedHtml.getElementsByTagName('p') | ?{$_.className -eq 'address'} ).innertext;
30 tự động để xác minh kết quả của mình

$address = $( $page.ParsedHtml.getElementsByTagName('p') | ?{$_.className -eq 'address'} ).innertext;
8

Tuy nhiên, chúng tôi có thể làm tốt hơn, để lọc ra chính xác những gì chúng tôi cần, chúng tôi có thể tạo một nhóm được gọi là nhóm được đặt tên

$address = $( $page.ParsedHtml.getElementsByTagName('p') | ?{$_.className -eq 'address'} ).innertext;
9

Nếu bây giờ chúng tôi chạy lại

$address = $( $page.ParsedHtml.getElementsByTagName('p') | ?{$_.className -eq 'address'} ).innertext;
30, chúng tôi có thể thấy rằng nó có một giá trị mới mà chúng tôi có thể tham chiếu theo tên và nhận giá trị từ

PipeHow:\Blog> Invoke-WebRequest 'https://jsonplaceholder.typicode.com/posts/1'

StatusCode        : 200
StatusDescription : OK
Content           : {
                      "userId": 1,
                      "id": 1,
                      "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
                      "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nrepr..."
RawContent        : HTTP/1.1 200 OK
                    Connection: keep-alive
                    Vary: Origin, Accept-Encoding
                    Access-Control-Allow-Credentials: true
                    Pragma: no-cache
                    X-Content-Type-Options: nosniff
                    CF-Cache-Status: HIT
                    Age: 4743
                    Expe...
Forms             : {}
Headers           : {[Connection, keep-alive], [Vary, Origin, Accept-Encoding], [Access-Control-Allow-Credentials, true], [Pragma, no-cache]...}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 292

PipeHow:\Blog> Invoke-RestMethod 'https://jsonplaceholder.typicode.com/posts/1'

userId id title                                                                      body
------ -- -----                                                                      ----
     1  1 sunt aut facere repellat provident occaecati excepturi optio reprehenderit quia et suscipit...
1

Sử dụng quy trình tương tự, chúng tôi có thể tạo một mẫu tập hợp tất cả các giá trị mà chúng tôi muốn trong các nhóm được đặt tên, theo cấu trúc HTML của từng trích dẫn trên trang

  • Ghép một nhóm được đặt tên cho câu trích dẫn trong thẻ
    $address = $( $page.ParsedHtml.getElementsByTagName('p') | ?{$_.className -eq 'address'} ).innertext;
    35, theo sau là một dòng mới có bất kỳ nội dung nào trên đó
  • Ghép một nhóm được đặt tên cho tác giả trong thẻ
    $address = $( $page.ParsedHtml.getElementsByTagName('p') | ?{$_.className -eq 'address'} ).innertext;
    36, theo sau là 5 dòng mới với bất kỳ nội dung nào trên đó
  • Ghép một nhóm được đặt tên cho các thẻ trong thuộc tính
    $address = $( $page.ParsedHtml.getElementsByTagName('p') | ?{$_.className -eq 'address'} ).innertext;
    37 của thẻ
    $address = $( $page.ParsedHtml.getElementsByTagName('p') | ?{$_.className -eq 'address'} ).innertext;
    38

Tôi sẽ không đi sâu vào cách thức hoạt động của regex trong bài đăng này, đó là lúc khác, nhưng mẫu sau phù hợp với cấu trúc của từng trích dẫn

PipeHow:\Blog> Invoke-WebRequest 'https://jsonplaceholder.typicode.com/posts/1'

StatusCode        : 200
StatusDescription : OK
Content           : {
                      "userId": 1,
                      "id": 1,
                      "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
                      "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nrepr..."
RawContent        : HTTP/1.1 200 OK
                    Connection: keep-alive
                    Vary: Origin, Accept-Encoding
                    Access-Control-Allow-Credentials: true
                    Pragma: no-cache
                    X-Content-Type-Options: nosniff
                    CF-Cache-Status: HIT
                    Age: 4743
                    Expe...
Forms             : {}
Headers           : {[Connection, keep-alive], [Vary, Origin, Accept-Encoding], [Access-Control-Allow-Credentials, true], [Pragma, no-cache]...}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 292

PipeHow:\Blog> Invoke-RestMethod 'https://jsonplaceholder.typicode.com/posts/1'

userId id title                                                                      body
------ -- -----                                                                      ----
     1  1 sunt aut facere repellat provident occaecati excepturi optio reprehenderit quia et suscipit...
6

Điều này cho phép chúng tôi tìm thấy văn bản trong từng mẫu mà chúng tôi đã xác định trước đó

PipeHow:\Blog> Invoke-WebRequest 'https://jsonplaceholder.typicode.com/posts/1'

StatusCode        : 200
StatusDescription : OK
Content           : {
                      "userId": 1,
                      "id": 1,
                      "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
                      "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nrepr..."
RawContent        : HTTP/1.1 200 OK
                    Connection: keep-alive
                    Vary: Origin, Accept-Encoding
                    Access-Control-Allow-Credentials: true
                    Pragma: no-cache
                    X-Content-Type-Options: nosniff
                    CF-Cache-Status: HIT
                    Age: 4743
                    Expe...
Forms             : {}
Headers           : {[Connection, keep-alive], [Vary, Origin, Accept-Encoding], [Access-Control-Allow-Credentials, true], [Pragma, no-cache]...}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 292

PipeHow:\Blog> Invoke-RestMethod 'https://jsonplaceholder.typicode.com/posts/1'

userId id title                                                                      body
------ -- -----                                                                      ----
     1  1 sunt aut facere repellat provident occaecati excepturi optio reprehenderit quia et suscipit...
7

Vấn đề là ngay cả khi chúng tôi chạy nó trên tất cả dữ liệu HTML của mình, chúng tôi chỉ nhận được một trích dẫn duy nhất khớp, điều này là do

$title = $($page.ParsedHtml.getElementsByTagName('title')).innertext;
19 chỉ trả về một kết quả khớp duy nhất, câu đầu tiên. Cũng có nhiều cách khác để so khớp bằng biểu thức chính quy trong PowerShell, điều này cho phép chúng tôi nhận được tất cả các kết quả khớp, chúng tôi có thể sử dụng
$address = $( $page.ParsedHtml.getElementsByTagName('p') | ?{$_.className -eq 'address'} ).innertext;
80 với tham số
$address = $( $page.ParsedHtml.getElementsByTagName('p') | ?{$_.className -eq 'address'} ).innertext;
81 và sau đó xem thuộc tính
$address = $( $page.ParsedHtml.getElementsByTagName('p') | ?{$_.className -eq 'address'} ).innertext;
82 của giá trị trả về hoặc chạy lệnh. NET phiên bản
$address = $( $page.ParsedHtml.getElementsByTagName('p') | ?{$_.className -eq 'address'} ).innertext;
83

$title = $($page.ParsedHtml.getElementsByTagName('title')).innertext;
20

Cả hai lệnh trên đều cho kết quả như nhau. Mỗi trận đấu đi kèm với một số siêu dữ liệu như độ dài và chỉ mục trong tổng chuỗi

$title = $($page.ParsedHtml.getElementsByTagName('title')).innertext;
21

Chúng tôi chỉ quan tâm đến các nhóm được đặt tên phù hợp, vì vậy tất cả những gì chúng tôi cần là một số phép thuật để lấy những nhóm đó từ mỗi trích dẫn. Để làm điều này, chúng ta có thể lặp qua tất cả các kết quả phù hợp và lưu một đối tượng tùy chỉnh của từng trích dẫn vào một mảng và chúng ta đã hoàn tất

$title = $($page.ParsedHtml.getElementsByTagName('title')).innertext;
22

Nhìn vào

$address = $( $page.ParsedHtml.getElementsByTagName('p') | ?{$_.className -eq 'address'} ).innertext;
84, giờ đây chúng ta có thể thấy tất cả các trích dẫn khác nhau, với tác giả của chúng và các thẻ từ trang web được tách ra khỏi nhau thành một mảng

$title = $($page.ParsedHtml.getElementsByTagName('title')).innertext;
23

Tương tác với một trang web bằng PowerShell

Cho đến nay, chúng tôi đã lấy dữ liệu từ một trang web và sau đó xem xét hoặc định dạng cục bộ dữ liệu đó trong PowerShell, nhưng đôi khi có trường hợp dữ liệu bị khóa sau một cú nhấp chuột. Đôi khi, bạn cần đăng nhập vào một trang web bằng thông tin đăng nhập của mình trước khi có thể truy cập dữ liệu và việc đó yêu cầu bạn phải có một phiên hoạt động giữa các yêu cầu web của mình

Bạn có thể quản lý phiên liên tục giữa các yêu cầu bằng cả hai lệnh ghép ngắn mà chúng tôi đã trải qua, nhưng bạn sẽ dễ dàng quản lý những thứ như nhập thông tin vào trường và nhấp vào nút nếu bạn sử dụng

PipeHow:\Blog> Invoke-WebRequest 'https://jsonplaceholder.typicode.com/posts/1'

StatusCode        : 200
StatusDescription : OK
Content           : {
                      "userId": 1,
                      "id": 1,
                      "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
                      "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nrepr..."
RawContent        : HTTP/1.1 200 OK
                    Connection: keep-alive
                    Vary: Origin, Accept-Encoding
                    Access-Control-Allow-Credentials: true
                    Pragma: no-cache
                    X-Content-Type-Options: nosniff
                    CF-Cache-Status: HIT
                    Age: 4743
                    Expe...
Forms             : {}
Headers           : {[Connection, keep-alive], [Vary, Origin, Accept-Encoding], [Access-Control-Allow-Credentials, true], [Pragma, no-cache]...}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 292

PipeHow:\Blog> Invoke-RestMethod 'https://jsonplaceholder.typicode.com/posts/1'

userId id title                                                                      body
------ -- -----                                                                      ----
     1  1 sunt aut facere repellat provident occaecati excepturi optio reprehenderit quia et suscipit...
4 vì thông tin bổ sung mà nó trả về

Hãy sử dụng lại cùng một trang web và thử xem các tùy chọn đăng nhập của chúng tôi

$title = $($page.ParsedHtml.getElementsByTagName('title')).innertext;
24

Ở đây chúng ta có thể thấy rằng chúng ta dường như không có biểu mẫu nào để điền và không có trường nhập liệu, nhưng chúng ta có một số liên kết. Nếu chúng ta nhìn lại giao diện của trang web, chúng ta có thể thấy rằng có một liên kết dẫn đến trang đăng nhập. Có rất nhiều liên kết nên tôi sẽ không liệt kê tất cả, nhưng chúng tôi có thể lọc ra liên kết mà chúng tôi muốn. Chúng tôi cũng có thể sử dụng các liên kết để nhấp vào nút “Tiếp theo” để triển khai phân trang cho tất cả các trích dẫn trên trang web

Một điều cần lưu ý là các thuộc tính

$address = $( $page.ParsedHtml.getElementsByTagName('p') | ?{$_.className -eq 'address'} ).innertext;
86 và
$address = $( $page.ParsedHtml.getElementsByTagName('p') | ?{$_.className -eq 'address'} ).innertext;
87 vẫn có thể có nội dung ngay cả khi nó không hiển thị khi nhìn vào chính đối tượng đó. Hãy xem liên kết và cũng đảm bảo rằng chúng tôi không thiếu bất kỳ trường nào để điền vào trang khởi chạy

$title = $($page.ParsedHtml.getElementsByTagName('title')).innertext;
25

Có vẻ như thực sự không có biểu mẫu hoặc trường nào. Điều này phù hợp với mong đợi của chúng tôi vì không có trang nào hiển thị khi truy cập trang chính trong trình duyệt, nhưng đó là thói quen tốt để xem qua các thuộc tính để chúng tôi biết mình phải làm việc với cái gì

$title = $($page.ParsedHtml.getElementsByTagName('title')).innertext;
26

Chúng tôi có thể thấy rằng liên kết của chúng tôi có một thuộc tính được gọi là

$address = $( $page.ParsedHtml.getElementsByTagName('p') | ?{$_.className -eq 'address'} ).innertext;
88, nếu bạn đã từng viết HTML, bạn có thể nhận ra đó là đích đến của một liên kết. Trên thực tế, đây chỉ là HTML bình thường mà PowerShell đã phân tích cú pháp thành một đối tượng cho chúng tôi, giúp duyệt nội dung thuận tiện hơn

Chúng tôi sẽ sử dụng giá trị

$address = $( $page.ParsedHtml.getElementsByTagName('p') | ?{$_.className -eq 'address'} ).innertext;
88 của liên kết mà chúng tôi đã tìm thấy và chỉ cần thêm nó vào URL cơ sở của chúng tôi trong một chuỗi, sau đó sử dụng lại
PipeHow:\Blog> Invoke-WebRequest 'https://jsonplaceholder.typicode.com/posts/1'

StatusCode        : 200
StatusDescription : OK
Content           : {
                      "userId": 1,
                      "id": 1,
                      "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
                      "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nrepr..."
RawContent        : HTTP/1.1 200 OK
                    Connection: keep-alive
                    Vary: Origin, Accept-Encoding
                    Access-Control-Allow-Credentials: true
                    Pragma: no-cache
                    X-Content-Type-Options: nosniff
                    CF-Cache-Status: HIT
                    Age: 4743
                    Expe...
Forms             : {}
Headers           : {[Connection, keep-alive], [Vary, Origin, Accept-Encoding], [Access-Control-Allow-Credentials, true], [Pragma, no-cache]...}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 292

PipeHow:\Blog> Invoke-RestMethod 'https://jsonplaceholder.typicode.com/posts/1'

userId id title                                                                      body
------ -- -----                                                                      ----
     1  1 sunt aut facere repellat provident occaecati excepturi optio reprehenderit quia et suscipit...
4 vào URL phức hợp mới của chúng tôi. Sau đó, chúng tôi sẽ xem xét các thuộc tính để xem liệu chúng tôi có thể tìm thấy bất kỳ trường hoặc biểu mẫu mới nào không. Chúng ta cũng hãy tận dụng cơ hội để tạo một phiên web liên tục mà chúng ta sẽ sử dụng cho các yêu cầu web trong tương lai, điều này được thực hiện bằng cách sử dụng tham số
$address = $( $page.ParsedHtml.getElementsByTagName('p') | ?{$_.className -eq 'address'} ).innertext;
91 trong đó chúng ta chỉ định tên của một biến mà chúng ta muốn lưu trữ phiên mới của mình, trong trường hợp của chúng ta là '

$title = $($page.ParsedHtml.getElementsByTagName('title')).innertext;
27

Chắc chắn có một số trường nhập mới, nhưng thực tế cũng có một số biểu mẫu ẩn. Biểu mẫu thường là cách nhập dữ liệu vào trang web, vì vậy chúng tôi muốn tìm những biểu mẫu đó khi cố gắng đăng nhập vào trang web bằng PowerShell, bằng cách truy cập thuộc tính

$address = $( $page.ParsedHtml.getElementsByTagName('p') | ?{$_.className -eq 'address'} ).innertext;
86

$title = $($page.ParsedHtml.getElementsByTagName('title')).innertext;
28

Có một vài điều thú vị cần lưu ý ở đây. Đầu tiên, nó cho thấy rằng

$address = $( $page.ParsedHtml.getElementsByTagName('p') | ?{$_.className -eq 'address'} ).innertext;
94 đăng nhập đang sử dụng cùng một URL mà chúng ta vừa duyệt đến, hành động này xảy ra khi người dùng nhấp vào nút đăng nhập trong trình duyệt. Các hành động, giống như các liên kết, có một đường dẫn thêm vào URL cơ sở của trang web. Chúng ta cũng có thể thấy rằng nó sử dụng phương thức HTTP
$address = $( $page.ParsedHtml.getElementsByTagName('p') | ?{$_.className -eq 'address'} ).innertext;
95 được sử dụng khi bạn muốn gửi dữ liệu trở lại trang web. Điều này có vẻ đầy hứa hẹn, vì vậy hãy xem liệu chúng ta có thể đặt tên người dùng và mật khẩu không. Trang web này thực sự chấp nhận bất kỳ giá trị nào vì nó chỉ dành cho thử nghiệm, vì vậy đầu vào của chúng tôi không thành vấn đề

Một điều nữa cần lưu ý là thuộc tính

$address = $( $page.ParsedHtml.getElementsByTagName('p') | ?{$_.className -eq 'address'} ).innertext;
86 thực sự là một danh sách, vì vậy để đảm bảo mọi thứ đều đúng, chúng tôi sẽ truy cập vào các trường của biểu mẫu đầu tiên được tìm thấy trên trang, đây cũng là trường duy nhất. Bạn truy cập các trường giống như bạn làm với các giá trị trong bảng băm

$title = $($page.ParsedHtml.getElementsByTagName('title')).innertext;
29

Tuyệt quá. Bây giờ, tất cả những gì chúng ta cần làm là đăng lại trang này và đảm bảo sử dụng phiên mà chúng ta đã tạo để có thể tiếp tục duyệt trang sau khi đăng nhập. Nội dung của bài đăng sẽ là toàn bộ phản hồi đã sửa đổi của yêu cầu web trước đó, trong trường hợp của chúng tôi, biến

$address = $( $page.ParsedHtml.getElementsByTagName('p') | ?{$_.className -eq 'address'} ).innertext;
97 mà chúng tôi đã thêm thông tin đăng nhập của mình vào

PipeHow:\Blog> Invoke-WebRequest 'https://jsonplaceholder.typicode.com/posts/1'

StatusCode        : 200
StatusDescription : OK
Content           : {
                      "userId": 1,
                      "id": 1,
                      "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
                      "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nrepr..."
RawContent        : HTTP/1.1 200 OK
                    Connection: keep-alive
                    Vary: Origin, Accept-Encoding
                    Access-Control-Allow-Credentials: true
                    Pragma: no-cache
                    X-Content-Type-Options: nosniff
                    CF-Cache-Status: HIT
                    Age: 4743
                    Expe...
Forms             : {}
Headers           : {[Connection, keep-alive], [Vary, Origin, Accept-Encoding], [Access-Control-Allow-Credentials, true], [Pragma, no-cache]...}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 292

PipeHow:\Blog> Invoke-RestMethod 'https://jsonplaceholder.typicode.com/posts/1'

userId id title                                                                      body
------ -- -----                                                                      ----
     1  1 sunt aut facere repellat provident occaecati excepturi optio reprehenderit quia et suscipit...
0

Mặc dù hành động đăng nhập có cùng đường dẫn với liên kết trước đó của chúng tôi, tôi đã sử dụng hành động này như một phần của URL để thay thế. Điều này phải rõ ràng hơn vì chúng không nhất thiết phải giống nhau

Nếu mọi thứ hoạt động như mong đợi, giống như trong trình duyệt, chúng tôi sẽ được chuyển hướng đến trang chính với một trong các liên kết hiện là “Đăng xuất” thay vào đó

PipeHow:\Blog> Invoke-WebRequest 'https://jsonplaceholder.typicode.com/posts/1'

StatusCode        : 200
StatusDescription : OK
Content           : {
                      "userId": 1,
                      "id": 1,
                      "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
                      "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nrepr..."
RawContent        : HTTP/1.1 200 OK
                    Connection: keep-alive
                    Vary: Origin, Accept-Encoding
                    Access-Control-Allow-Credentials: true
                    Pragma: no-cache
                    X-Content-Type-Options: nosniff
                    CF-Cache-Status: HIT
                    Age: 4743
                    Expe...
Forms             : {}
Headers           : {[Connection, keep-alive], [Vary, Origin, Accept-Encoding], [Access-Control-Allow-Credentials, true], [Pragma, no-cache]...}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 292

PipeHow:\Blog> Invoke-RestMethod 'https://jsonplaceholder.typicode.com/posts/1'

userId id title                                                                      body
------ -- -----                                                                      ----
     1  1 sunt aut facere repellat provident occaecati excepturi optio reprehenderit quia et suscipit...
1

Chúng tôi đã đăng nhập thành công. Chúng tôi có thể tiếp tục sử dụng phiên web của mình để điều hướng sâu hơn vào trang web nếu muốn và chúng tôi sẽ tiếp tục đăng nhập như bình thường. Hãy nhấp vào một liên kết khác, chẳng hạn như liên kết “Tiếp theo” và xem liệu chúng tôi có còn nút đăng xuất hay không, điều đó có nghĩa là chúng tôi đã giữ phiên của mình

PipeHow:\Blog> Invoke-WebRequest 'https://jsonplaceholder.typicode.com/posts/1'

StatusCode        : 200
StatusDescription : OK
Content           : {
                      "userId": 1,
                      "id": 1,
                      "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
                      "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nrepr..."
RawContent        : HTTP/1.1 200 OK
                    Connection: keep-alive
                    Vary: Origin, Accept-Encoding
                    Access-Control-Allow-Credentials: true
                    Pragma: no-cache
                    X-Content-Type-Options: nosniff
                    CF-Cache-Status: HIT
                    Age: 4743
                    Expe...
Forms             : {}
Headers           : {[Connection, keep-alive], [Vary, Origin, Accept-Encoding], [Access-Control-Allow-Credentials, true], [Pragma, no-cache]...}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 292

PipeHow:\Blog> Invoke-RestMethod 'https://jsonplaceholder.typicode.com/posts/1'

userId id title                                                                      body
------ -- -----                                                                      ----
     1  1 sunt aut facere repellat provident occaecati excepturi optio reprehenderit quia et suscipit...
2

Chúng tôi sẽ xác minh rằng chúng tôi đã kết thúc trên một trang khác bằng cách khám phá đích đến của nút “Tiếp theo” của trang này và đảm bảo rằng chúng tôi vẫn có liên kết để đăng xuất thông qua

PipeHow:\Blog> Invoke-WebRequest 'https://jsonplaceholder.typicode.com/posts/1'

StatusCode        : 200
StatusDescription : OK
Content           : {
                      "userId": 1,
                      "id": 1,
                      "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
                      "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nrepr..."
RawContent        : HTTP/1.1 200 OK
                    Connection: keep-alive
                    Vary: Origin, Accept-Encoding
                    Access-Control-Allow-Credentials: true
                    Pragma: no-cache
                    X-Content-Type-Options: nosniff
                    CF-Cache-Status: HIT
                    Age: 4743
                    Expe...
Forms             : {}
Headers           : {[Connection, keep-alive], [Vary, Origin, Accept-Encoding], [Access-Control-Allow-Credentials, true], [Pragma, no-cache]...}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 292

PipeHow:\Blog> Invoke-RestMethod 'https://jsonplaceholder.typicode.com/posts/1'

userId id title                                                                      body
------ -- -----                                                                      ----
     1  1 sunt aut facere repellat provident occaecati excepturi optio reprehenderit quia et suscipit...
3

Trang tiếp theo là số 3 và chúng tôi vẫn có thể đăng xuất. Miễn là chúng tôi cung cấp phiên của mình, chúng tôi có thể tiếp tục duyệt trong khi đăng nhập. Chúng tôi thậm chí có thể có một số phiên duyệt hoạt động cùng lúc bằng cách sử dụng các biến khác nhau, nếu chúng tôi muốn

Tôi hy vọng bạn đã học được điều gì đó mới mẻ về cách làm việc với nội dung web trong PowerShell, nếu bạn nghĩ ra một dự án quét web thú vị, bạn có thể đăng nhận xét về cách thức và những gì bạn đã làm bên dưới

Làm cách nào để đọc HTML trong PowerShell?

Lệnh ghép ngắn Get-Content được sử dụng để đọc nội dung của tệp html.

Làm cách nào để sử dụng HTML trong PowerShell?

PowerShell cung cấp một lệnh ghép ngắn tích hợp có tên là ConvertTo-Html. Điều này lấy các đối tượng làm đầu vào và chuyển đổi từng đối tượng thành trang web HTML. Để sử dụng tính năng này, chỉ cần lấy đầu ra và chuyển trực tiếp sang ConvertTo-Html . Lệnh ghép ngắn sau đó sẽ trả về một chuỗi HTML lớn.

Làm cách nào để có được đầu ra PowerShell trong HTML?

Để tạo báo cáo HTML bằng PowerShell, chúng ta có thể sử dụng lệnh ConvertTo-HTML . Ví dụ: giả sử chúng ta cần báo cáo các dịch vụ ở định dạng HTML, sau đó chúng ta có thể sử dụng ConvertTo-HTML làm đường dẫn.

Bạn có thể quét web bằng PowerShell không?

Nếu bạn là kỹ sư tự động hóa quy trình hoặc chuyên gia DevOps, rất có thể bạn muốn mọi thứ được tự động hóa bằng tập lệnh PowerShell có thể hoạt động trong ngữ cảnh đa nền tảng – đó là lý do . .