Quét web là quá trình thu thập và phân tích dữ liệu thô từ Web và cộng đồng Python đã đưa ra một số công cụ quét web khá mạnh mẽ
Internet có lẽ là nguồn thông tin lớn nhất trên hành tinh. Nhiều ngành, chẳng hạn như khoa học dữ liệu, kinh doanh thông minh và báo cáo điều tra, có thể hưởng lợi rất nhiều từ việc thu thập và phân tích dữ liệu từ các trang web
Trong hướng dẫn này, bạn sẽ học cách
- Phân tích 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 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
Ghi chú. Hướng dẫn này được chuyển thể từ chương “Tương tác với Web” trong Python Basics. 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, thỉnh thoảng bạn sẽ thấy các tham chiếu đế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ã ví dụ từ trình chỉnh sửa và môi trường bạn chọn
Mã nguồn. Nhấp vào đây để tải xuống mã nguồn miễn phí mà bạn sẽ sử dụng để thu thập và phân tích dữ liệu từ Web
Cạo và phân tích văn bản từ các trang web
Thu thập dữ liệu từ các trang web bằng quy trình tự động được gọi là quét web. Một số trang web nghiêm cấm người dùng lấy dữ liệu của họ bằng các công cụ tự động như những công cụ mà bạn sẽ tạo trong hướng dẫn này. 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. Chẳng hạn, Google Maps không cho phép bạn yêu cầu quá nhiều kết quả quá nhanh
- Thực hiện nhiều yêu cầu lặp lại đối với máy chủ của trang web có thể sử dụng hết băng thông, làm chậm trang web đối với 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
Trước khi sử dụng các kỹ năng Python của bạn để quét web, bạn phải luôn kiểm tra chính sách sử dụng được chấp nhận của trang web mục tiêu của mình để xem việc truy cập trang web bằng các công cụ tự động có vi phạm điều khoản sử dụng của trang web hay không. Về mặt pháp lý, việc tìm kiếm trang web trái với mong muốn của một trang web là một khu vực màu xám
Quan trọng. Xin lưu ý rằng các kỹ thuật sau đây khi được sử dụng trên các trang web cấm quét web
Đối với hướng dẫn này, bạn sẽ sử dụng một trang được lưu trữ trên máy chủ của Real Python. Trang mà bạn sẽ truy cập đã được thiết lập để sử dụng với hướng dẫn này
Bây giờ bạn đã đọc tuyên bố từ chối trách nhiệm, bạn có thể xem nội dung thú vị. Trong phần tiếp theo, bạn sẽ bắt đầu lấy tất cả mã HTML từ một trang web
Loại bỏ các quảng cáoXây dựng công cụ quét web đầu tiên của bạn
Một gói hữu ích để quét web mà bạn có thể tìm thấy trong thư viện chuẩn của Python là
>>> title_index = html.find[""]
>>> title_index
14
6, chứa các công cụ để làm việc với URL. Đặc biệt, mô-đun >>> title_index = html.find[""]
>>> title_index
14
7 chứa một chức năng có tên là >>> title_index = html.find[""]
>>> title_index
14
8 mà bạn có thể sử dụng để mở một URL trong chương trìnhTrong cửa sổ tương tác của IDLE, hãy nhập nội dung sau để nhập
>>> title_index = html.find[""]
>>> title_index
14
8>>>
>>> from urllib.request import urlopen
Trang web mà bạn sẽ mở nằm ở URL sau
>>>
>>> url = "//olympus.realpython.org/profiles/aphrodite"
Để mở trang web, hãy chuyển
>>> start_index = title_index + len[""]
>>> start_index
21
0 đến >>> title_index = html.find[""]
>>> title_index
14
8>>>
>>> page = urlopen[url]
>>> title_index = html.find[""]
>>> title_index
14
8 trả về một đối tượng >>> start_index = title_index + len[""]
>>> start_index
21
3>>>
>>> page
Để trích xuất HTML từ trang, trước tiên hãy sử dụng phương thức
>>> start_index = title_index + len[""]
>>> start_index
21
5 của đối tượng >>> start_index = title_index + len[""]
>>> start_index
21
3, phương thức này trả về một chuỗi byte. Sau đó, sử dụng >>> start_index = title_index + len[""]
>>> start_index
21
6 để giải mã các byte thành một chuỗi bằng cách sử dụng>>>
>>> html_bytes = page.read[]
>>> html = html_bytes.decode["utf-8"]
Bây giờ bạn có thể in HTML để xem nội dung của trang web
>>>
>>> print[html]
Profile: Aphrodite
Name: Aphrodite
Favorite animal: Dove
Favorite color: Red
Hometown: Mount Olympus
Đầu ra mà bạn đang thấy là mã HTML của trang web mà trình duyệt của bạn hiển thị khi bạn truy cập
>>> start_index = title_index + len[""]
>>> start_index
21
7Với
>>> title_index = html.find[""]
>>> title_index
14
6, bạn đã truy cập trang web tương tự như cách bạn làm trong trình duyệt của mình. Tuy nhiên, thay vì hiển thị nội dung một cách trực quan, bạn đã lấy mã nguồn dưới dạng văn bản. Bây giờ bạn đã có HTML dưới dạng văn bản, bạn có thể trích xuất thông tin từ nó theo một số cách khác nhauTrích xuất văn bản từ HTML bằng các phương thức chuỗi
Một cách để trích xuất thông tin từ HTML của trang web là sử dụng. Chẳng hạn, bạn có thể sử dụng
>>> start_index = title_index + len[""]
>>> start_index
21
9 để tìm kiếm trong văn bản HTML cho các thẻ >>> end_index = html.find[""]
>>> end_index
39
0 và trích xuất tiêu đề của trang webĐể bắt đầu, bạn sẽ trích xuất tiêu đề của trang web mà 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à chỉ mục của ký tự đầu tiên của thẻ đóng
>>> end_index = html.find[""]
>>> end_index
39
1, thì bạn có thể sử dụng a để trích xuất tiêu đềBởi vì
>>> start_index = title_index + len[""]
>>> start_index
21
9 trả về chỉ số của lần xuất hiện đầu tiên của một chuỗi con, nên bạn có thể lấy chỉ mục của thẻ mở đầu >>> end_index = html.find[""]
>>> end_index
39
0 bằng cách chuyển chuỗi >>> end_index = html.find[""]
>>> end_index
39
4 đến >>> start_index = title_index + len[""]
>>> start_index
21
9>>>
>>> title_index = html.find[""]
>>> title_index
14
Tuy nhiên, bạn không muốn chỉ mục của thẻ
>>> end_index = html.find[""]
>>> end_index
39
0. 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 >>> end_index = html.find[""]
>>> end_index
39
4 vào >>> end_index = html.find[""]
>>> end_index
39
8>>>
>>> start_index = title_index + len[""]
>>> start_index
21
Bây giờ hãy lấy chỉ mục của thẻ đóng
>>> end_index = html.find[""]
>>> end_index
39
1 bằng cách chuyển chuỗi >>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
0 đến >>> start_index = title_index + len[""]
>>> start_index
21
9>>>
>>> end_index = html.find[""]
>>> end_index
39
Cuối cùng, bạn có thể trích xuất tiêu đề bằng cách cắt chuỗi
>>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
2>>>
>>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
HTML trong thế giới thực có thể phức tạp hơn nhiều và khó dự đ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 với một số HTML lộn xộn hơn mà bạn có thể cạo
>>>
>>> url = "//olympus.realpython.org/profiles/aphrodite"
0Hãy thử trích xuất tiêu đề từ URL mới này bằng phương pháp tương tự như trong ví dụ trước
>>>
>>> url = "//olympus.realpython.org/profiles/aphrodite"
1Rất tiếc. Có một chút HTML trộn lẫn với tiêu đề. Tại sao vậy?
HTML cho trang
>>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
3 trông tương tự như trang >>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
4, nhưng có một sự khác biệt nhỏ. Thẻ mở >>> end_index = html.find[""]
>>> end_index
39
0 có thêm một khoảng trắng trước dấu ngoặc nhọn đóng [>>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
6], hiển thị nó thành >>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
7>>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
8 trả về >>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
9 vì chuỗi con chính xác >>> end_index = html.find[""]
>>> end_index
39
4 không tồn tại. Khi >>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
9 được thêm vào >>> url = "//olympus.realpython.org/profiles/aphrodite"
02, tức là >>> url = "//olympus.realpython.org/profiles/aphrodite"
03, biến >>> url = "//olympus.realpython.org/profiles/aphrodite"
04 được gán giá trị >>> url = "//olympus.realpython.org/profiles/aphrodite"
05Ký tự tại chỉ mục
>>> url = "//olympus.realpython.org/profiles/aphrodite"
05 của chuỗi >>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
2 là ký tự xuống dòng [>>> url = "//olympus.realpython.org/profiles/aphrodite"
08] ngay trước dấu ngoặc nhọn mở [>>> url = "//olympus.realpython.org/profiles/aphrodite"
09] của thẻ >>> url = "//olympus.realpython.org/profiles/aphrodite"
10. Điều này có nghĩa là >>> url = "//olympus.realpython.org/profiles/aphrodite"
11 trả về tất cả HTML bắt đầu bằng dòng mới đó và kết thúc ngay trước thẻ >>> end_index = html.find[""]
>>> end_index
39
1Nhữ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
Loại bỏ các quảng cáoLàm quen với biểu thức chính quy
Cụm từ thông dụng—hay gọi tắt là biểu thức chính quy—là các mẫu mà bạn có thể 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 mô-đun
>>> url = "//olympus.realpython.org/profiles/aphrodite"
13 của thư viện chuẩnGhi chú. 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 hỗ trợ trong nhiều ngôn ngữ lập trình
Để 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 mô-đun
>>> url = "//olympus.realpython.org/profiles/aphrodite"
13>>>
>>> url = "//olympus.realpython.org/profiles/aphrodite"
2Biể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. Chẳng hạn, ký tự dấu hoa thị [_______5_______15] là viết tắt của 0 hoặc nhiều trường hợp của bất kỳ thứ gì xuất hiện ngay trước dấu hoa thị
Trong ví dụ sau, bạn sử dụng
>>> url = "//olympus.realpython.org/profiles/aphrodite"
16 để 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>>>
>>> url = "//olympus.realpython.org/profiles/aphrodite"
3Đối số đầu tiên của
>>> url = "//olympus.realpython.org/profiles/aphrodite"
17 là biểu thức chính quy mà bạn muốn đối sánh và đối số thứ hai là chuỗi để kiểm tra. Trong ví dụ trên, bạn tìm kiếm mẫu >>> url = "//olympus.realpython.org/profiles/aphrodite"
18 trong chuỗi >>> url = "//olympus.realpython.org/profiles/aphrodite"
19Biểu thức chính quy
>>> url = "//olympus.realpython.org/profiles/aphrodite"
18 khớp với bất kỳ phần nào của chuỗi bắt đầu bằng >>> url = "//olympus.realpython.org/profiles/aphrodite"
21, kết thúc bằng >>> url = "//olympus.realpython.org/profiles/aphrodite"
22 và không có hoặc nhiều phiên bản >>> url = "//olympus.realpython.org/profiles/aphrodite"
23 giữa hai. >>> url = "//olympus.realpython.org/profiles/aphrodite"
17 trả về một danh sách tất cả các trận đấu. Chuỗi >>> url = "//olympus.realpython.org/profiles/aphrodite"
19 khớp với mẫu này, vì vậy nó được trả về trong danh sáchĐây là cùng một mẫu được áp dụng cho các chuỗi khác nhau
>>>
>>> url = "//olympus.realpython.org/profiles/aphrodite"
4Lưu ý rằng nếu không tìm thấy kết quả khớp, thì
>>> url = "//olympus.realpython.org/profiles/aphrodite"
16 trả về một danh sách trốngKhớp mẫu có phân biệt chữ hoa chữ thường. Nếu bạn muốn khớp mẫu này bất kể trường hợp nào, thì bạn có thể chuyển đối số thứ ba có giá trị
>>> url = "//olympus.realpython.org/profiles/aphrodite"
27>>>
>>> url = "//olympus.realpython.org/profiles/aphrodite"
5Bạn có thể sử dụng dấu chấm [
>>> url = "//olympus.realpython.org/profiles/aphrodite"
28] để thay thế cho bất kỳ ký tự đơn lẻ nào trong biểu thức chính quy. Chẳng hạn, bạn có thể tìm thấy tất cả các chuỗi chứa các chữ cái >>> url = "//olympus.realpython.org/profiles/aphrodite"
21 và >>> url = "//olympus.realpython.org/profiles/aphrodite"
22 được phân tách bằng một ký tự như sau>>>
>>> url = "//olympus.realpython.org/profiles/aphrodite"
6Mẫu
>>> url = "//olympus.realpython.org/profiles/aphrodite"
31 bên trong một biểu thức chính quy là viết tắt của bất kỳ ký tự nào được lặp lại nhiều lần. Chẳng hạn, bạn có thể sử dụng >>> url = "//olympus.realpython.org/profiles/aphrodite"
32 để tìm mọi chuỗi con bắt đầu bằng >>> url = "//olympus.realpython.org/profiles/aphrodite"
21 và kết thúc bằng >>> url = "//olympus.realpython.org/profiles/aphrodite"
22, bất kể chữ cái nào—hoặc các chữ cái—nằm ở giữa>>>
>>> url = "//olympus.realpython.org/profiles/aphrodite"
7Thông thường, bạn sử dụng
>>> url = "//olympus.realpython.org/profiles/aphrodite"
35 để tìm kiếm một mẫu cụ thể bên trong một chuỗi. Hàm này hơi phức tạp hơn >>> url = "//olympus.realpython.org/profiles/aphrodite"
17 vì nó trả về một đối tượng có tên là >>> url = "//olympus.realpython.org/profiles/aphrodite"
37 lưu trữ các nhóm dữ liệu khác nhau. Điều này là do có thể có các kết quả khớp bên trong các kết quả khớp khác và >>> url = "//olympus.realpython.org/profiles/aphrodite"
35 trả về mọi kết quả có thểCác chi tiết của
>>> url = "//olympus.realpython.org/profiles/aphrodite"
37 không liên quan ở đây. Hiện tại, chỉ cần biết rằng việc gọi >>> url = "//olympus.realpython.org/profiles/aphrodite"
40 trên >>> url = "//olympus.realpython.org/profiles/aphrodite"
37 sẽ trả về kết quả đầu tiên và bao quát nhất, trong hầu hết các trường hợp, đó chính là kết quả bạn muốn>>>
>>> url = "//olympus.realpython.org/profiles/aphrodite"
8Có thêm một chức năng trong mô-đun
>>> url = "//olympus.realpython.org/profiles/aphrodite"
13 hữu ích để phân tích văn bản. , 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 biểu thức chính quy bằng văn bản mới. Nó hoạt động giống như phương thức chuỗi >>> url = "//olympus.realpython.org/profiles/aphrodite"
44Các đối số được chuyển đến
>>> url = "//olympus.realpython.org/profiles/aphrodite"
43 là 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ụ>>>
>>> url = "//olympus.realpython.org/profiles/aphrodite"
9Có lẽ đó không phải là những gì bạn mong đợi sẽ xảy ra
>>> url = "//olympus.realpython.org/profiles/aphrodite"
43 sử dụng biểu thức chính quy >>> url = "//olympus.realpython.org/profiles/aphrodite"
47 để tìm và thay thế mọi thứ giữa >>> url = "//olympus.realpython.org/profiles/aphrodite"
09 đầu tiên và >>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
6 cuối cùng, kéo dài từ đầu ________5__50 đến cuối >>> url = "//olympus.realpython.org/profiles/aphrodite"
51. Điều này là do các biểu thức chính quy của Python rất tham lam, nghĩa là chúng cố gắng tìm từ khớp dài nhất có thể khi các ký tự như >>> url = "//olympus.realpython.org/profiles/aphrodite"
15 được sử dụngNgoài ra, bạn có thể sử dụng mẫu so khớp không tham lam
>>> url = "//olympus.realpython.org/profiles/aphrodite"
53, kiểu này hoạt động tương tự như >>> url = "//olympus.realpython.org/profiles/aphrodite"
15 ngoại trừ việc nó khớp với chuỗi văn bản ngắn nhất có thể>>>
>>> page = urlopen[url]
0Lần này,
>>> url = "//olympus.realpython.org/profiles/aphrodite"
43 tìm thấy hai kết quả trùng khớp, >>> url = "//olympus.realpython.org/profiles/aphrodite"
50 và >>> url = "//olympus.realpython.org/profiles/aphrodite"
51, đồng thời thay thế chuỗi >>> url = "//olympus.realpython.org/profiles/aphrodite"
58 cho cả hai kết quả trùng khớpLoại bỏ các quảng cáoTrích xuất văn bản từ HTML bằng biểu thức chính quy
Được trang bị tất cả những kiến thức này, bây giờ hãy thử phân tích tiêu đề từ một trang hồ sơ khác, bao gồm dòng HTML được viết khá cẩu thả này
>>> page = urlopen[url]
1Phương thức
>>> start_index = title_index + len[""]
>>> start_index
21
9 sẽ gặp khó khăn khi xử lý sự không nhất quán ở đây, nhưng với việc sử dụng thông minh các biểu thức chính quy, bạn có thể xử lý mã này một cách nhanh chóng và hiệu quả>>> page = urlopen[url]
2Hãy xem xét kỹ hơn biểu thức chính quy đầu tiên trong chuỗi
>>> url = "//olympus.realpython.org/profiles/aphrodite"
60 bằng cách chia nó thành ba phần
61 khớp với thẻ mở đầu>>> url = "//olympus.realpython.org/profiles/aphrodite"
62 trong>>> url = "//olympus.realpython.org/profiles/aphrodite"
2. Phần>>> title = html[start_index:end_index] >>> title 'Profile: Aphrodite'
64 của mẫu khớp với>>> url = "//olympus.realpython.org/profiles/aphrodite"
65 vì>>> url = "//olympus.realpython.org/profiles/aphrodite"
35 được gọi với>>> url = "//olympus.realpython.org/profiles/aphrodite"
27 và>>> url = "//olympus.realpython.org/profiles/aphrodite"
68 khớp với bất kỳ văn bản nào sau>>> url = "//olympus.realpython.org/profiles/aphrodite"
65 cho đến phiên bản đầu tiên của>>> url = "//olympus.realpython.org/profiles/aphrodite"
6>>> title = html[start_index:end_index] >>> title 'Profile: Aphrodite'
71 đối sánh không tham lam tất cả văn bản sau phần mở đầu>>> url = "//olympus.realpython.org/profiles/aphrodite"
62, dừng ở đối sánh đầu tiên cho>>> url = "//olympus.realpython.org/profiles/aphrodite"
73>>> url = "//olympus.realpython.org/profiles/aphrodite"
73 khác với mẫu đầu tiên chỉ ở việc sử dụng ký tự>>> url = "//olympus.realpython.org/profiles/aphrodite"
75, vì vậy nó khớp với thẻ đóng>>> url = "//olympus.realpython.org/profiles/aphrodite"
76 trong>>> url = "//olympus.realpython.org/profiles/aphrodite"
2>>> title = html[start_index:end_index] >>> title 'Profile: Aphrodite'
Biểu thức chính quy thứ hai, chuỗi
>>> url = "//olympus.realpython.org/profiles/aphrodite"
78, cũng sử dụng giá trị không tham lam >>> url = "//olympus.realpython.org/profiles/aphrodite"
71 để khớp với tất cả các thẻ HTML trong chuỗi >>> url = "//olympus.realpython.org/profiles/aphrodite"
80. Bằng cách thay thế bất kỳ kết quả phù hợp nào bằng >>> url = "//olympus.realpython.org/profiles/aphrodite"
81, >>> url = "//olympus.realpython.org/profiles/aphrodite"
43 sẽ xóa tất cả các thẻ và chỉ trả về văn bảnGhi chú. Quét 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 ngày hôm nay không được bảo đảm sẽ hoạt động vào 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. Trong phần giới thiệu này, bạn hầu như không làm trầy xước bề mặt. Để biết thêm về 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. Regex trong Python
Kiểm tra việc hiểu của bạn
Mở rộng khối bên dưới để kiểm tra sự hiểu biết của bạn
Tập thể dục. Cạo dữ liệu từ một trang webHiển thị/Ẩn
Viết chương trình lấy toàn bộ HTML từ URL sau
>>>
>>> page = urlopen[url]
3Sau đó sử dụng
>>> start_index = title_index + len[""]
>>> start_index
21
9 để hiển thị văn bản sau Tên. và Màu yêu thích. [không bao gồm bất kỳ dấu cách nào ở đầu hoặc thẻ HTML ở cuối có thể xuất hiện trên cùng một dòng]Bạn có thể mở rộng khối bên dưới để xem giải pháp
Giải pháp. Cạo dữ liệu từ một trang webHiển thị/Ẩn
Đầu tiên, nhập hàm
>>> url = "//olympus.realpython.org/profiles/aphrodite"
84 từ mô-đun >>> url = "//olympus.realpython.org/profiles/aphrodite"
85>>> page = urlopen[url]
4Sau đó mở URL và sử dụng phương thức
>>> start_index = title_index + len[""]
>>> start_index
21
5 của đối tượng >>> start_index = title_index + len[""]
>>> start_index
21
3 được trả về bởi >>> title_index = html.find[""]
>>> title_index
14
8 để đọc HTML của trang>>> page = urlopen[url]
5Phương thức
>>> start_index = title_index + len[""]
>>> start_index
21
5 trả về một chuỗi byte, vì vậy bạn sử dụng >>> start_index = title_index + len[""]
>>> start_index
21
6 để giải mã các byte bằng mã hóa UTF-8Bây giờ bạn đã có nguồn HTML của trang web dưới dạng một chuỗi được gán cho biến
>>> url = "//olympus.realpython.org/profiles/aphrodite"
91, bạn có thể trích xuất tên và màu sắc yêu thích của Dionysus từ hồ sơ của anh ấy. Cấu trúc HTML cho hồ sơ của Dionysus giống như hồ sơ của Aphrodite mà bạn đã xem trước đóBạn có thể lấy tên bằng cách tìm chuỗi
>>> url = "//olympus.realpython.org/profiles/aphrodite"
92 trong văn bản và trích xuất mọi thứ xuất hiện sau lần xuất hiện đầu tiên của chuỗi và trước thẻ HTML tiếp theo. Tức là bạn cần trích xuất mọi thứ sau dấu hai chấm [>>> url = "//olympus.realpython.org/profiles/aphrodite"
93] và trước dấu ngoặc nhọn đầu tiên [>>> url = "//olympus.realpython.org/profiles/aphrodite"
09]. Bạn có thể sử dụng kỹ thuật tương tự để trích xuất màu yêu thíchVòng lặp
>>> url = "//olympus.realpython.org/profiles/aphrodite"
95 sau trích xuất văn bản này cho cả tên và màu sắc yêu thích>>> page = urlopen[url]
6Có vẻ như có rất nhiều thứ đang diễn ra trong vòng lặp
>>> url = "//olympus.realpython.org/profiles/aphrodite"
95 này, nhưng chỉ cần một chút tính toán số học để tính toán các chỉ số phù hợp để trích xuất văn bản mong muốn. Đi trước và phá vỡ nóBạn sử dụng
97 để tìm chỉ mục bắt đầu của chuỗi, hoặc là>>> url = "//olympus.realpython.org/profiles/aphrodite"
92 hoặc>>> url = "//olympus.realpython.org/profiles/aphrodite"
99, sau đó gán chỉ mục cho>>> url = "//olympus.realpython.org/profiles/aphrodite"
00>>> page = urlopen[url]
Vì văn bản cần trích xuất bắt đầu ngay sau dấu hai chấm trong
92 hoặc>>> url = "//olympus.realpython.org/profiles/aphrodite"
99, nên bạn lấy chỉ mục của ký tự ngay sau dấu hai chấm bằng cách thêm độ dài của chuỗi vào>>> url = "//olympus.realpython.org/profiles/aphrodite"
03, sau đó gán kết quả cho>>> page = urlopen[url]
04>>> page = urlopen[url]
Bạn tính toán chỉ số kết thúc của văn bản cần trích xuất bằng cách xác định chỉ số của dấu ngoặc nhọn đầu tiên [
09] so với>>> url = "//olympus.realpython.org/profiles/aphrodite"
04 và gán giá trị này cho>>> page = urlopen[url]
07. Sau đó, bạn thêm giá trị đó vào>>> page = urlopen[url]
04 và gán kết quả cho>>> page = urlopen[url]
09>>> page = urlopen[url]
Bạn trích xuất văn bản bằng cách cắt
91 từ>>> url = "//olympus.realpython.org/profiles/aphrodite"
04 thành>>> page = urlopen[url]
09 và gán chuỗi này cho>>> page = urlopen[url]
13>>> page = urlopen[url]
Bạn xóa mọi khoảng trắng ở đầu và cuối của
13 bằng cách sử dụng>>> page = urlopen[url]
15 và gán kết quả cho>>> page = urlopen[url]
16>>> page = urlopen[url]
Ở cuối vòng lặp, bạn sử dụng
>>> page = urlopen[url]
17 để hiển thị văn bản được trích xuất. Đầu ra cuối cùng trông như thế này>>> page = urlopen[url]
7Giải pháp này là một trong nhiều giải pháp giải quyết vấn đề này, vì vậy nếu bạn nhận được kết quả tương tự với một giải pháp khác, thì bạn đã làm rất tốt
Khi bạn đã sẵn sàng, bạn có thể chuyển sang phần tiếp theo
Sử dụng Trình phân tích cú pháp HTML để quét web bằng Python
Mặc dù các biểu thức chính quy rất phù hợp để khớp 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ó 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 Súp Đẹp
Để cài đặt Beautiful Soup, bạn có thể chạy lệnh sau trong thiết bị đầu cuối của mình
>>> page = urlopen[url]
8Với lệnh này, bạn đang cài đặt phiên bản Beautiful Soup mới nhất vào môi trường Python toàn cầu của mình
Loại bỏ các quảng cáoTạo một đối tượng >>> page = urlopen[url]
18
>>> page = urlopen[url]
Nhập chương trình sau vào cửa sổ soạn thảo mới
>>> page = urlopen[url]
9Chương trình này thực hiện ba điều
Mở URL
19 bằng cách sử dụng>>> page = urlopen[url]
8 từ mô-đun>>> title_index = html.find[""] >>> title_index 14
7>>> title_index = html.find[""] >>> title_index 14
Đọc HTML từ trang dưới dạng chuỗi và gán nó cho biến
2>>> title = html[start_index:end_index] >>> title 'Profile: Aphrodite'
Tạo một đối tượng
18 và gán nó cho biến>>> page = urlopen[url]
24>>> page = urlopen[url]
Đối tượng
>>> page = urlopen[url]
18 được gán cho >>> page = urlopen[url]
24 được tạo với hai đối số. Đối số đầu tiên là HTML sẽ được phân tích cú pháp và đối số thứ hai, chuỗi >>> page = urlopen[url]
27, cho đối tượng biết trình phân tích cú pháp nào sẽ sử dụng ở hậu trường. >>> page = urlopen[url]
27 đại diện cho trình phân tích cú pháp HTML tích hợp của PythonSử dụng một đối tượng >>> page = urlopen[url]
18
>>> page = urlopen[url]
Lưu và chạy chương trình trên. Khi nó chạy xong, bạn có thể sử dụng biến
>>> page = urlopen[url]
24 trong cửa sổ tương tác để phân tích nội dung của >>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
2 theo nhiều cách khác nhauGhi chú. Nếu bạn không sử dụng IDLE, thì bạn có thể chạy chương trình của mình với cờ
>>> page = urlopen[url]
32 để vào chế độ tương tác. Thứ gì đó như >>> page = urlopen[url]
33 trước tiên sẽ chạy chương trình của bạn và sau đó đưa bạn vào một REPL nơi bạn có thể khám phá các đối tượng của mìnhVí dụ: các đối tượng
>>> page = urlopen[url]
18 có phương thức >>> page = urlopen[url]
35 mà bạn có thể 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 mọi thẻ HTMLNhập mã sau vào cửa sổ tương tác của IDLE hoặc ở cuối mã trong trình chỉnh sửa của bạn
>>>
>>> page
0Có rất nhiều dòng trống trong đầu ra này. Đây là kết quả của các ký tự xuống dòng trong văn bản của tài liệu HTML. Bạn có thể loại bỏ chúng bằng phương pháp chuỗi
>>> url = "//olympus.realpython.org/profiles/aphrodite"
44 nếu bạn cầnThông thường, bạn chỉ cần lấy văn bản cụ thể từ tài liệu HTML. Trước tiên, sử dụng Beautiful Soup để trích xuất văn bản và sau đó sử dụng phương pháp chuỗi
>>> start_index = title_index + len[""]
>>> start_index
21
9 đôi khi dễ dàng hơn so với làm việc với các biểu thức thông thườngTuy nhiên, những lần khác, chính các thẻ HTML là các yếu tố chỉ ra dữ liệu bạn muốn truy xuất. Chẳng hạn, 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 thuộc tính
>>> page = urlopen[url]
38 của thẻ HTML >>> page = urlopen[url]
39Trong trường hợp này, bạn có thể sử dụng
>>> page = urlopen[url]
40 để trả về danh sách tất cả các phiên bản của thẻ cụ thể đó>>>
>>> page
1Điều này trả về một danh sách tất cả các thẻ
>>> page = urlopen[url]
39 trong tài liệu HTML. Các đối tượng trong danh sách trông giống như chúng có thể là các chuỗi đại diện cho các thẻ, nhưng chúng thực sự là các thể hiện của đối tượng >>> page = urlopen[url]
42 do Beautiful Soup cung cấp. >>> page = urlopen[url]
42 đối tượng cung cấp một giao diện đơn giản để làm việc với thông tin mà chúng chứaBạn có thể khám phá điều này một chút bằng cách lần đầu tiên giải nén các đối tượng
>>> page = urlopen[url]
42 từ danh sách>>>
>>> page
2Mỗi đối tượng
>>> page = urlopen[url]
42 có một thuộc tính >>> page = urlopen[url]
46 trả về một chuỗi chứa loại thẻ HTML>>>
>>> page
3Bạn có thể truy cập các thuộc tính HTML của đối tượng
>>> page = urlopen[url]
42 bằng cách đặt tên của chúng giữa các dấu ngoặc vuông, giống như thể các thuộc tính là khóa trong từ điểnVí dụ: thẻ
>>> page = urlopen[url]
48 có một thuộc tính duy nhất, >>> page = urlopen[url]
38, với giá trị >>> page = urlopen[url]
50. Tương tự như vậy, một thẻ HTML chẳng hạn như liên kết >>> page = urlopen[url]
51 có hai thuộc tính, >>> page = urlopen[url]
52 và >>> page = urlopen[url]
53Để lấy nguồn của các hình ảnh trong trang hồ sơ Dionysus, bạn truy cập thuộc tính
>>> page = urlopen[url]
38 bằng cách sử dụng ký hiệu từ điển đã đề cập ở trên>>>
>>> page
4Một số thẻ trong tài liệu HTML có thể được truy cập bởi các thuộc tính của đối tượng
>>> page = urlopen[url]
42. Ví dụ: để lấy thẻ >>> end_index = html.find[""]
>>> end_index
39
0 trong tài liệu, bạn có thể sử dụng thuộc tính >>> page = urlopen[url]
57>>>
>>> page
5Nếu bạn xem nguồn của hồ sơ Dionysus bằng cách điều hướng đến trang hồ sơ, nhấp chuột phải vào trang và chọn Xem nguồn trang, thì bạn sẽ nhận thấy rằng thẻ
>>> end_index = html.find[""]
>>> end_index
39
0 được viết hoa toàn bộ và có khoảng trắngBeautiful Soup tự động dọn sạch các thẻ cho bạn bằng cách loại bỏ khoảng trống thừa trong thẻ mở và dấu gạch chéo lên phía trước không liên quan [_______5_______75] trong thẻ đóng
Bạn cũng có thể chỉ truy xuất chuỗi giữa các thẻ tiêu đề với thuộc tính
>>> page = urlopen[url]
60 của đối tượng >>> page = urlopen[url]
42>>>
>>> page
6Một trong những tính năng của Beautiful Soup là khả năng tìm kiếm các loại thẻ cụ thể có thuộc tính khớp với các giá trị nhất định. Ví dụ: nếu bạn muốn tìm tất cả các thẻ
>>> page = urlopen[url]
39 có thuộc tính >>> page = urlopen[url]
38 bằng giá trị >>> page = urlopen[url]
64, thì bạn có thể cung cấp đối số bổ sung sau cho >>> page = urlopen[url]
65>>>
>>> page
7Ví dụ này hơi tùy ý và tính hữu ích của kỹ thuật này có thể không rõ ràng từ ví dụ. Nếu bạn dành thời gian duyệt các trang web khác nhau và xem nguồn trang của chúng, thì bạn sẽ nhận thấy rằng nhiều trang web có cấu trúc HTML cực kỳ phức tạp
Khi cạo 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 thời gian xem qua tài liệu HTML, bạn có thể xác định các thẻ có thuộc tính duy nhất mà bạn có thể sử dụng để trích xuất dữ liệu mình cần
Sau đó, thay vì dựa vào các biểu thức chính quy phức tạp hoặc sử dụng
>>> start_index = title_index + len[""]
>>> start_index
21
9 để 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ầnTrong 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 mà bạn cần. Thư viện hơi phức tạp hơn để bắt đầu nhưng cung cấp tính linh hoạt hơn nhiều so với Beautiful Soup để phân tích tài liệu HTML. Bạn có thể muốn kiểm tra nó sau khi cảm thấy thoải mái khi sử dụng Beautiful Soup
Ghi chú. 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à lộn xộn đến mức 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 đúng các thẻ HTML
Trong trường hợp này, bạn thường phải sử dụng
>>> start_index = title_index + len[""]
>>> start_index
21
9 và các kỹ thuật biểu thức chính quy để cố gắng phân tích thông tin mà bạn cầnBeautiful Soup 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 biểu mẫu HTML. Ví dụ: nếu bạn cần tìm kiếm một số truy vấn trên một trang web và sau đó thu thập kết quả, thì một mình Beautiful Soup sẽ không giúp bạn tiến xa được
Loại bỏ các quảng cáoKiểm tra việc hiểu của bạn
Mở rộng khối bên dưới để kiểm tra sự hiểu biết của bạn
Tập thể dục. Phân tích cú pháp HTML bằng Beautiful SoupHiển thị/Ẩn
Viết chương trình lấy toàn bộ HTML từ trang tại URL
>>> page = urlopen[url]
68Sử dụng Beautiful Soup, in ra danh sách tất cả các liên kết trên trang bằng cách tìm các thẻ HTML có tên
>>> page = urlopen[url]
69 và truy xuất giá trị được lấy bởi thuộc tính >>> page = urlopen[url]
52 của mỗi thẻĐầu ra cuối cùng sẽ trông như thế này
>>> page
8Đảm bảo rằng bạn chỉ có một dấu gạch chéo [
>>> url = "//olympus.realpython.org/profiles/aphrodite"
75] giữa URL cơ sở và URL tương đốiBạn có thể mở rộng khối bên dưới để xem giải pháp
Giải pháp. Phân tích cú pháp HTML bằng Beautiful SoupHiển thị/Ẩn
Đầu tiên, nhập hàm
>>> url = "//olympus.realpython.org/profiles/aphrodite"
84 từ mô-đun >>> url = "//olympus.realpython.org/profiles/aphrodite"
85 và lớp >>> page = urlopen[url]
18 từ gói >>> page = urlopen[url]
75>>> page
9Mỗi URL liên kết trên trang
>>> page = urlopen[url]
76 là một URL tương đối, vì vậy hãy tạo một biến >>> page = urlopen[url]
77 với URL cơ sở của trang web>>> html_bytes = page.read[]
>>> html = html_bytes.decode["utf-8"]
0Bạn có thể tạo một URL đầy đủ bằng cách nối
>>> page = urlopen[url]
77 với một URL tương đốiBây giờ hãy mở trang
>>> page = urlopen[url]
76 bằng >>> title_index = html.find[""]
>>> title_index
14
8 và sử dụng >>> start_index = title_index + len[""]
>>> start_index
21
5 để lấy mã nguồn HTML>>> html_bytes = page.read[]
>>> html = html_bytes.decode["utf-8"]
1Với nguồn HTML được tải xuống và giải mã, bạn có thể tạo một đối tượng
>>> page = urlopen[url]
18 mới để phân tích cú pháp HTML>>> html_bytes = page.read[]
>>> html = html_bytes.decode["utf-8"]
2>>> page = urlopen[url]
83 trả về danh sách tất cả các liên kết trong mã nguồn HTML. Bạn có thể lặp lại danh sách này để in ra tất cả các liên kết trên trang web>>> html_bytes = page.read[]
>>> html = html_bytes.decode["utf-8"]
3Bạn có thể truy cập URL tương đối cho mỗi liên kết thông qua chỉ số phụ
>>> page = urlopen[url]
84. Nối giá trị này với >>> page = urlopen[url]
77 để tạo ra toàn bộ >>> page = urlopen[url]
86Khi 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 HTML
Mô-đun
>>> title_index = html.find[""]
>>> title_index
14
6 mà bạn đã làm việc cho đến nay trong hướng dẫn này rất phù hợp để yêu cầu nội dung của một trang web. Tuy nhiên, đôi khi bạn cần tương tác với một trang web để lấy 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 ẩnGhi chú. Hướng dẫn này được chuyển thể từ chương “Tương tác với Web” trong Python Basics. Giới thiệu thực tế về Python 3. Nếu bạn thích những gì bạn đang đọc, thì hãy nhớ xem phần còn lại của cuốn sách
Thư viện chuẩn Python không cung cấp phương tiện tích hợp sẵn để 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à 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 chương trình Python
Cài đặt MechanicalSoup
Bạn có thể cài đặt MechanicalSoup với
>>> page = urlopen[url]
88 trong thiết bị đầu cuối của mình>>> html_bytes = page.read[]
>>> html = html_bytes.decode["utf-8"]
4Bạ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
Tạo một đối tượng >>> page = urlopen[url]
89
>>> page = urlopen[url]
Nhập nội dung sau vào cửa sổ tương tác của IDLE
>>>
>>> html_bytes = page.read[]
>>> html = html_bytes.decode["utf-8"]
5>>> page = urlopen[url]
89 đố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 tới phương thức >>> page = urlopen[url]
91 của chúng>>>
>>> html_bytes = page.read[]
>>> html = html_bytes.decode["utf-8"]
6>>> page = urlopen[url]
92 là một đối tượng >>> page = urlopen[url]
93 lưu trữ phản hồi từ việc yêu cầu URL từ trình duyệt>>>
>>> html_bytes = page.read[]
>>> html = html_bytes.decode["utf-8"]
7Số
>>> page = urlopen[url]
94 đại diện cho mã trạng thái được yêu cầu trả về. Mã trạng thái của >>> page = urlopen[url]
94 có nghĩa là yêu cầu đã thành công. Một yêu cầu không thành công có thể hiển thị mã trạng thái là >>> page = urlopen[url]
96 nếu URL không tồn tại hoặc >>> page = urlopen[url]
97 nếu có lỗi máy chủ khi thực hiện yêu cầuMechanicalSoup sử dụng Beautiful Soup để phân tích cú pháp HTML từ yêu cầu và
>>> page = urlopen[url]
92 có thuộc tính >>> page = urlopen[url]
99 đại diện cho đối tượng >>> page = urlopen[url]
18>>>
>>> html_bytes = page.read[]
>>> html = html_bytes.decode["utf-8"]
8Bạn có thể xem HTML bằng cách kiểm tra thuộc tính
>>> page = urlopen[url]
99>>>
>>> html_bytes = page.read[]
>>> html = html_bytes.decode["utf-8"]
9Lưu ý rằng trang này có một
>>> page
02 trên đó với các phần tử >>> page
03 cho tên người dùng và mật khẩuLoại bỏ các quảng cáoGửi biểu mẫu với MechanicalSoup
Mở trang
>>> page
04 từ ví dụ trước trong trình duyệt và tự xem trang đó trước khi tiếp tụcHãy thử nhập kết hợp tên người dùng và mật khẩu ngẫu nhiên. Nếu bạn đoán sai, thì thông báo Sai tên người dùng hoặc mật khẩu. được hiển thị ở dưới cùng của trang
Tuy nhiên, nếu bạn cung cấp thông tin đăng nhập chính xác thì bạn sẽ được chuyển hướng đến trang
>>> page = urlopen[url]
76UsernamePassword
>>> page
06>>> page
07Trong 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 thẻ
>>> page
02. >>> page
02 trên trang này có thuộc tính >>> page
10 được đặt thành >>> page
11. Biểu mẫu này chứa hai phần tử >>> page
03, một phần tử có tên là >>> page
13 và phần tử kia có tên là >>> page
14. Phần tử >>> page
03 thứ ba là nút GửiBâ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 đăng nhập cần thiết để đăng nhập, hãy xem một chương trình điền vào biểu mẫu và gửi biểu mẫu đó
Trong cửa sổ soạn thảo mới, gõ vào chương trình sau
>>> print[html]
Profile: Aphrodite
Name: Aphrodite
Favorite animal: Dove
Favorite color: Red
Hometown: Mount Olympus
0Lưu tệp và nhấn F5 để chạy tệp. Để xác nhận rằng bạn đã đăng nhập thành công, hãy nhập thông tin sau vào cửa sổ tương tác.
>>>
>>> print[html]
Profile: Aphrodite
Name: Aphrodite
Favorite animal: Dove
Favorite color: Red
Hometown: Mount Olympus
1Bây giờ chia nhỏ ví dụ trên
Bạn tạo một phiên bản
89 và sử dụng nó để yêu cầu URL>>> page = urlopen[url]
17. Bạn gán nội dung HTML của trang cho biến>>> page
18 bằng cách sử dụng thuộc tính>>> page
99>>> page = urlopen[url]
20 trả về danh sách tất cả các phần tử>>> page
02 trên trang. Vì trang chỉ có một phần tử>>> page
02 nên 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>>> page
23 của danh sách. Khi chỉ có một biểu mẫu trên một trang, bạn cũng có thể sử dụng>>> page
24. 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 lần lượt là>>> page
25 và>>> page
26>>> page
Bạn gửi biểu mẫu với
27. Lưu ý rằng bạn truyền hai đối số cho phương thức này, đối tượng>>> page
28 và URL của>>> page
29 mà bạn truy cập thông qua>>> page
30>>> page
Trong cửa sổ tương tác, bạn xác nhận rằng nội dung gửi đã được chuyển hướng thành công đến trang
>>> page = urlopen[url]
76. Nếu có gì đó không ổn, thì giá trị của >>> page
32 vẫn sẽ là >>> page
33Ghi chú. 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 sự kết hợp hoạt động
Bên cạnh việc điều này rất bất hợp pháp, hầu hết 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ờ bạn đã có bộ biến
>>> page
34, đã đến lúc lấy URL cho mỗi liên kết trên trang >>> page = urlopen[url]
76 theo chương trìnhĐể làm điều này, bạn sử dụng lại
>>> page
36, lần này chuyển chuỗi >>> url = "//olympus.realpython.org/profiles/aphrodite"
21 để chọn tất cả các phần tử neo >>> page
38 trên trang>>>
>>> print[html]
Profile: Aphrodite
Name: Aphrodite
Favorite animal: Dove
Favorite color: Red
Hometown: Mount Olympus
2Bây giờ bạn có thể lặp qua từng liên kết và in thuộc tính
>>> page = urlopen[url]
52>>>
>>> print[html]
Profile: Aphrodite
Name: Aphrodite
Favorite animal: Dove
Favorite color: Red
Hometown: Mount Olympus
3Các URL có trong mỗi thuộc tính
>>> page = urlopen[url]
52 là các URL tương đối, không hữu ích lắm nếu bạn muốn điều hướng đến chúng sau này bằng MechanicalSoup. Nếu bạn tình cờ biết URL đầy đủ, thì bạn có thể chỉ định phần cần thiết để tạo URL đầy đủTrong trường hợp này, URL cơ sở chỉ là
>>> page
41. Sau đó, bạn có thể nối URL cơ sở với các URL tương đối được tìm thấy trong thuộc tính >>> page = urlopen[url]
38>>>
>>> print[html]
Profile: Aphrodite
Name: Aphrodite
Favorite animal: Dove
Favorite color: Red
Hometown: Mount Olympus
4Bạn có thể làm được rất nhiều việc chỉ với
>>> page = urlopen[url]
91, >>> page
36 và >>> page
45. Điều đó nói rằng, MechanicalSoup có khả năng nhiều hơn nữa. Để tìm hiểu thêm về MechanicalSoup, hãy xem tài liệu chính thứcLoại bỏ các quảng cáoKiểm tra việc hiểu của bạn
Mở rộng khối bên dưới để kiểm tra sự hiểu biết của bạn
Tập thể dục. Gửi biểu mẫu bằng MechanicalSoupHiển thị/Ẩn
Sử dụng MechanicalSoup để cung cấp đúng tên người dùng [
>>> page
06] và mật khẩu [>>> page
07] vào biểu mẫu đăng nhập có tại URL >>> page
17Sau khi biểu mẫu được gửi, hãy hiển thị tiêu đề của trang hiện tại để xác định rằng bạn đã được chuyển hướng đến trang
>>> page = urlopen[url]
76Chương trình của bạn sẽ in văn bản
>>> page
50Bạn có thể mở rộng khối bên dưới để xem giải pháp
Giải pháp. Gửi biểu mẫu bằng MechanicalSoupHiển thị/Ẩn
Đầu tiên, nhập gói
>>> page
51 và tạo đối tượng >>> page
52>>> print[html]
Profile: Aphrodite
Name: Aphrodite
Favorite animal: Dove
Favorite color: Red
Hometown: Mount Olympus
5Trỏ trình duyệt đến trang đăng nhập bằng cách chuyển URL tới
>>> page
53 và lấy HTML có thuộc tính >>> page = urlopen[url]
99>>> print[html]
Profile: Aphrodite
Name: Aphrodite
Favorite animal: Dove
Favorite color: Red
Hometown: Mount Olympus
6>>> page
18 là một trường hợp >>> page = urlopen[url]
18. Vì trang này chỉ có một biểu mẫu duy nhất trên đó nên bạn có thể truy cập biểu mẫu qua >>> page
24. Sử dụng >>> page
36, chọn đầu vào tên người dùng và mật khẩu và điền chúng bằng tên người dùng >>> page
25 và mật khẩu >>> page
26>>> print[html]
Profile: Aphrodite
Name: Aphrodite
Favorite animal: Dove
Favorite color: Red
Hometown: Mount Olympus
7Bây giờ biểu mẫu đã được điền đầy đủ, bạn có thể gửi nó cùng với
>>> page
27>>> print[html]
Profile: Aphrodite
Name: Aphrodite
Favorite animal: Dove
Favorite color: Red
Hometown: Mount Olympus
8Nếu bạn điền đúng tên người dùng và mật khẩu vào biểu mẫu, thì
>>> page
34 thực sự sẽ trỏ đến trang >>> page = urlopen[url]
76. Bạn có thể xác nhận điều này bằng cách in tiêu đề của trang được gán cho >>> page
64>>> print[html]
Profile: Aphrodite
Name: Aphrodite
Favorite animal: Dove
Favorite color: Red
Hometown: Mount Olympus
9Bạn sẽ thấy văn bản sau được hiển thị
>>> title_index = html.find[""]
>>> title_index
14
0Nếu thay vào đó, bạn thấy văn bản
>>> page
65 hoặc nội dung nào khác, thì việc gửi biểu mẫu không thành côngKhi 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 trang web trong thời gian thực
Đôi khi bạn muốn có thể lấy dữ liệu theo thời gian thực từ một trang web cung cấp thông tin được cập nhật liên tục
Vào những ngày đen tối trước khi bạn học lập trình Python, bạn phải ngồi trước trình duyệt, nhấp vào nút Làm mới để tải lại trang mỗi khi bạn muốn kiểm tra xem có nội dung cập nhật hay không. Nhưng bây giờ bạn có thể tự động hóa quy trình này bằng cách sử dụng phương thức
>>> page = urlopen[url]
91 của đối tượng MechanicalSoup >>> page = urlopen[url]
89Mở trình duyệt bạn chọn và điều hướng đến URL
>>> page
68Trang
>>> page
69 này mô phỏng trò tung xúc xắc sáu mặt, cập nhật kết quả mỗi khi bạn làm mới trình duyệt. Dưới đây, bạn sẽ viết một chương trình liên tục quét trang để có kết quả mớiĐiều đầu tiên bạn cần làm là xác định phần tử nào trên trang chứa kết quả của việc tung xúc xắc. Thực hiện việc này ngay bây giờ bằng cách nhấp chuột phải vào bất kỳ đâu trên trang và chọn Xem nguồn trang. Hơn một nửa mã HTML là một thẻ
>>> page
70 trông như thế này>>> title_index = html.find[""]
>>> title_index
14
1Văn bản của thẻ
>>> page
70 có thể khác đối với bạn, nhưng đây là thành phần trang bạn cần để trích xuất kết quảGhi chú. Đố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 có
>>> page
72. Mặc dù thuộc tính >>> page
73 đượ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 khôngBây giờ hãy bắt đầu bằng cách viết một chương trình đơn giản mở trang
>>> page
69, loại bỏ kết quả và in nó ra bàn điều khiển>>> title_index = html.find[""]
>>> title_index
14
2Ví dụ này sử dụng phương thức
>>> page
36 của đối tượng >>> page = urlopen[url]
18 để tìm phần tử có >>> page
77. Chuỗi >>> page
78 mà bạn chuyển đến >>> page
36, sử dụng bộ chọn CSS ID >>> page
80 để cho biết rằng >>> page
81 là một giá trị >>> page
73Để định kỳ nhận được kết quả mới, bạn sẽ 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
>>> page
83 trong đoạn mã trên cần phải nằm trong phần thân của vòng lặpĐối với ví dụ này, bạn muốn tung xúc xắc bốn lần cách nhau mười giây. Để làm điều đó, dòng mã cuối cùng 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
>>> page
84 từ mô-đun >>> page
85 của Python. Phương thức >>> page
84 lấy một đối số duy nhất biểu thị lượng thời gian để ngủ tính bằng giâyĐây là một ví dụ minh họa cách hoạt động của
>>> page
87>>> title_index = html.find[""]
>>> title_index
14
3Khi bạn chạy mã này, bạn sẽ thấy thông báo
>>> page
88 không được hiển thị cho đến khi năm giây trôi qua kể từ khi hàm >>> page = urlopen[url]
17 đầu tiên được thực thiĐối với ví dụ cuộn xúc xắc, bạn sẽ cần chuyển số
>>> page
90 đến >>> page
87. Đây là chương trình cập nhật>>> title_index = html.find[""]
>>> title_index
14
4Khi chạy chương trình, bạn sẽ thấy ngay kết quả đầu tiên được in ra bàn điều khiển. Sau mười 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. Đó là một sự 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 câu lệnh
>>> page
92 để chạy >>> page
93 chỉ cho ba yêu cầu đầu tiên>>> title_index = html.find[""]
>>> title_index
14
5Với các kỹ thuật như thế này, bạn có thể thu thập 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 lưu ý rằng việc yêu cầu một trang nhiều lần liên tiếp có thể bị coi là hành vi sử dụng trang web đáng ngờ hoặc thậm chí là độc hại
Quan trọng. Hầu hết các trang web 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ó ở 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 thử 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 khối lượng yêu cầu 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
Thậm chí có thể làm sập 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ề số 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
Loại bỏ các quảng cáoPhần kết luận
Mặ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
- Yêu cầu một trang web bằng mô-đun
6 tích hợp sẵn của Python>>> title_index = html.find[""] >>> title_index 14
- Phân tích cú pháp HTML bằng Beautiful Soup
- Tương tác với các biểu mẫu web bằng MechanicalSoup
- Liên tục yêu cầu dữ liệu từ một trang web để kiểm tra các bản cập nhật
Viết các chương trình qué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ớ rằng, 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 thu thập dữ liệu và tôn trọng cách bạn tính thời gian cho các yêu cầu web của mình để bạn không làm ngập máy chủ với lưu lượng truy cập
Mã nguồn. Nhấp vào đây để tải xuống mã nguồn miễn phí mà bạn sẽ sử dụng để thu thập và phân tích dữ liệu từ Web
Tài nguyên bổ sung
Để biết thêm thông tin về quét web bằng Python, hãy xem các tài nguyên sau
- súp đẹp. Xây dựng một Web Scraper với Python
- Tích hợp API trong Python
- Python & API. Một kết hợp chiến thắng để đọc dữ liệu công khai
Ghi chú. Nếu bạn thích những gì bạn học được trong ví dụ này từ Python Basics. Giới thiệu thực tế về Python 3, thì hãy nhớ xem phần còn lại của cuốn sách
Đánh dấu là đã hoàn thành
🐍 Thủ thuật Python 💌
Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python
Gửi cho tôi thủ thuật Python »
Giới thiệu về David Amos
David là một nhà văn, lập trình viên và nhà toán học đam mê khám phá toán học thông qua mã
» Thông tin thêm về DavidMỗi hướng dẫn tại Real Python được tạo bởi một nhóm các nhà phát triển để nó đáp ứng các tiêu chuẩn chất lượng cao của chúng tôi. Các thành viên trong nhóm đã làm việc trong hướng dẫn này là
Aldren
Geir Arne
Joanna
Gia-cốp
kate
Martin
Philipp
Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực
Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia
Nâng cao kỹ năng Python của bạn »
Chuyên gia Kỹ năng Python trong thế giới thực
Với quyền truy cập không giới hạn vào Python thực
Tham gia với chúng tôi và có quyền truy cập vào hàng ngàn hướng dẫn, khóa học video thực hành và cộng đồng Pythonistas chuyên gia
Nâng cao kỹ năng Python của bạn »
Bạn nghĩ sao?
Đánh giá bài viết này
Tweet Chia sẻ Chia sẻ EmailBài học số 1 hoặc điều yêu thích mà bạn đã học được là gì?
Mẹo bình luận. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi