Hướng dẫn python web scraping input - đầu vào nạo web python

Mục lục bài viết:

  • Cạo và phân tích cú pháp văn bản từ trang web
    • Trình duyệt web đầu tiên của bạn
    • Trích xuất văn bản từ HTML bằng các phương thức chuỗi
    • Một lớp lót trên các biểu thức chính quy
    • Trích xuất văn bản từ HTML với biểu thức chính quy
    • Kiểm tra việc hiểu của bạn
  • Sử dụng một trình phân tích cú pháp HTML cho Web Scraping bằng Python
    • Cài đặt Beautiful Soup
    • Tạo một đối tượng BeautifulSoup
    • Sử dụng đối tượng BeautifulSoup
    • Kiểm tra việc hiểu của bạn
  • Sử dụng một trình phân tích cú pháp HTML cho Web Scraping bằng Python
    • Cài đặt Beautiful Soup
    • Tạo một đối tượng BeautifulSoup
    • Sử dụng đối tượng BeautifulSoup
    • Kiểm tra việc hiểu của bạn
  • Sử dụng một trình phân tích cú pháp HTML cho Web Scraping bằng Python
  • Cài đặt Beautiful Soup
  • Tạo một đối tượng BeautifulSoup

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

  • Tạo một đối tượng trình duyệt
  • Gửi biểu mẫu với MechanicalSoup
  • Tương tác với các trang web trong thời gian thực

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 web

Web 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ẽ.

  1. Internet có lẽ là nguồn cung cấp thông tin và thông tin sai lệch 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ể được 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.
  2. Trong hướng dẫn này, bạn sẽ học cách:

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ạn

Lư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ể:

>>> from urllib.request import urlopen

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ể:

>>> url = "http://olympus.realpython.org/profiles/aphrodite"

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ể:

>>> page = urlopen(url)

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ể:

>>> page
<http.client.HTTPResponse object at 0x105fef820>

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ể:

>>> html_bytes = page.read()
>>> html = html_bytes.decode("utf-8")

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ể:

>>> print(html)
<html>
<head>
<title>Profile: Aphrodite</title>
</head>
<body bgcolor="yellow">
<center>
<br><br>
<img src="/static/aphrodite.gif" />
<h2>Name: Aphrodite</h2>
<br><br>
Favorite animal: Dove
<br><br>
Favorite color: Red
<br><br>
Hometown: Mount Olympus
</center>
</body>
</html>

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ỗi

Thự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 

>>> title_index = html.find("<title>")
>>> title_index
14
2thẻ đóng , thì bạn có thể sử dụng một lát chuỗi để trích xuất tiêu đề.

Vì 

>>> title_index = html.find("<title>")
>>> title_index
14
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 
>>> title_index = html.find("<title>")
>>> title_index
14
1thẻ mở bằng cách chuyển chuỗi 
>>> title_index = html.find("<title>")
>>> title_index
14
5tới 
>>> title_index = html.find("<title>")
>>> title_index
14
0:

>>>

>>> title_index = html.find("<title>")
>>> title_index
14

Tuy nhiên, bạn không muốn chỉ mục của 

>>> title_index = html.find("<title>")
>>> title_index
14
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 
>>> title_index = html.find("<title>")
>>> title_index
14
5vào 
>>> title_index = html.find("<title>")
>>> title_index
14
9:

>>>

>>> start_index = title_index + len("<title>")
>>> start_index
21

Tuy nhiên, bạn không muốn chỉ mục của 

>>> title_index = html.find("<title>")
>>> title_index
14
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 
>>> title_index = html.find("<title>")
>>> title_index
14
5vào 
>>> title_index = html.find("<title>")
>>> title_index
14
9:

>>>

>>> end_index = html.find("</title>")
>>> end_index
39

Tuy nhiên, bạn không muốn chỉ mục của 

>>> title_index = html.find("<title>")
>>> title_index
14
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 
>>> title_index = html.find("<title>")
>>> title_index
14
5vào 
>>> title_index = html.find("<title>")
>>> title_index
14
9:

>>>

>>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'

Tuy nhiên, bạn không muốn chỉ mục của 

>>> title_index = html.find("<title>")
>>> title_index
14
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 
>>> title_index = html.find("<title>")
>>> title_index
14
5vào 
>>> title_index = html.find("<title>")
>>> title_index
14
9:

>>>

>>> url = "http://olympus.realpython.org/profiles/aphrodite"
0

Tuy nhiên, bạn không muốn chỉ mục của 

>>> title_index = html.find("<title>")
>>> title_index
14
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 
>>> title_index = html.find("<title>")
>>> title_index
14
5vào 
>>> title_index = html.find("<title>")
>>> title_index
14
9:

>>>

>>> url = "http://olympus.realpython.org/profiles/aphrodite"
1

Tuy nhiên, bạn không muốn chỉ mục của 

>>> title_index = html.find("<title>")
>>> title_index
14
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 
>>> title_index = html.find("<title>")
>>> title_index
14
5vào 
>>> title_index = html.find("<title>")
>>> title_index
14
9:

Bây giờ lấy chỉ mục của 

>>> title_index = html.find("<title>")
>>> title_index
14
2thẻ đóng bằng cách chuyển chuỗi 
>>> start_index = title_index + len("<title>")
>>> start_index
21
1tới 
>>> title_index = html.find("<title>")
>>> title_index
14
0:

Cuối cùng, bạn có thể trích xuất tiêu đề bằng cách cắt 

>>> start_index = title_index + len("<title>")
>>> start_index
21
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 

>>> start_index = title_index + len("<title>")
>>> start_index
21
4trang trông tương tự như 
>>> start_index = title_index + len("<title>")
>>> start_index
21
5trang, nhưng có một sự khác biệt nhỏ. 
>>> title_index = html.find("<title>")
>>> title_index
14
1Thẻ mở có thêm một khoảng trắng trước dấu ngoặc nhọn đóng ( 
>>> start_index = title_index + len("<title>")
>>> start_index
21
7), hiển thị nó dưới dạng 
>>> start_index = title_index + len("<title>")
>>> start_index
21
8.

>>> start_index = title_index + len("<title>")
>>> start_index
21
9trả về 
>>> end_index = html.find("</title>")
>>> end_index
39
0vì chuỗi con chính xác 
>>> title_index = html.find("<title>")
>>> title_index
14
5không tồn tại. Khi 
>>> end_index = html.find("</title>")
>>> end_index
39
0được thêm vào 
>>> end_index = html.find("</title>")
>>> end_index
39
3, nghĩa là 
>>> end_index = html.find("</title>")
>>> end_index
39
4, 
>>> end_index = html.find("</title>")
>>> end_index
39
5biến được gán giá trị 
>>> end_index = html.find("</title>")
>>> end_index
39
6.

Ký tự tại chỉ mục 

>>> end_index = html.find("</title>")
>>> end_index
39
6của chuỗi 
>>> start_index = title_index + len("<title>")
>>> start_index
21
3là ký tự dòng mới ( 
>>> end_index = html.find("</title>")
>>> end_index
39
9) ngay trước dấu ngoặc nhọn mở ( 
>>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
0) của 
>>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
1thẻ. Điều này có nghĩa là 
>>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
2trả về tất cả HTML bắt đầu bằng dòng mới đó và kết thúc ngay trước 
>>> title_index = html.find("<title>")
>>> title_index
14
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

>>>

>>> url = "http://olympus.realpython.org/profiles/aphrodite"
2

Biể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 

>>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
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 

>>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
4mô-đun:

>>>

>>> url = "http://olympus.realpython.org/profiles/aphrodite"
3

Biể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ị ( 

>>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
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 

>>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
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:

>>>

>>> url = "http://olympus.realpython.org/profiles/aphrodite"
4

Đối số đầu tiên 

>>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
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 
>>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
9trong chuỗi 
>>> url = "http://olympus.realpython.org/profiles/aphrodite"
00.

>>>

>>> url = "http://olympus.realpython.org/profiles/aphrodite"
5

Biểu thức chính quy 

>>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
9khớp với bất kỳ phần nào của chuỗi bắt đầu bằng dấu 
>>> url = "http://olympus.realpython.org/profiles/aphrodite"
02, kết thúc bằng a 
>>> url = "http://olympus.realpython.org/profiles/aphrodite"
03và không có hoặc nhiều trường hợp ở 
>>> url = "http://olympus.realpython.org/profiles/aphrodite"
04giữa hai. 
>>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
8trả về danh sách tất cả các kết quả phù hợp. Chuỗi 
>>> url = "http://olympus.realpython.org/profiles/aphrodite"
00khớp với mẫu này, vì vậy nó được trả về trong danh sách.

>>>

>>> url = "http://olympus.realpython.org/profiles/aphrodite"
6

Thông thường, bạn sử dụng 

>>> url = "http://olympus.realpython.org/profiles/aphrodite"
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 
>>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
8vì nó trả về một đối tượng được gọi là a 
>>> url = "http://olympus.realpython.org/profiles/aphrodite"
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à 
>>> url = "http://olympus.realpython.org/profiles/aphrodite"
16trả về mọi kết quả có thể có.

Các chi tiết của 

>>> url = "http://olympus.realpython.org/profiles/aphrodite"
18không liên quan ở đây. Hiện tại, chỉ cần biết rằng việc gọi 
>>> url = "http://olympus.realpython.org/profiles/aphrodite"
21a 
>>> url = "http://olympus.realpython.org/profiles/aphrodite"
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:

>>>

>>> url = "http://olympus.realpython.org/profiles/aphrodite"
7

Có một chức năng nữa trong 

>>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
4mô-đun hữu ích cho việc phân tích văn bản. 
>>> url = "http://olympus.realpython.org/profiles/aphrodite"
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ư 
>>> url = "http://olympus.realpython.org/profiles/aphrodite"
25phương thức chuỗi.

Các đối số được truyền tới 

>>> url = "http://olympus.realpython.org/profiles/aphrodite"
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ụ:

>>>

>>> url = "http://olympus.realpython.org/profiles/aphrodite"
8

Có lẽ đó không phải là những gì bạn mong đợi sẽ xảy ra.

>>> url = "http://olympus.realpython.org/profiles/aphrodite"
24sử dụng biểu thức chính quy 
>>> url = "http://olympus.realpython.org/profiles/aphrodite"
28để tìm và thay thế mọi thứ giữa từ đầu 
>>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
0đến cuối 
>>> start_index = title_index + len("<title>")
>>> start_index
21
7, kéo dài từ đầu 
>>> url = "http://olympus.realpython.org/profiles/aphrodite"
31đến cuối 
>>> url = "http://olympus.realpython.org/profiles/aphrodite"
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ư 
>>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
6được sử dụng.

Ngoài ra, bạn có thể sử dụng mẫu đối sánh không tham lam 

>>> url = "http://olympus.realpython.org/profiles/aphrodite"
34, hoạt động giống như cách 
>>> title = html[start_index:end_index]
>>> title
'Profile: Aphrodite'
6ngoại trừ việc nó khớp với chuỗi văn bản ngắn nhất có thể:

>>>

>>> url = "http://olympus.realpython.org/profiles/aphrodite"
9

Lần này, 

>>> url = "http://olympus.realpython.org/profiles/aphrodite"
24tìm hai kết quả phù hợp 
>>> url = "http://olympus.realpython.org/profiles/aphrodite"
31và 
>>> url = "http://olympus.realpython.org/profiles/aphrodite"
32và thay thế chuỗi 
>>> url = "http://olympus.realpython.org/profiles/aphrodite"
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:

>>> page = urlopen(url)
0

Các 

>>> title_index = html.find("<title>")
>>> title_index
14
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ả:

>>> page = urlopen(url)
1

Hãy xem xét kỹ hơn biểu thức chính quy đầu tiên trong 

>>> url = "http://olympus.realpython.org/profiles/aphrodite"
41chuỗi bằng cách chia nó thành ba phần:

  1. >>> url = "http://olympus.realpython.org/profiles/aphrodite"
    
    42khớp với 
    >>> url = "http://olympus.realpython.org/profiles/aphrodite"
    
    43thẻ mở trong 
    >>> start_index = title_index + len("<title>")
    >>> start_index
    21
    
    3. Phần 
    >>> url = "http://olympus.realpython.org/profiles/aphrodite"
    
    45của mẫu khớp với 
    >>> url = "http://olympus.realpython.org/profiles/aphrodite"
    
    46bởi vì 
    >>> url = "http://olympus.realpython.org/profiles/aphrodite"
    
    16được gọi với 
    >>> url = "http://olympus.realpython.org/profiles/aphrodite"
    
    08và 
    >>> url = "http://olympus.realpython.org/profiles/aphrodite"
    
    49khớp với bất kỳ văn bản nào sau 
    >>> url = "http://olympus.realpython.org/profiles/aphrodite"
    
    46phiên bản đầu tiên của 
    >>> start_index = title_index + len("<title>")
    >>> start_index
    21
    
    7.

  2. >>> url = "http://olympus.realpython.org/profiles/aphrodite"
    
    52không tham lam phù hợp với tất cả các văn bản sau khi mở đầu 
    >>> url = "http://olympus.realpython.org/profiles/aphrodite"
    
    43, dừng lại ở trận đấu đầu tiên cho 
    >>> url = "http://olympus.realpython.org/profiles/aphrodite"
    
    54.

  3. >>> url = "http://olympus.realpython.org/profiles/aphrodite"
    
    54chỉ khác với mẫu đầu tiên ở cách sử dụng 
    >>> url = "http://olympus.realpython.org/profiles/aphrodite"
    
    56ký tự, vì vậy nó khớp với 
    >>> url = "http://olympus.realpython.org/profiles/aphrodite"
    
    57thẻ đóng trong 
    >>> start_index = title_index + len("<title>")
    >>> start_index
    21
    
    3.

Biểu thức chính quy thứ hai, chuỗi 

>>> url = "http://olympus.realpython.org/profiles/aphrodite"
59, cũng sử dụng không tham lam 
>>> url = "http://olympus.realpython.org/profiles/aphrodite"
52để khớp với tất cả các thẻ HTML trong 
>>> url = "http://olympus.realpython.org/profiles/aphrodite"
61chuỗi. Bằng cách thay thế bất kỳ kết quả phù hợp nào bằng 
>>> url = "http://olympus.realpython.org/profiles/aphrodite"
62, 
>>> url = "http://olympus.realpython.org/profiles/aphrodite"
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ạn

Mở 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 Python

Mặ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:

>>> page = urlopen(url)
2

Chạy 

>>> url = "http://olympus.realpython.org/profiles/aphrodite"
64để xem chi tiết về gói bạn vừa cài đặt:

>>> page = urlopen(url)
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ượng

Nhập chương trình sau vào một cửa sổ soạn thảo mới:

>>> page = urlopen(url)
4

Chương trình này thực hiện ba điều:

  1. Mở URL 

    >>> url = "http://olympus.realpython.org/profiles/aphrodite"
    
    66bằng cách sử dụng 
    >>> print(html)
    <html>
    <head>
    <title>Profile: Aphrodite</title>
    </head>
    <body bgcolor="yellow">
    <center>
    <br><br>
    <img src="/static/aphrodite.gif" />
    <h2>Name: Aphrodite</h2>
    <br><br>
    Favorite animal: Dove
    <br><br>
    Favorite color: Red
    <br><br>
    Hometown: Mount Olympus
    </center>
    </body>
    </html>
    
    1từ 
    >>> print(html)
    <html>
    <head>
    <title>Profile: Aphrodite</title>
    </head>
    <body bgcolor="yellow">
    <center>
    <br><br>
    <img src="/static/aphrodite.gif" />
    <h2>Name: Aphrodite</h2>
    <br><br>
    Favorite animal: Dove
    <br><br>
    Favorite color: Red
    <br><br>
    Hometown: Mount Olympus
    </center>
    </body>
    </html>
    
    0mô-đun

  2. Đọc HTML từ trang dưới dạng một chuỗi và gán nó cho 

    >>> start_index = title_index + len("<title>")
    >>> start_index
    21
    
    3biến

  3. Tạo một 

    >>> url = "http://olympus.realpython.org/profiles/aphrodite"
    
    65đối tượng và gán nó cho 
    >>> url = "http://olympus.realpython.org/profiles/aphrodite"
    
    71biến

Đối 

>>> url = "http://olympus.realpython.org/profiles/aphrodite"
65tượng được gán cho 
>>> url = "http://olympus.realpython.org/profiles/aphrodite"
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 
>>> url = "http://olympus.realpython.org/profiles/aphrodite"
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. 
>>> url = "http://olympus.realpython.org/profiles/aphrodite"
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ượng

Lưu và chạy chương trình trên. Khi nó chạy xong, bạn có thể sử dụng 

>>> url = "http://olympus.realpython.org/profiles/aphrodite"
71biến trong cửa sổ tương tác để phân tích nội dung 
>>> start_index = title_index + len("<title>")
>>> start_index
21
3theo nhiều cách khác nhau.

Ví dụ: 

>>> url = "http://olympus.realpython.org/profiles/aphrodite"
65các đối tượng có một 
>>> url = "http://olympus.realpython.org/profiles/aphrodite"
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:

>>>

>>> page = urlopen(url)
5

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 

>>> url = "http://olympus.realpython.org/profiles/aphrodite"
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 

>>> title_index = html.find("<title>")
>>> title_index
14
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 

>>> url = "http://olympus.realpython.org/profiles/aphrodite"
83thuộc tính của 
>>> url = "http://olympus.realpython.org/profiles/aphrodite"
84các thẻ HTML.

Trong trường hợp này, bạn có thể sử dụng 

>>> url = "http://olympus.realpython.org/profiles/aphrodite"
85để trả về danh sách tất cả các phiên bản của thẻ cụ thể đó:

>>>

>>> page = urlopen(url)
6

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 

>>> url = "http://olympus.realpython.org/profiles/aphrodite"
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 

>>> title_index = html.find("<title>")
>>> title_index
14
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.

>>>

>>> page = urlopen(url)
7

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 

>>> url = "http://olympus.realpython.org/profiles/aphrodite"
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 

>>> title_index = html.find("<title>")
>>> title_index
14
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 

>>> url = "http://olympus.realpython.org/profiles/aphrodite"
83thuộc tính của 
>>> url = "http://olympus.realpython.org/profiles/aphrodite"
84các thẻ HTML.

Trong trường hợp này, bạn có thể sử dụng 

>>> url = "http://olympus.realpython.org/profiles/aphrodite"
85để trả về danh sách tất cả các phiên bản của thẻ cụ thể đó:

>>>

>>> page = urlopen(url)
8

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 

>>> url = "http://olympus.realpython.org/profiles/aphrodite"
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 
>>> url = "http://olympus.realpython.org/profiles/aphrodite"
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 

>>> title_index = html.find("<title>")
>>> title_index
14
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.

>>> page
<http.client.HTTPResponse object at 0x105fef820>
0

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 

>>> url = "http://olympus.realpython.org/profiles/aphrodite"
83thuộc tính của 
>>> url = "http://olympus.realpython.org/profiles/aphrodite"
84các thẻ HTML.

Trong trường hợp này, bạn có thể sử dụng 

>>> url = "http://olympus.realpython.org/profiles/aphrodite"
85để trả về danh sách tất cả các phiên bản của thẻ cụ thể đó:

>>>

>>> page
<http.client.HTTPResponse object at 0x105fef820>
1

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 

>>> url = "http://olympus.realpython.org/profiles/aphrodite"
25phương thức chuỗi nếu cần.

>>>

>>> page
<http.client.HTTPResponse object at 0x105fef820>
2

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 

>>> url = "http://olympus.realpython.org/profiles/aphrodite"
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 

>>> title_index = html.find("<title>")
>>> title_index
14
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 

>>> title_index = html.find("<title>")
>>> title_index
14
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ạn

Mở 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 HTML

Các 

>>> html_bytes = page.read()
>>> html = html_bytes.decode("utf-8")
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 MechanicalSoup

Bạn có thể cài đặt MechanicalSoup 

>>> page = urlopen(url)
14trong thiết bị đầu cuối của mình:

>>> page
<http.client.HTTPResponse object at 0x105fef820>
3

Bây giờ bạn có thể xem một số chi tiết về gói với 

>>> url = "http://olympus.realpython.org/profiles/aphrodite"
64:

>>> page
<http.client.HTTPResponse object at 0x105fef820>
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ượng

Nhập thông tin sau vào cửa sổ tương tác của IDLE:

>>>

>>> page
<http.client.HTTPResponse object at 0x105fef820>
5

>>> page = urlopen(url)
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 
>>> page = urlopen(url)
18phương thức của chúng :

>>>

>>> page
<http.client.HTTPResponse object at 0x105fef820>
6

>>> page = urlopen(url)
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 
>>> page = urlopen(url)
18phương thức của chúng :

>>>

>>> page
<http.client.HTTPResponse object at 0x105fef820>
7

>>> page = urlopen(url)
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 
>>> page = urlopen(url)
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:

>>>

>>> page
<http.client.HTTPResponse object at 0x105fef820>
8

>>> page = urlopen(url)
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 
>>> page = urlopen(url)
18phương thức của chúng :

>>>

>>> page
<http.client.HTTPResponse object at 0x105fef820>
9

>>> page = urlopen(url)
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 
>>> page = urlopen(url)
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ố 

>>> page = urlopen(url)
21đại diện cho mã trạng thái được trả về bởi yêu cầu. Mã trạng thái 
>>> page = urlopen(url)
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 
>>> page = urlopen(url)
23nếu URL không tồn tại hoặc 
>>> page = urlopen(url)
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. 

>>> page = urlopen(url)
19có một 
>>> page = urlopen(url)
26thuộc tính đại diện cho một 
>>> url = "http://olympus.realpython.org/profiles/aphrodite"
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 

>>> page = urlopen(url)
29thẻ. Trên 
>>> page = urlopen(url)
29trang này có 
>>> page = urlopen(url)
37thuộc tính được đặt thành 
>>> page = urlopen(url)
38. Biểu mẫu này chứa hai 
>>> page = urlopen(url)
30phần tử, một phần tử được đặt tên 
>>> page = urlopen(url)
40và phần tử còn lại được đặt tên 
>>> page = urlopen(url)
41. 
>>> page = urlopen(url)
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:

>>> html_bytes = page.read()
>>> html = html_bytes.decode("utf-8")
0

Lư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:

>>>

>>> html_bytes = page.read()
>>> html = html_bytes.decode("utf-8")
1

Hãy chia nhỏ ví dụ trên:

  1. 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.

  2. >>> page = urlopen(url)
    
    47trả về danh sách tất cả các 
    >>> page = urlopen(url)
    
    29phần tử trên trang. Vì trang chỉ có một 
    >>> page = urlopen(url)
    
    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 
    >>> page = urlopen(url)
    
    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 
    >>> page = urlopen(url)
    
    51và 
    >>> page = urlopen(url)
    
    52, tương ứng.

  3. Bạn gửi biểu mẫu với 

    >>> page = urlopen(url)
    
    53. Lưu ý rằng bạn truyền hai đối số cho phương thức này, 
    >>> page = urlopen(url)
    
    54đối tượng và URL của đối tượng 
    >>> page = urlopen(url)
    
    55mà bạn truy cập qua 
    >>> page = urlopen(url)
    
    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 

>>> page = urlopen(url)
34trang. Nếu có gì đó không ổn, thì giá trị của 
>>> page = urlopen(url)
58nó vẫn sẽ là như vậy 
>>> page = urlopen(url)
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ộ 

>>> page = urlopen(url)
60biến, hãy xem cách lấy URL theo chương trình cho mỗi liên kết trên 
>>> page = urlopen(url)
34trang.

Để thực hiện việc này, bạn sử dụng 

>>> page = urlopen(url)
62lại lần nữa, lần này truyền chuỗi 
>>> url = "http://olympus.realpython.org/profiles/aphrodite"
02để chọn tất cả các 
>>> page = urlopen(url)
64phần tử neo trên trang:

>>>

>>> html_bytes = page.read()
>>> html = html_bytes.decode("utf-8")
2

Hãy chia nhỏ ví dụ trên:

>>>

>>> html_bytes = page.read()
>>> html = html_bytes.decode("utf-8")
3

Hã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.

>>>

>>> html_bytes = page.read()
>>> html = html_bytes.decode("utf-8")
4

Hã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.

>>> page = urlopen(url)
47trả về danh sách tất cả các 
>>> page = urlopen(url)
29phần tử trên trang. Vì trang chỉ có một 
>>> page = urlopen(url)
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 
>>> page = urlopen(url)
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 
>>> page = urlopen(url)
51và 
>>> page = urlopen(url)
52, tương ứng.

Bạn gửi biểu mẫu với 

>>> page = urlopen(url)
53. Lưu ý rằng bạn truyền hai đối số cho phương thức này, 
>>> page = urlopen(url)
54đối tượng và URL của đối tượng 
>>> page = urlopen(url)
55mà bạn truy cập qua 
>>> page = urlopen(url)
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 

>>> page = urlopen(url)
34trang. Nếu có gì đó không ổn, thì giá trị của 
>>> page = urlopen(url)
58nó vẫn sẽ là như vậy 
>>> page = urlopen(url)
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ộ 

>>> page = urlopen(url)
60biến, hãy xem cách lấy URL theo chương trình cho mỗi liên kết trên 
>>> page = urlopen(url)
34trang.

Để thực hiện việc này, bạn sử dụng 

>>> page = urlopen(url)
62lại lần nữa, lần này truyền chuỗi 
>>> url = "http://olympus.realpython.org/profiles/aphrodite"
02để chọn tất cả các 
>>> page = urlopen(url)
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 

>>> url = "http://olympus.realpython.org/profiles/aphrodite"
97thuộc tính:

Văn bản của 

>>> page = urlopen(url)
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 

>>> page = urlopen(url)
78. Mặc dù 
>>> page = urlopen(url)
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ở 

>>> page = urlopen(url)
75trang, quét kết quả và in nó ra bảng điều khiển:

>>> html_bytes = page.read()
>>> html = html_bytes.decode("utf-8")
5

Ví dụ này sử dụng phương thức 

>>> url = "http://olympus.realpython.org/profiles/aphrodite"
65của đối tượng 
>>> page = urlopen(url)
62để tìm phần tử với 
>>> page = urlopen(url)
83. Chuỗi 
>>> page = urlopen(url)
84mà bạn chuyển đến 
>>> page = urlopen(url)
62sử dụng bộ chọn CSS ID 
>>> page = urlopen(url)
86 để chỉ ra rằng đó 
>>> page = urlopen(url)
87là một 
>>> page = urlopen(url)
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 

>>> page = urlopen(url)
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 

>>> page = urlopen(url)
90từ 
>>> page = urlopen(url)
91mô-đun của Python . 
>>> page = urlopen(url)
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 

>>> page = urlopen(url)
90hoạt động:

>>> html_bytes = page.read()
>>> html = html_bytes.decode("utf-8")
6

Khi bạn chạy mã này, bạn sẽ thấy rằng 

>>> page = urlopen(url)
94thông báo không được hiển thị cho đến khi 
>>> page = urlopen(url)
95vài giây trôi qua kể từ khi 
>>> page = urlopen(url)
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ố 

>>> page = urlopen(url)
97cho 
>>> page = urlopen(url)
90. Đây là chương trình được cập nhật:

>>> html_bytes = page.read()
>>> html = html_bytes.decode("utf-8")
7

Khi 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 

>>> page = urlopen(url)
99câu lệnh chỉ chạy 
>>> page
<http.client.HTTPResponse object at 0x105fef820>
00cho ba yêu cầu đầu tiên:

>>> html_bytes = page.read()
>>> html = html_bytes.decode("utf-8")
8

Vớ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ậ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 
    >>> html_bytes = page.read()
    >>> html = html_bytes.decode("utf-8")
    
    9mô-đun tích hợp sẵn của Python
  • 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 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:

  • Beautiful Soup: Xây dựng Web Scraper với Python
  • Tích hợp API bằng Python
  • Python & API: Một kết hợp chiến thắng để đọc dữ liệu công khai