Mục lục bài viết:
Show
Sử dụng đối tượng BeautifulSoup Tương tác với các biểu mẫu HTML Cài đặt MechanicalSoup
Phần kết luận Tài nguyên bổ sung Cạo và phân tích cú pháp văn bản từ trang webWeb cạo là quá trình thu thập và phân tích cú pháp dữ liệu thô từ Web và cộng đồng Python đã đưa ra một số công cụ cạo web khá mạnh mẽ.
Phân tích cú pháp dữ liệu trang web bằng các phương thức chuỗi và biểu thức chính quy Phân tích cú pháp dữ liệu trang web bằng trình phân tích cú pháp HTML Tương tác với các biểu mẫu và các thành phần trang web khác Trình duyệt web đầu tiên của bạnLưu ý: Hướng dẫn này được điều chỉnh từ chương “Tương tác với web” trong Kiến thức cơ bản về Python: Giới thiệu thực tế về Python 3 . Cuốn sách sử dụng trình soạn thảo IDLE tích hợp sẵn của Python để tạo và chỉnh sửa các tệp Python cũng như tương tác với trình bao Python, vì vậy bạn sẽ thấy các tham chiếu không thường xuyên đến IDLE trong suốt hướng dẫn này. Tuy nhiên, bạn sẽ không gặp vấn đề gì khi chạy mã mẫu từ trình soạn thảo và môi trường mà bạn chọn. Thu thập dữ liệu từ các trang web bằng quy trình tự động được gọi là thu thập dữ liệu web. Một số trang web cấm người dùng cạo dữ liệu của họ một cách rõ ràng bằng các công cụ tự động như những công cụ bạn sẽ tạo trong hướng dẫn này. Các trang web làm điều này vì hai lý do có thể:
Trang web có lý do chính đáng để bảo vệ dữ liệu của mình. Ví dụ: Google Maps không cho phép bạn yêu cầu quá nhiều kết quả quá nhanh. Thu thập dữ liệu từ các trang web bằng quy trình tự động được gọi là thu thập dữ liệu web. Một số trang web cấm người dùng cạo dữ liệu của họ một cách rõ ràng bằng các công cụ tự động như những công cụ bạn sẽ tạo trong hướng dẫn này. Các trang web làm điều này vì hai lý do có thể:
Trang web có lý do chính đáng để bảo vệ dữ liệu của mình. Ví dụ: Google Maps không cho phép bạn yêu cầu quá nhiều kết quả quá nhanh. Thu thập dữ liệu từ các trang web bằng quy trình tự động được gọi là thu thập dữ liệu web. Một số trang web cấm người dùng cạo dữ liệu của họ một cách rõ ràng bằng các công cụ tự động như những công cụ bạn sẽ tạo trong hướng dẫn này. Các trang web làm điều này vì hai lý do có thể:
Trang web có lý do chính đáng để bảo vệ dữ liệu của mình. Ví dụ: Google Maps không cho phép bạn yêu cầu quá nhiều kết quả quá nhanh. Thu thập dữ liệu từ các trang web bằng quy trình tự động được gọi là thu thập dữ liệu web. Một số trang web cấm người dùng cạo dữ liệu của họ một cách rõ ràng bằng các công cụ tự động như những công cụ bạn sẽ tạo trong hướng dẫn này. Các trang web làm điều này vì hai lý do có thể:
Trang web có lý do chính đáng để bảo vệ dữ liệu của mình. Ví dụ: Google Maps không cho phép bạn yêu cầu quá nhiều kết quả quá nhanh. Thu thập dữ liệu từ các trang web bằng quy trình tự động được gọi là thu thập dữ liệu web. Một số trang web cấm người dùng cạo dữ liệu của họ một cách rõ ràng bằng các công cụ tự động như những công cụ bạn sẽ tạo trong hướng dẫn này. Các trang web làm điều này vì hai lý do có thể:
Trang web có lý do chính đáng để bảo vệ dữ liệu của mình. Ví dụ: Google Maps không cho phép bạn yêu cầu quá nhiều kết quả quá nhanh. Thu thập dữ liệu từ các trang web bằng quy trình tự động được gọi là thu thập dữ liệu web. Một số trang web cấm người dùng cạo dữ liệu của họ một cách rõ ràng bằng các công cụ tự động như những công cụ bạn sẽ tạo trong hướng dẫn này. Các trang web làm điều này vì hai lý do có thể:
Trang web có lý do chính đáng để bảo vệ dữ liệu của mình. Ví dụ: Google Maps không cho phép bạn yêu cầu quá nhiều kết quả quá nhanh. Trích xuất văn bản từ HTML bằng các phương thức chuỗiThực hiện nhiều yêu cầu lặp đi lặp lại đến máy chủ của trang web có thể sử dụng hết băng thông, làm chậm trang web cho những người dùng khác và có khả năng làm quá tải máy chủ khiến trang web ngừng phản hồi hoàn toàn. Hãy trích xuất tiêu đề của trang web bạn yêu cầu trong ví dụ trước. Nếu bạn biết chỉ mục của ký tự đầu tiên của tiêu đề và ký tự đầu tiên của 2thẻ đóng , thì bạn có thể sử dụng một lát chuỗi để trích xuất tiêu đề.Vì 0trả về chỉ mục của lần xuất hiện đầu tiên của một chuỗi con, bạn có thể lấy chỉ mục của 1thẻ mở bằng cách chuyển chuỗi 5tới 0:>>>
Tuy nhiên, bạn không muốn chỉ mục của 1thẻ. Bạn muốn chỉ mục của chính tiêu đề. Để lấy chỉ mục của chữ cái đầu tiên trong tiêu đề, bạn có thể thêm độ dài của chuỗi 5vào 9:>>>
Tuy nhiên, bạn không muốn chỉ mục của 1thẻ. Bạn muốn chỉ mục của chính tiêu đề. Để lấy chỉ mục của chữ cái đầu tiên trong tiêu đề, bạn có thể thêm độ dài của chuỗi 5vào 9:>>>
Tuy nhiên, bạn không muốn chỉ mục của 1thẻ. Bạn muốn chỉ mục của chính tiêu đề. Để lấy chỉ mục của chữ cái đầu tiên trong tiêu đề, bạn có thể thêm độ dài của chuỗi 5vào 9:>>>
Tuy nhiên, bạn không muốn chỉ mục của 1thẻ. Bạn muốn chỉ mục của chính tiêu đề. Để lấy chỉ mục của chữ cái đầu tiên trong tiêu đề, bạn có thể thêm độ dài của chuỗi 5vào 9:>>> 0Tuy nhiên, bạn không muốn chỉ mục của 1thẻ. Bạn muốn chỉ mục của chính tiêu đề. Để lấy chỉ mục của chữ cái đầu tiên trong tiêu đề, bạn có thể thêm độ dài của chuỗi 5vào 9:>>> 1Tuy nhiên, bạn không muốn chỉ mục của 1thẻ. Bạn muốn chỉ mục của chính tiêu đề. Để lấy chỉ mục của chữ cái đầu tiên trong tiêu đề, bạn có thể thêm độ dài của chuỗi 5vào 9:Bây giờ lấy chỉ mục của 2thẻ đóng bằng cách chuyển chuỗi 1tới 0:Cuối cùng, bạn có thể trích xuất tiêu đề bằng cách cắt 3chuỗi:HTML trong thế giới thực có thể phức tạp hơn nhiều và khó đoán hơn nhiều so với HTML trên trang hồ sơ Aphrodite. Đây là một trang hồ sơ khác có một số HTML lộn xộn hơn mà bạn có thể loại bỏ: Hãy thử trích xuất tiêu đề từ URL mới này bằng phương pháp tương tự như ví dụ trước: Rất tiếc! Có một chút HTML trộn lẫn với tiêu đề. Tại sao vậy?HTML của 4trang trông tương tự như 5trang, nhưng có một sự khác biệt nhỏ. 1Thẻ mở có thêm một khoảng trắng trước dấu ngoặc nhọn đóng ( 7), hiển thị nó dưới dạng 8. 9trả về 0vì chuỗi con chính xác 5không tồn tại. Khi 0được thêm vào 3, nghĩa là 4, 5biến được gán giá trị 6.Ký tự tại chỉ mục 6của chuỗi 3là ký tự dòng mới ( 9) ngay trước dấu ngoặc nhọn mở ( 0) của 1thẻ. Điều này có nghĩa là 2trả về tất cả HTML bắt đầu bằng dòng mới đó và kết thúc ngay trước 2thẻ.
Những loại vấn đề này có thể xảy ra theo vô số cách không thể đoán trước. Bạn cần một cách đáng tin cậy hơn để trích xuất văn bản từ HTML. Một lớp lót trên các biểu thức chính quy >>> 2Biểu thức chính quy — hay viết tắt là regexes — là các mẫu có thể được sử dụng để tìm kiếm văn bản trong một chuỗi. Python hỗ trợ các biểu thức chính quy thông qua 4mô-đun của thư viện tiêu chuẩn .Lưu ý: Biểu thức chính quy không dành riêng cho Python. Chúng là một khái niệm lập trình chung và có thể được sử dụng với bất kỳ ngôn ngữ lập trình nào. Để làm việc với các biểu thức chính quy, điều đầu tiên bạn cần làm là nhập 4mô-đun:>>> 3Biểu thức chính quy sử dụng các ký tự đặc biệt được gọi là siêu ký tự để biểu thị các mẫu khác nhau. Ví dụ: ký tự dấu hoa thị ( 6) là viết tắt của không hoặc nhiều hơn bất kỳ thứ gì đứng ngay trước dấu hoa thị.Trong ví dụ sau, bạn sử dụng 7để tìm bất kỳ văn bản nào trong một chuỗi khớp với một biểu thức chính quy đã cho:>>> 4Đối số đầu tiên 8là biểu thức chính quy mà bạn muốn so khớp và đối số thứ hai là chuỗi để kiểm tra. Trong ví dụ trên, bạn tìm kiếm mẫu 9trong chuỗi 00.>>> 5Biểu thức chính quy 9khớp với bất kỳ phần nào của chuỗi bắt đầu bằng dấu 02, kết thúc bằng a 03và không có hoặc nhiều trường hợp ở 04giữa hai. 8trả về danh sách tất cả các kết quả phù hợp. Chuỗi 00khớp với mẫu này, vì vậy nó được trả về trong danh sách.>>> 6Thông thường, bạn sử dụng 16để tìm kiếm một mẫu cụ thể bên trong một chuỗi. Hàm này có phần phức tạp hơn 8vì nó trả về một đối tượng được gọi là a 18lưu trữ các nhóm dữ liệu khác nhau. Điều này là do có thể có các trận đấu bên trong các trận đấu khác và 16trả về mọi kết quả có thể có.Các chi tiết của 18không liên quan ở đây. Hiện tại, chỉ cần biết rằng việc gọi 21a 18sẽ trả về kết quả đầu tiên và bao gồm nhất, trong hầu hết các trường hợp, đó chỉ là kết quả bạn muốn:>>> 7Có một chức năng nữa trong 4mô-đun hữu ích cho việc phân tích văn bản. 24, viết tắt của từ thay thế , cho phép bạn thay thế văn bản trong một chuỗi khớp với một biểu thức chính quy bằng văn bản mới. Nó hoạt động giống như 25phương thức chuỗi.Các đối số được truyền tới 24là biểu thức chính quy, theo sau là văn bản thay thế, theo sau là chuỗi. Đây là một ví dụ:
>>> 8Có lẽ đó không phải là những gì bạn mong đợi sẽ xảy ra. 24sử dụng biểu thức chính quy 28để tìm và thay thế mọi thứ giữa từ đầu 0đến cuối 7, kéo dài từ đầu 31đến cuối 32. Điều này là do các biểu thức chính quy của Python rất tham lam , có nghĩa là chúng cố gắng tìm kết quả khớp dài nhất có thể khi các ký tự như 6được sử dụng.Ngoài ra, bạn có thể sử dụng mẫu đối sánh không tham lam 34, hoạt động giống như cách 6ngoại trừ việc nó khớp với chuỗi văn bản ngắn nhất có thể:>>> 9Lần này, 24tìm hai kết quả phù hợp 31và 32và thay thế chuỗi 39cho cả hai kết quả phù hợp.Trích xuất văn bản từ HTML với biểu thức chính quyĐược trang bị tất cả kiến thức này, bây giờ chúng ta hãy thử phân tích tiêu đề từ một trang tiểu sử mới , bao gồm dòng HTML được viết khá cẩu thả này: 0Các 0phương pháp sẽ có một thời gian khó khăn đối phó với những mâu thuẫn ở đây, nhưng với việc sử dụng thông minh của biểu thức thông thường, bạn có thể xử lý các mã này một cách nhanh chóng và hiệu quả: 1Hãy xem xét kỹ hơn biểu thức chính quy đầu tiên trong 41chuỗi bằng cách chia nó thành ba phần:
Biểu thức chính quy thứ hai, chuỗi 59, cũng sử dụng không tham lam 52để khớp với tất cả các thẻ HTML trong 61chuỗi. Bằng cách thay thế bất kỳ kết quả phù hợp nào bằng 62, 24xóa tất cả các thẻ và chỉ trả lại văn bản.Lưu ý: Việc tìm kiếm trên web bằng Python hoặc bất kỳ ngôn ngữ nào khác có thể rất tẻ nhạt. Không có hai trang web nào được tổ chức theo cùng một cách và HTML thường lộn xộn. Hơn nữa, các trang web thay đổi theo thời gian. Công cụ quét web hoạt động hôm nay không được đảm bảo sẽ hoạt động trong năm tới — hoặc tuần tới, vì vấn đề đó! Biểu thức chính quy là một công cụ mạnh mẽ khi được sử dụng đúng cách. Phần giới thiệu này hầu như không làm trầy xước bề mặt. Để biết thêm về các biểu thức chính quy và cách sử dụng chúng, hãy xem loạt bài gồm hai phần Biểu thức chính quy: Regexes trong Python . Kiểm tra việc hiểu của bạnMở rộng khối bên dưới để kiểm tra sự hiểu biết của bạn. Bạn có thể mở rộng khối bên dưới để xem giải pháp. Khi bạn đã sẵn sàng, bạn có thể chuyển sang phần tiếp theo. Sử dụng một trình phân tích cú pháp HTML cho Web Scraping bằng PythonMặc dù biểu thức chính quy rất tốt cho việc đối sánh mẫu nói chung, nhưng đôi khi, việc sử dụng trình phân tích cú pháp HTML được thiết kế rõ ràng để phân tích các trang HTML sẽ dễ dàng hơn. Có rất nhiều công cụ Python được viết cho mục đích này, nhưng thư viện Beautiful Soup là một công cụ tốt để bắt đầu. Cài đặt Beautiful SoupĐể cài đặt Beautiful Soup, bạn có thể chạy như sau trong thiết bị đầu cuối của mình: 2Chạy 64để xem chi tiết về gói bạn vừa cài đặt: 3Đặc biệt, hãy lưu ý rằng phiên bản mới nhất tại thời điểm viết bài là 4.9.1. Tạo một >>> url = "http://olympus.realpython.org/profiles/aphrodite" 65đối tượngNhập chương trình sau vào một cửa sổ soạn thảo mới: 4Chương trình này thực hiện ba điều:
Đối 65tượng được gán cho 71được tạo với hai đối số. Đối số đầu tiên là HTML được phân tích cú pháp và đối số thứ hai, chuỗi 74, cho đối tượng biết bộ phân tích cú pháp nào sẽ sử dụng đằng sau hậu trường. 74đại diện cho trình phân tích cú pháp HTML tích hợp của Python.Sử dụng một >>> url = "http://olympus.realpython.org/profiles/aphrodite" 65đối tượngLưu và chạy chương trình trên. Khi nó chạy xong, bạn có thể sử dụng 71biến trong cửa sổ tương tác để phân tích nội dung 3theo nhiều cách khác nhau.Ví dụ: 65các đối tượng có một 80phương thức có thể được sử dụng để trích xuất tất cả văn bản khỏi tài liệu và tự động xóa bất kỳ thẻ HTML nào.Nhập mã sau vào cửa sổ tương tác của IDLE: >>> 5Có rất nhiều dòng trống trong đầu ra này. Đây là kết quả của các ký tự dòng mới trong văn bản của tài liệu HTML. Bạn có thể xóa chúng bằng 25phương thức chuỗi nếu cần.Thông thường, bạn chỉ cần lấy văn bản cụ thể từ một tài liệu HTML. Sử dụng Beautiful Soup trước tiên để trích xuất văn bản và sau đó sử dụng 0phương thức chuỗi đôi khi dễ dàng hơn so với làm việc với các biểu thức chính quy.Tuy nhiên, đôi khi chính các thẻ HTML lại là yếu tố chỉ ra dữ liệu bạn muốn lấy. Ví dụ: có lẽ bạn muốn truy xuất URL cho tất cả các hình ảnh trên trang. Các liên kết này được chứa trong 83thuộc tính của 84các thẻ HTML.Trong trường hợp này, bạn có thể sử dụng 85để trả về danh sách tất cả các phiên bản của thẻ cụ thể đó:>>> 6Có rất nhiều dòng trống trong đầu ra này. Đây là kết quả của các ký tự dòng mới trong văn bản của tài liệu HTML. Bạn có thể xóa chúng bằng 25phương thức chuỗi nếu cần.Thông thường, bạn chỉ cần lấy văn bản cụ thể từ một tài liệu HTML. Sử dụng Beautiful Soup trước tiên để trích xuất văn bản và sau đó sử dụng 0phương thức chuỗi đôi khi dễ dàng hơn so với làm việc với các biểu thức chính quy.>>> 7Có rất nhiều dòng trống trong đầu ra này. Đây là kết quả của các ký tự dòng mới trong văn bản của tài liệu HTML. Bạn có thể xóa chúng bằng 25phương thức chuỗi nếu cần.Thông thường, bạn chỉ cần lấy văn bản cụ thể từ một tài liệu HTML. Sử dụng Beautiful Soup trước tiên để trích xuất văn bản và sau đó sử dụng 0phương thức chuỗi đôi khi dễ dàng hơn so với làm việc với các biểu thức chính quy.Tuy nhiên, đôi khi chính các thẻ HTML lại là yếu tố chỉ ra dữ liệu bạn muốn lấy. Ví dụ: có lẽ bạn muốn truy xuất URL cho tất cả các hình ảnh trên trang. Các liên kết này được chứa trong 83thuộc tính của 84các thẻ HTML.
Trong trường hợp này, bạn có thể sử dụng 85để trả về danh sách tất cả các phiên bản của thẻ cụ thể đó:>>> 8Có rất nhiều dòng trống trong đầu ra này. Đây là kết quả của các ký tự dòng mới trong văn bản của tài liệu HTML. Bạn có thể xóa chúng bằng 25phương thức chuỗi nếu cần.>>> Có rất nhiều dòng trống trong đầu ra này. Đây là kết quả của các ký tự dòng mới trong văn bản của tài liệu HTML. Bạn có thể xóa chúng bằng 25phương thức chuỗi nếu cần.Thông thường, bạn chỉ cần lấy văn bản cụ thể từ một tài liệu HTML. Sử dụng Beautiful Soup trước tiên để trích xuất văn bản và sau đó sử dụng 0phương thức chuỗi đôi khi dễ dàng hơn so với làm việc với các biểu thức chính quy. 0Tuy nhiên, đôi khi chính các thẻ HTML lại là yếu tố chỉ ra dữ liệu bạn muốn lấy. Ví dụ: có lẽ bạn muốn truy xuất URL cho tất cả các hình ảnh trên trang. Các liên kết này được chứa trong 83thuộc tính của 84các thẻ HTML.Trong trường hợp này, bạn có thể sử dụng 85để trả về danh sách tất cả các phiên bản của thẻ cụ thể đó:>>> 1Có rất nhiều dòng trống trong đầu ra này. Đây là kết quả của các ký tự dòng mới trong văn bản của tài liệu HTML. Bạn có thể xóa chúng bằng 25phương thức chuỗi nếu cần.>>> 2Có rất nhiều dòng trống trong đầu ra này. Đây là kết quả của các ký tự dòng mới trong văn bản của tài liệu HTML. Bạn có thể xóa chúng bằng 25phương thức chuỗi nếu cần.Khi thu thập dữ liệu từ các trang web bằng Python, bạn thường quan tâm đến các phần cụ thể của trang. Bằng cách dành một chút thời gian xem qua tài liệu HTML, bạn có thể xác định các thẻ có các thuộc tính duy nhất mà bạn có thể sử dụng để trích xuất dữ liệu bạn cần. Sau đó, thay vì dựa vào các cụm từ thông dụng phức tạp hoặc sử dụng 0để tìm kiếm trong tài liệu, bạn có thể truy cập trực tiếp vào thẻ cụ thể mà bạn quan tâm và trích xuất dữ liệu bạn cần.Trong một số trường hợp, bạn có thể thấy rằng Beautiful Soup không cung cấp chức năng bạn cần. Các lxml thư viện có phần phức tạp hơn để bắt đầu với nhưng Mời linh hoạt hơn rất nhiều so với Beautiful Soup cho phân tích tài liệu HTML. Bạn có thể muốn kiểm tra nó khi bạn cảm thấy thoải mái khi sử dụng Beautiful Soup. Lưu ý: Các trình phân tích cú pháp HTML như Beautiful Soup có thể giúp bạn tiết kiệm rất nhiều thời gian và công sức khi định vị dữ liệu cụ thể trong các trang web. Tuy nhiên, đôi khi HTML được viết kém và vô tổ chức đến nỗi ngay cả một trình phân tích cú pháp tinh vi như Beautiful Soup cũng không thể diễn giải các thẻ HTML một cách chính xác. Trong trường hợp này, bạn thường phải sử dụng 0các kỹ thuật sử dụng và biểu thức chính quy để cố gắng phân tích thông tin bạn cần.BeautifulSoup rất tốt để thu thập dữ liệu từ HTML của trang web, nhưng nó không cung cấp bất kỳ cách nào để làm việc với các biểu mẫu HTML. Ví dụ: nếu bạn cần tìm kiếm một trang web cho một số truy vấn và sau đó thu thập kết quả, thì BeautifulSoup một mình sẽ không giúp bạn đi xa được. Kiểm tra việc hiểu của bạnMở rộng khối bên dưới để kiểm tra sự hiểu biết của bạn. Bạn có thể mở rộng khối bên dưới để xem giải pháp: Khi bạn đã sẵn sàng, bạn có thể chuyển sang phần tiếp theo. Tương tác với các biểu mẫu HTMLCác 9mô-đun bạn đã làm việc với rất xa trong hướng dẫn này rất thích hợp cho yêu cầu nội dung của một trang web. Tuy nhiên, đôi khi bạn cần phải tương tác với một trang web để có được nội dung bạn cần. Ví dụ: bạn có thể cần gửi biểu mẫu hoặc nhấp vào nút để hiển thị nội dung ẩn.Thư viện chuẩn Python không cung cấp phương tiện tích hợp để làm việc với các trang web một cách tương tác, nhưng nhiều gói của bên thứ ba có sẵn từ PyPI. Trong số này, MechanicalSoup là một gói phổ biến và tương đối dễ sử dụng. Về bản chất, MechanicalSoup cài đặt cái được gọi là trình duyệt không đầu , là một trình duyệt web không có giao diện người dùng đồ họa. Trình duyệt này được điều khiển theo chương trình thông qua một chương trình Python. Cài đặt MechanicalSoupBạn có thể cài đặt MechanicalSoup 14trong thiết bị đầu cuối của mình: 3Bây giờ bạn có thể xem một số chi tiết về gói với 64: 4Đặc biệt, hãy lưu ý rằng phiên bản mới nhất tại thời điểm viết bài là 0.12.0. Bạn sẽ cần đóng và khởi động lại phiên IDLE của mình để MechanicalSoup tải và được nhận dạng sau khi cài đặt xong. Tạo một >>> page = urlopen(url) 16đối tượngNhập thông tin sau vào cửa sổ tương tác của IDLE: >>> 5 16các đối tượng đại diện cho trình duyệt web không đầu. Bạn có thể sử dụng chúng để yêu cầu một trang từ Internet bằng cách chuyển một URL đến 18phương thức của chúng :>>> 6 16các đối tượng đại diện cho trình duyệt web không đầu. Bạn có thể sử dụng chúng để yêu cầu một trang từ Internet bằng cách chuyển một URL đến 18phương thức của chúng :>>> 7 16các đối tượng đại diện cho trình duyệt web không đầu. Bạn có thể sử dụng chúng để yêu cầu một trang từ Internet bằng cách chuyển một URL đến 18phương thức của chúng : 19là một 20đối tượng lưu trữ phản hồi từ việc yêu cầu URL từ trình duyệt:>>> 8 16các đối tượng đại diện cho trình duyệt web không đầu. Bạn có thể sử dụng chúng để yêu cầu một trang từ Internet bằng cách chuyển một URL đến 18phương thức của chúng :>>> 9 16các đối tượng đại diện cho trình duyệt web không đầu. Bạn có thể sử dụng chúng để yêu cầu một trang từ Internet bằng cách chuyển một URL đến 18phương thức của chúng :>>> page = urlopen(url) 19là một >>> page = urlopen(url) 20đối tượng lưu trữ phản hồi từ việc yêu cầu URL từ trình duyệt:Số 21đại diện cho mã trạng thái được trả về bởi yêu cầu. Mã trạng thái 21có nghĩa là yêu cầu đã thành công. Yêu cầu không thành công có thể hiển thị mã trạng thái 23nếu URL không tồn tại hoặc 24nếu có lỗi máy chủ khi thực hiện yêu cầu.MechanicalSoup sử dụng Beautiful Soup để phân tích cú pháp HTML từ yêu cầu. 19có một 26thuộc tính đại diện cho một 65đối tượng:Trong ví dụ tiếp theo, bạn sẽ thấy cách sử dụng MechanicalSoup để điền và gửi biểu mẫu này bằng Python! Phần quan trọng của mã HTML là biểu mẫu đăng nhập — nghĩa là mọi thứ bên trong các 29thẻ. Trên 29trang này có 37thuộc tính được đặt thành 38. Biểu mẫu này chứa hai 30phần tử, một phần tử được đặt tên 40và phần tử còn lại được đặt tên 41. 30Yếu tố thứ ba là nút Gửi.Bây giờ bạn đã biết cấu trúc cơ bản của biểu mẫu đăng nhập, cũng như thông tin xác thực cần thiết để đăng nhập, chúng ta hãy xem một chương trình. điền vào biểu mẫu và gửi nó. Trong cửa sổ trình soạn thảo mới, hãy nhập chương trình sau: 0Lưu tệp và nhấn F5để chạy nó. Bạn có thể xác nhận rằng bạn đã đăng nhập thành công bằng cách nhập thông tin sau vào cửa sổ tương tác: >>> 1Hãy chia nhỏ ví dụ trên:
Trong cửa sổ tương tác, bạn xác nhận rằng quá trình gửi đã chuyển hướng thành công đến 34trang. Nếu có gì đó không ổn, thì giá trị của 58nó vẫn sẽ là như vậy 59.Lưu ý: Tin tặc có thể sử dụng các chương trình tự động như chương trình ở trên để bắt buộc đăng nhập bằng cách nhanh chóng thử nhiều tên người dùng và mật khẩu khác nhau cho đến khi chúng tìm thấy một tổ hợp hoạt động. Bên cạnh việc này là rất bất hợp pháp, hầu như tất cả các trang web ngày nay đều khóa bạn và báo cáo địa chỉ IP của bạn nếu họ thấy bạn thực hiện quá nhiều yêu cầu không thành công, vì vậy đừng thử! Bây giờ chúng ta đã có bộ 60biến, hãy xem cách lấy URL theo chương trình cho mỗi liên kết trên 34trang.Để thực hiện việc này, bạn sử dụng 62lại lần nữa, lần này truyền chuỗi 02để chọn tất cả các 64phần tử neo trên trang:>>> 2Hãy chia nhỏ ví dụ trên: >>> 3Hãy chia nhỏ ví dụ trên: Bạn tạo một 16phiên bản và sử dụng nó để yêu cầu URL 44. Bạn chỉ định nội dung HTML của trang cho 45biến bằng cách sử dụng thuộc 26tính.>>> 4Hãy chia nhỏ ví dụ trên: Bạn tạo một >>> page = urlopen(url) 16phiên bản và sử dụng nó để yêu cầu URL >>> page = urlopen(url) 44. Bạn chỉ định nội dung HTML của trang cho >>> page = urlopen(url) 45biến bằng cách sử dụng thuộc >>> page = urlopen(url) 26tính. 47trả về danh sách tất cả các 29phần tử trên trang. Vì trang chỉ có một 29phần tử, bạn có thể truy cập biểu mẫu bằng cách truy xuất phần tử tại chỉ mục 50của danh sách. Hai dòng tiếp theo chọn đầu vào tên người dùng và mật khẩu và đặt giá trị của chúng thành 51và 52, tương ứng.Bạn gửi biểu mẫu với 53. Lưu ý rằng bạn truyền hai đối số cho phương thức này, 54đối tượng và URL của đối tượng 55mà bạn truy cập qua 56.Trong cửa sổ tương tác, bạn xác nhận rằng quá trình gửi đã chuyển hướng thành công đến 34trang. Nếu có gì đó không ổn, thì giá trị của 58nó vẫn sẽ là như vậy 59.Lưu ý: Tin tặc có thể sử dụng các chương trình tự động như chương trình ở trên để bắt buộc đăng nhập bằng cách nhanh chóng thử nhiều tên người dùng và mật khẩu khác nhau cho đến khi chúng tìm thấy một tổ hợp hoạt động.Bên cạnh việc này là rất bất hợp pháp, hầu như tất cả các trang web ngày nay đều khóa bạn và báo cáo địa chỉ IP của bạn nếu họ thấy bạn thực hiện quá nhiều yêu cầu không thành công, vì vậy đừng thử! Bây giờ chúng ta đã có bộ 60biến, hãy xem cách lấy URL theo chương trình cho mỗi liên kết trên 34trang.Để thực hiện việc này, bạn sử dụng 62lại lần nữa, lần này truyền chuỗi 02để chọn tất cả các 64phần tử neo trên trang:Bây giờ bạn có thể lặp lại từng liên kết và in 97thuộc tính:Văn bản của 76thẻ có thể khác đối với bạn, nhưng đây là phần tử trang bạn cần để tìm kiếm kết quả.Lưu ý: Đối với ví dụ này, bạn có thể dễ dàng kiểm tra xem chỉ có một phần tử trên trang với 78. Mặc dù 79thuộc tính được cho là duy nhất, nhưng trên thực tế, bạn phải luôn kiểm tra xem phần tử bạn quan tâm có được xác định duy nhất hay không.Hãy bắt đầu bằng cách viết một chương trình đơn giản để mở 75trang, quét kết quả và in nó ra bảng điều khiển: 5Ví dụ này sử dụng phương thức 65của đối tượng 62để tìm phần tử với 83. Chuỗi 84mà bạn chuyển đến 62sử dụng bộ chọn CSS ID 86 để chỉ ra rằng đó 87là một 79giá trị.Để nhận được kết quả mới theo định kỳ, bạn cần tạo một vòng lặp tải trang ở mỗi bước. Vì vậy, mọi thứ bên dưới dòng 89trong đoạn mã trên cần phải đi vào phần thân của vòng lặp.Đối với ví dụ này, chúng ta hãy lấy bốn lần cuộn xúc xắc trong khoảng thời gian mười giây. Để làm điều đó, dòng cuối cùng của mã của bạn cần yêu cầu Python tạm dừng chạy trong mười giây. Bạn có thể làm điều này với 90từ 91mô-đun của Python . 90nhận một đối số duy nhất đại diện cho lượng thời gian để ngủ tính bằng giây.Dưới đây là một ví dụ minh họa cách thức 90hoạt động: 6Khi bạn chạy mã này, bạn sẽ thấy rằng 94thông báo không được hiển thị cho đến khi 95vài giây trôi qua kể từ khi 96chức năng đầu tiên được thực thi.Đối với ví dụ về cuộn chết, bạn sẽ cần chuyển số 97cho 90. Đây là chương trình được cập nhật: 7Khi bạn chạy chương trình, ngay lập tức bạn sẽ thấy kết quả đầu tiên được in ra bảng điều khiển. Sau 10 giây, kết quả thứ hai được hiển thị, sau đó là kết quả thứ ba và cuối cùng là kết quả thứ tư. Điều gì xảy ra sau khi kết quả thứ tư được in ra? Chương trình tiếp tục chạy thêm mười giây nữa trước khi dừng lại! Tất nhiên là có rồi - đó là những gì bạn đã bảo nó làm! Nhưng nó hơi lãng phí thời gian. Bạn có thể ngăn nó làm điều này bằng cách sử dụng một 99câu lệnh chỉ chạy 00cho ba yêu cầu đầu tiên: 8Với các kỹ thuật như thế này, bạn có thể lấy dữ liệu từ các trang web cập nhật dữ liệu của họ theo định kỳ. Tuy nhiên, bạn nên biết rằng việc yêu cầu một trang nhiều lần liên tiếp có thể được coi là việc sử dụng một trang web đáng ngờ, hoặc thậm chí độc hại. Quan trọng: Hầu hết các trang web đều xuất bản tài liệu Điều khoản Sử dụng. Bạn thường có thể tìm thấy một liên kết đến nó trong phần chân trang của trang web. Luôn đọc tài liệu này trước khi cố gắng lấy dữ liệu từ một trang web. Nếu bạn không thể tìm thấy Điều khoản sử dụng, hãy cố gắng liên hệ với chủ sở hữu trang web và hỏi họ xem họ có bất kỳ chính sách nào liên quan đến lượng yêu cầu hay không. Việc không tuân thủ Điều khoản sử dụng có thể dẫn đến việc IP của bạn bị chặn, vì vậy hãy cẩn thận và tôn trọng! Thậm chí có thể xảy ra sự cố máy chủ với số lượng yêu cầu quá nhiều, vì vậy bạn có thể tưởng tượng rằng nhiều trang web lo ngại về khối lượng yêu cầu đến máy chủ của họ! Luôn kiểm tra Điều khoản sử dụng và tôn trọng khi gửi nhiều yêu cầu đến một trang web. Phần kết luậnMặc dù có thể phân tích cú pháp dữ liệu từ Web bằng các công cụ trong thư viện chuẩn của Python, nhưng có nhiều công cụ trên PyPI có thể giúp đơn giản hóa quy trình. Trong hướng dẫn này, bạn đã học cách:
Viết các chương trình duyệt web tự động rất thú vị và Internet không thiếu nội dung có thể dẫn đến tất cả các loại dự án thú vị. Chỉ cần nhớ, không phải ai cũng muốn bạn lấy dữ liệu từ máy chủ web của họ. Luôn kiểm tra Điều khoản sử dụng của trang web trước khi bạn bắt đầu tìm kiếm và tôn trọng cách bạn sắp xếp thời gian cho các yêu cầu web của mình để không làm ngập máy chủ với lưu lượng truy cập. Tài nguyên bổ sungĐể biết thêm thông tin về cách tìm kiếm web bằng Python, hãy xem các tài nguyên sau:
|