Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Ruby

Xây dựng Trình Thu thập Thông tin Trang Web Đầu tiên Của bạn, Phần 2

by
Length:LongLanguages:

Vietnamese (Tiếng Việt) translation by Dai Phong (you can also view the original English article)

Trong hướng dẫn này, bạn sẽ học cách sử dụng Mechanize để nhấp vào các liên kết, điền thông tin vào form và tải lên tập tin. Bạn cũng sẽ tìm hiểu cách để bạn có thể chia nhỏ các đối tượng trang của Mechanize và cách tự động tìm kiếm trên Google và lưu kết quả tìm kiếm.

Các chủ đề

  • Trang đơn và Phân trang
  • Mechanize
  • Agent
  • Page
  • Các phương thức Nokogiri
  • Liên kết
  • Nhấp chuột
  • Form

Trang đơn và Phân trang

Cho đến lúc này, chúng ta đã dành nhiều thời gian để tìm ra cách có thể thu thập thông tin màn hình của một trang đơn bằng Nokogiri. Đây là một bước đệm để chuyển lên một bước cao hơn và học cách để trích xuất nội dung từ nhiều trang.

Suy cho cùng, vấn đề mà chúng ta đang cố gắng giải quyết liên quan đến việc lấy về nội dung từ hơn 140 tập - nghĩa là toàn bộ nội dụng không thể vừa với một trang. Chúng ta phải làm việc với phân trang và cần tìm ra cách để lần theo nội dung để đến các trang tiếp theo.

Sứ mệnh của Nokogiri đến đây là kết thúc và một gem hữu ích khác được gọi là Mechanize bắt đầu sứ mệnh của nó.

Mechanize

Mechanize là một công cụ mạnh mẽ khác, cung cấp nhiều tính năng tuyệt vời. Về cơ bản, nó cho phép bạn tự động hóa các tương tác với trang web mà bạn cần trích xuất nội dung. Theo đó, nó nhắc tôi nhớ một chút về một số tính năng mà bạn có thể biết từ thử nghiệm với Capybara.

Xin đừng hiểu lầm, làm việc với Nokogiri trên một trang đơn là điều tuyệt vời, nhưng để trích xuất nhiều dữ liệu hơn chúng ta cần thêm một chút sức mạnh. Về cơ bản, chúng ta có thể thu thập thông tin từ bao nhiêu trang cũng được và tương tác với các thành phần của chúng - bắt chước và tự động hóa hành vi của con người. Một công cụ khá mạnh mẽ!

Gem này cho phép bạn nhấp vào các liên kết, điền vào các trường của form và gửi dữ liệu đó - thậm chí là làm việc với cookie. Điều đó có nghĩa là bạn còn có thể bắt chước người dùng đăng nhập vào các session riêng tư và lấy nội dung từ một trang web chỉ khi bạn có thể truy cập.

Bạn điền thông tin đăng nhập bằng các thông tin xác thực của bạn và nói cho Mechanize biết phải làm thế nào. Với việc có thể nhấp vào liên kết và submit form, nên không có gì mà bạn không thể làm với công cụ này. Nó có một mối quan hệ gần gũi với Nokogiri và cũng phụ thuộc vào nó. Aaron Patterson một lần nữa là một trong những người tạo ra gem đáng yêu này.

Khởi tạo một Mechanize Agent

Trước khi chúng ta có thể bắt đầu làm việc với Mechanize, chúng ta cần phải khởi tạo một Mechanize Agent.

some_scraper.rb

agent này sẽ được sử dụng để truy cập một trang web, tương tự như những gì chúng ta đã làm với Nokogiri.

some_scraper.rb

Những gì xảy ra ở đây là Mechanize agent nhận trang podcast và các cookie của nó.

Trích xuất Nội dung của Trang

Bây giờ chúng ta có một trang sẵn sàng để trích xuất. Trước khi chúng ta làm điều đó, tôi khuyên bạn nên xem xét những gì xảy ra bên trong bằng phương thức inspect.

some_scraper.rb

Đầu ra khá rời rạc. Hãy tự mình quan sát và xem đối tượng Mechanize::Page bao gồm những gì. Ở đây bạn có thể nhìn thấy tất cả các thuộc tính cho trang đó.

Đối với tôi, đây là một đối tượng thật sự hữu ích để chia nhỏ dữ liệu mà bạn muốn trích xuất.

Đầu ra

Nếu bạn muốn quan sát bản thân trang HTML, bạn có thể gắn các phương thức body hoặc content.

some_scraper.rb

Đầu ra

Vì podcast này chỉ có một số lượng nhỏ các phần tử khác nhau trên trang, nên đây là những gì Mechanize::Page lấy về từ github.com. Nó còn có nhiều loại nội dung. Tôi nghĩ rằng đây là điều quan trọng để có được một cái nhìn ban đầu.

Đầu ra github.com

Quay trở lại podcast, bạn cũng có thể nhìn thấy các nội dung như mã hóa, code phản hồi HTTP, URI hoặc header của phản hồi.

some_scraper.rb

Đầu ra

Còn có rất nhiều thứ khác nếu bạn muốn đi sâu hơn nữa. Tôi sẽ để lại nó cho bạn.

Các Phương thức Nokogiri

  • at
  • search

Mechanize sử dụng Nokogiri để thu thập dữ liệu từ các trang. Bạn có thể áp dụng những gì bạn đã học được về Nokogiri ở trong bài viết đầu tiên và đồng thời sử dụng nó trên các trang Mechanize. Có nghĩa là bạn sử dụng Mechanize để điều hướng các trang và dùng các phương thức Nokogiri cho nhu cầu truy xuất dữ liệu của bạn.

Ví dụ, bạn muốn tìm kiếm một đối tượng đơn lẻ, bạn có thể sử dụng at, trong khi đó, search trả về tất cả các đối tượng khớp với bộ chọn trên một trang cụ thể. Nói tóm lại, những phương thức này sẽ hoạt động trên các đối tượng tài liệu Nokogiri và cả các đối tượng trang Mechanize.

some_scraper.rb

Đầu ra

Làm việc với Liên kết

  • links
  • link_with
  • links_with

Chúng ta cũng có thể điều hướng trên toàn bộ trang web theo ý của chúng ta. Có lẽ, phần quan trọng nhất của Mechanize là khả năng cho phép bạn làm việc với các liên kết. Nếu không bạn có thể chỉ cần sử dụng Nokogiri. Hãy quan sát những gì chúng ta nhận được nếu chúng ta truy vấn các liên kết của một trang.

some_scraper.rb

Đầu ra

Thật là vi diệu, hãy chia nhỏ nó ra để dễ quan sát hơn. Vì chúng ta vẫn chưa nói với Mechanize tìm ở nơi khác, nên chúng ta nhận được một loạt các liên kết chỉ từ trang đầu tiên đó. Mechanize đi xuyên qua trang đó theo thứ tự giảm dần và trả về danh sách các liên kết này từ trên xuống dưới. Tôi đã tạo ra một hình minh hoạ nhỏ với các con trỏ màu xanh trỏ đến các liên kết khác nhau mà bạn có thể nhìn thấy trong đầu ra.

Xin nói thêm là, việc này đã cho bạn thấy kết quả cuối cùng của trang podcast đã được thiết kế lại của tôi. Tôi nghĩ rằng phiên bản này tốt hơn một chút cho mục đích minh hoạ. Bạn cũng có được một cái nhìn sơ qua về kết quả sau cùng và lý do tại sao tôi cần phải trích xuất trang web Sinatra cũ của tôi.

Ảnh chụp màn hình

Podcast Links

Như mọi khi, chúng ta cũng có thể chỉ trích xuất phần văn bản từ đó.

some_scraper.rb

Đầu ra

Lấy về tất cả các liên kết này với số lượng lớn có thể là rất hữu ích hoặc cũng có thể là rất nhàm chán. May mắn thay, chúng ta có một vài công cụ sẵn có để điều chỉnh những gì chúng ta cần.

some_scraper.rb

Đầu ra

Bùm! Bây giờ chúng ta đã có được một kết quả khác! Chúng ta có thể tìm ra các liên kết cụ thể giống như vậy. Chúng ta có thể chọn các liên kết khớp với một tiêu chí nhất định, ví dụ như văn bản của nó - với một API tuyệt vời links_with hoặc link_with. Ngoài ra, nếu chúng ta có nhiều liên kết Focus, chúng ta có thể trích ra một số lượng cụ thể trên trang bằng cặp dấu ngoặc vuông [].

some_scraper.rb

Nếu bạn không tìm theo văn bản của liên kết mà là chính bản thân liên kết, thì bạn chỉ cần chỉ định một href cụ thể để tìm liên kết đó. Mechanize sẽ không gây khó dễ cho bạn. Thay vì text, bạn đưa vào các phương thức bằng href.

some_scraper.rb

Nếu bạn chỉ muốn tìm ra liên kết đầu tiên ứng với phần văn bản mong muốn, bạn cũng có thể sử dụng cú pháp này. Rất tiện lợi và khá dễ đọc.

some_scraper.rb

Muốn nhấp vào liên kết Focus và xem nó dẫn đến đâu thì làm thế nào? Hãy click vào nó!

Nhấp chuột

some_scraper.rb

Điều này sẽ mang lại cho chúng ta một danh sách dài các liên kết giống như trước. Hãy xem dễ dàng làm sao khi kết hợp với .click.links. Mechanize nhấp vào liên kết cho bạn và đi đến trang mới. Vì chúng ta cũng yêu cầu một danh sách các liên kết, nên  chúng ta sẽ nhận được tất cả các liên kết mà Mechanize có thể tìm thấy trên trang mới đó.

Giả sử tôi có hai liên kết văn bản của cùng một người được phỏng vấn - một liên kết đến các thẻ (tag) và một liên kết đến một tập gần đây - và tôi muốn lấy về các liên kết từ mỗi trang này.

some_scraper.rb

Điều này sẽ mang lại cho bạn một danh sách các liên kết cho cả hai trang. Bạn lặp qua mỗi liên kết cho người được phỏng vấn và Mechanize đi theo liên kết được nhấp và thu thập các liên kết mà nó tìm thấy trên trang mới cho bạn. Bên dưới bạn có thể thấy một vài ví dụ trong đó bạn có thể so sánh những sự kết hợp khác nhau.

some_scraper.rb

Form

  • submit
  • field_with
  • checkbox_with
  • radiobuttons_with
  • file_uploads

Nào cùng tìm hiểu về form!

some_scraper.rb

Đầu ra

Bởi vì chúng ta sử dụng phương thức forms, nên chúng ta nhận được một mảng - ngay cả khi chỉ có một form được trả về. Bây giờ chúng ta đã biết rằng, form này có tên là "f", chúng ta có thể sử dụng phiên bản số ít form để làm việc với nó.

some_scraper.rb

Sử dụng form('f'), chúng ta chỉ ra một form cụ thể mà chúng ta muốn làm việc. Kết quả là, chúng ta sẽ không còn nhận được một mảng.

Đầu ra

Chúng ta còn có thể xác định tên của trường văn bản (q).

Chúng ta có thể chọn nó bằng tên đó và thiết lập giá trị của nó giống như các thuộc tính Ruby. Tất cả những gì chúng ta cần làm là cung cấp cho nó một giá trị mới. Bạn có thể thấy trong đầu ra ở ví dụ trên rằng mặc định là nó rỗng.

some_scraper.rb

Đầu ra

Như bạn có thể quan sát thấy ở trên, giá trị cho trường văn bản đã thay đổi thành New Google Search. Bây giờ chúng ta chỉ cần submit form đó và thu thập kết quả từ trang mà Google trả về. Không thể đơn giản hơn. Lần này chúng ta hãy tìm kiếm cái gì đó khác!

some_scraper.rb

Ở đây tôi đã xác định được tiêu đề của kết quả tìm kiếm bằng một bộ chọn CSS h3.r, ánh xạ text của nó và in ra kết quả. Không có gì khó khăn cả, đúng không? Đó là một ví dụ đơn giản, tất nhiên rồi, nhưng hãy nghĩ về những khả năng vô bạn mà bạn có thể làm với nó!

Đầu ra

Mechanize có các trường input khác nhau để bạn sử dụng. Bạn thậm chí có thể tải lên các tập tin!

  • field_with
  • checkbox_with
  • radiobuttons_with
  • file_uploads

Bạn cũng có thể xác định các radio button và checkbox theo tên của chúng và tích chúng bằng - bạn có thể đoán - đó là check.

some_scraper.rb

Các thẻ option cung cấp cho người dùng khả năng chọn một mục từ danh sách sổ xuống. Một lần nữa, chúng ta chọn chúng theo tên và chọn số tùy chọn mà chúng ta muốn.

some_scraper.rb

File_uploads hoạt động tương tự như việc nhập văn bản vào form bằng cách thiết lập nó như các thuộc tính của Ruby. Bạn xác định trường tải lên và sau đó chỉ định đường dẫn tập tin (tên tập tin) mà bạn muốn tải lên. Nghe thì có vẻ hơi phức tạp vậy thôi. Hãy xem!

some_scraper.rb

Phần Tóm lược

Hãy xem, không có gì là ma thuật cả! Bạn đã có được một công cụ thú vị. Chắc chắn sẽ cần phải tìm hiểu thêm về Nokogiri và Mechanize, nhưng thay vì dành quá nhiều thời gian vào các khía cạnh không cần thiết, hãy làm việc với nó và xem thêm một số tài liệu hướng dẫn khi bạn gặp khó khăn.

Tôi hy vọng bạn có thể thấy gem này đơn giản như thế nào và sức mạnh mà nó cung cấp cho bạn. Bây giờ, như tất cả chúng ta đều biết từ văn hoá quần chúng, điều này cũng đi kèm với trách nhiệm. Hãy sử dụng nó trong các khuôn khổ pháp lý và khi bạn không thể truy cập vào một API. Có thể bạn sẽ không thường xuyên sử dụng những công cụ này, nhưng nó sẽ có ích khi bạn thật sự có nhu cầu trích xuất thông tin trang web.

Như đã hứa, trong phần tiếp theo, chúng ta sẽ tìm hiểu một ví dụ thực tế, nơi tôi sẽ trích xuất dữ liệu từ trang podcast của tôi. Tôi sẽ trích xuất nó từ một trang web Sinatra cũ và chuyển nó sang trang web Middleman mới của tôi sử dụng các tập tin .markdown cho mỗi tập. Chúng ta sẽ trích xuất ngày, số tập, tên người được phỏng vấn, tiêu đề, tiêu đề phụ và vân vân. Hẹn gặp bạn ở đó!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.