Làm cách nào để đọc một URL trong Python?

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 lĩnh vực, 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ể

  1. 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
  2. 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 có thể là bất hợp pháp 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áo

Xâ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ình

Trong 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, 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

>>>

>>> title_index = html.find[""]
>>> title_index
14
1

Để 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 chuỗi bằng UTF-8

>>>

>>> title_index = html.find[""]
>>> title_index
14
5

Bây giờ bạn có thể in HTML để xem nội dung của trang web

>>>

>>> title_index = html.find[""]
>>> title_index
14
6

Đầ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
7

Vớ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 nhau

Trí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 các phương thức chuỗi. 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ẻ
>>> title_index = html.find[""]
>>> title_index
14
00 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

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

>>> start_index = title_index + len[""]
>>> start_index
21
9 trả về chỉ mục 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
>>> title_index = html.find[""]
>>> title_index
14
00 bằng cách chuyển chuỗi
>>> title_index = html.find[""]
>>> title_index
14
04 tới
>>> 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ẻ

>>> title_index = html.find[""]
>>> title_index
14
00. 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_index
14
04 vào
>>> title_index = html.find[""]
>>> title_index
14
08

>>>

>>> start_index = title_index + len[""]
>>> start_index
21

Bây giờ hãy lấy chỉ mục của thẻ đóng

>>> title_index = html.find[""]
>>> title_index
14
01 bằng cách chuyển chuỗi
>>> title_index = html.find[""]
>>> title_index
14
20 đến
>>> start_index = title_index + len[""]
>>> start_index
21
9

>>>

>>> title_index = html.find[""]
>>> title_index
14
0

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

>>> title_index = html.find[""]
>>> title_index
14
22

>>>

>>> title_index = html.find[""]
>>> title_index
14
2

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"
0

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ư trong ví dụ trước

>>>

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

Rấ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_index = html.find[""]
>>> title_index
14
23 trông tương tự như trang
>>> title_index = html.find[""]
>>> title_index
14
24, nhưng có một sự khác biệt nhỏ. Thẻ mở
>>> title_index = html.find[""]
>>> title_index
14
00 có thêm một khoảng trắng trước dấu ngoặc nhọn đóng [
>>> title_index = html.find[""]
>>> title_index
14
26], hiển thị nó thành
>>> title_index = html.find[""]
>>> title_index
14
27

>>> title_index = html.find[""]
>>> title_index
14
28 trả về
>>> title_index = html.find[""]
>>> title_index
14
29 vì chuỗi con chính xác
>>> title_index = html.find[""]
>>> title_index
14
04 không tồn tại. Khi
>>> title_index = html.find[""]
>>> title_index
14
29 đượ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"
05

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

>>> url = "//olympus.realpython.org/profiles/aphrodite"
05 của chuỗi
>>> title_index = html.find[""]
>>> title_index
14
22 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ẻ
>>> title_index = html.find[""]
>>> title_index
14
01

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

Loại bỏ các quảng cáo

Là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ẩn

Ghi 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"
2

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. Chẳng hạn, ký tự dấu hoa thị [_______515] 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 cần 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"
19

Biể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 của
>>> url = "//olympus.realpython.org/profiles/aphrodite"
23 giữa hai.
>>> url = "//olympus.realpython.org/profiles/aphrodite"
17 trả về 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"
4

Lưu ý rằng nếu không tìm thấy kết quả khớp, thì

>>> url = "//olympus.realpython.org/profiles/aphrodite"
16 sẽ trả về một danh sách trống

Khớ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"
5

Bạ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"
6

Mẫ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—hoặc các chữ cái—ở giữa

>>>

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

Thô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"
8

Có 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.
>>> url = "//olympus.realpython.org/profiles/aphrodite"
43, 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"
44

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

>>> url = "//olympus.realpython.org/profiles/aphrodite"
43 là biểu thức chính quy, tiếp theo là văn bản thay thế, tiếp theo là chuỗi. Đây là một ví dụ

>>>

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

Có 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_index = html.find[""]
>>> title_index
14
26 cuối cùng, kéo dài từ đầu
>>> url = "//olympus.realpython.org/profiles/aphrodite"
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ụng

Ngoà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]
0

Lần này,

>>> url = "//olympus.realpython.org/profiles/aphrodite"
43 tìm thấy hai kết quả phù hợp,
>>> url = "//olympus.realpython.org/profiles/aphrodite"
50 và
>>> url = "//olympus.realpython.org/profiles/aphrodite"
51, đồng thời thay chuỗi
>>> url = "//olympus.realpython.org/profiles/aphrodite"
58 cho cả hai kết quả phù hợp

Loại bỏ các quảng cáo

Trí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]
1

Phươ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]
2

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

  1. >>> url = "//olympus.realpython.org/profiles/aphrodite"
    
    61 khớp với thẻ mở đầu
    >>> url = "//olympus.realpython.org/profiles/aphrodite"
    
    62 trong
    >>> title_index = html.find[""]
    >>> title_index
    14
    
    22. Phần
    >>> url = "//olympus.realpython.org/profiles/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
    >>> title_index = html.find[""]
    >>> title_index
    14
    
    26

  2. >>> url = "//olympus.realpython.org/profiles/aphrodite"
    
    71 không tham lam khớp tất cả văn bản sau phần mở đầu
    >>> url = "//olympus.realpython.org/profiles/aphrodite"
    
    62, dừng ở phần khớp đầu tiên cho
    >>> url = "//olympus.realpython.org/profiles/aphrodite"
    
    73

  3. >>> url = "//olympus.realpython.org/profiles/aphrodite"
    
    73 chỉ khác với mẫu đầu tiên ở việc sử dụng ký tự
    >>> url = "//olympus.realpython.org/profiles/aphrodite"
    
    75, do đó, nó khớp với thẻ đóng
    >>> url = "//olympus.realpython.org/profiles/aphrodite"
    
    76 trong
    >>> title_index = html.find[""]
    >>> title_index
    14
    
    22

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

>>> url = "//olympus.realpython.org/profiles/aphrodite"
78, cũng sử dụng
>>> url = "//olympus.realpython.org/profiles/aphrodite"
71 không tham lam để 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ản

Ghi 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]
3

Sau đó 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]
4

Sau đó 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]
5

Phươ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-8

Bâ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ích

Vò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]
6

Có 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ó

  1. Bạn sử dụng

    >>> url = "//olympus.realpython.org/profiles/aphrodite"
    
    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 là
    >>> url = "//olympus.realpython.org/profiles/aphrodite"
    
    99, sau đó gán chỉ mục cho
    >>> page = urlopen[url]
    
    00

  2. Vì văn bản cần trích xuất bắt đầu ngay sau dấu hai chấm trong

    >>> url = "//olympus.realpython.org/profiles/aphrodite"
    
    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
    >>> page = urlopen[url]
    
    03, rồi gán kết quả cho
    >>> page = urlopen[url]
    
    04

  3. 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 [

    >>> url = "//olympus.realpython.org/profiles/aphrodite"
    
    09] so với
    >>> page = urlopen[url]
    
    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

  4. Bạn trích xuất văn bản bằng cách cắt

    >>> url = "//olympus.realpython.org/profiles/aphrodite"
    
    91 từ
    >>> page = urlopen[url]
    
    04 thành
    >>> page = urlopen[url]
    
    09 và gán chuỗi này cho
    >>> page = urlopen[url]
    
    13

  5. Bạn xóa mọi khoảng trắng ở đầu và cuối của

    >>> page = urlopen[url]
    
    13 bằng cách sử dụng
    >>> page = urlopen[url]
    
    15 và gán kết quả cho
    >>> page = urlopen[url]
    
    16

Khi kết thúc 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]
7

Giả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]
8

Vớ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áo

Tạo đối tượng
>>> page = urlopen[url]
18

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

>>> page = urlopen[url]
9

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

  1. Mở URL

    >>> page = urlopen[url]
    
    19 bằng cách sử dụng
    >>> title_index = html.find[""]
    >>> title_index
    14
    
    8 từ mô-đun
    >>> title_index = html.find[""]
    >>> title_index
    14
    
    7

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

    >>> title_index = html.find[""]
    >>> title_index
    14
    
    22

  3. Tạo một đối tượng

    >>> page = urlopen[url]
    
    18 và gán nó cho biến
    >>> page = urlopen[url]
    
    24

Đố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 Python

Sử dụng đối tượng
>>> page = urlopen[url]
18

Lưu và chạy chương trình trên. Khi 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_index = html.find[""]
>>> title_index
14
22 theo nhiều cách khác nhau

Ghi 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. Một cái gì đó như
>>> page = urlopen[url]
33 trước tiên sẽ chạy chương trình của bạn và sau đó để bạn ở REPL nơi bạn có thể khám phá các đối tượng của mình

Ví 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ẻ HTML

Nhậ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

>>>

>>> title_index = html.find[""]
>>> title_index
14
10

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ự xuống dòng trong văn bản của tài liệu HTML. Bạn có thể xóa chúng bằng phương thức chuỗi

>>> url = "//olympus.realpython.org/profiles/aphrodite"
44 nếu cần

Thô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ường

Tuy 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]
39

Trong 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ể đó

>>>

>>> title_index = html.find[""]
>>> title_index
14
11

Đ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 phiên bản của đối tượng
>>> page = urlopen[url]
42 do Beautiful Soup cung cấp. Các đối tượng
>>> page = urlopen[url]
42 cung cấp một giao diện đơn giản để làm việc với thông tin mà chúng chứa

Bạn có thể khám phá điều này một chút trước tiên bằng cách giải nén các đối tượng

>>> page = urlopen[url]
42 từ danh sách

>>>

>>> title_index = html.find[""]
>>> title_index
14
12

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

>>>

>>> title_index = html.find[""]
>>> title_index
14
13

Bạ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à các khóa trong từ điển

Ví 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 ả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 nêu trên

>>>

>>> title_index = html.find[""]
>>> title_index
14
14

Mộ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ẻ
>>> title_index = html.find[""]
>>> title_index
14
00 trong tài liệu, bạn có thể sử dụng thuộc tính
>>> page = urlopen[url]
57

>>>

>>> title_index = html.find[""]
>>> title_index
14
15

Nế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ẻ

>>> title_index = html.find[""]
>>> title_index
14
00 được viết hoa toàn bộ và có khoảng trắng

Beautiful 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 [

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

>>>

>>> title_index = html.find[""]
>>> title_index
14
16

Mộ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

>>>

>>> title_index = html.find[""]
>>> title_index
14
17

Ví 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ầ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 mà bạn cần. Thư viện lxml hơi khó bắt đầu hơn 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ần

Beautiful 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áo

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. 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]
68

Sử 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 kiế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

>>> title_index = html.find[""]
>>> title_index
14
18

Đả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 đối

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

>>> title_index = html.find[""]
>>> title_index
14
19

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

>>> title_index = html.find[""]
>>> title_index
14
50

Bạ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 đối

Bâ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

>>> title_index = html.find[""]
>>> title_index
14
51

Vớ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

>>> title_index = html.find[""]
>>> title_index
14
52

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

>>> title_index = html.find[""]
>>> title_index
14
53

Bạ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 toàn bộ
>>> page = urlopen[url]
86

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

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

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

>>> title_index = html.find[""]
>>> title_index
14
54

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

Tạo đối tượng
>>> page = urlopen[url]
89

Nhập nội dung sau vào cửa sổ tương tác của IDLE

>>>

>>> title_index = html.find[""]
>>> title_index
14
55

Các đối tượng

>>> page = urlopen[url]
89 đạ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 URL tới phương thức
>>> page = urlopen[url]
91 của chúng

>>>

>>> title_index = html.find[""]
>>> title_index
14
56

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

>>>

>>> title_index = html.find[""]
>>> title_index
14
57

Số

>>> 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. 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ầu

MechanicalSoup 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

>>>

>>> title_index = html.find[""]
>>> title_index
14
58

Bạn có thể xem HTML bằng cách kiểm tra thuộc tính

>>> page = urlopen[url]
99

>>>

>>> title_index = html.find[""]
>>> title_index
14
59

Lưu ý rằng trang này có một

>>> title_index = html.find[""]
>>> title_index
14
102 trên đó với các phần tử
>>> title_index = html.find[""]
>>> title_index
14
103 cho tên người dùng và mật khẩu

Loại bỏ các quảng cáo

Gửi biểu mẫu với MechanicalSoup

Mở trang

>>> title_index = html.find[""]
>>> title_index
14
104 từ ví dụ trước trong trình duyệt và tự xem trang đó trước khi tiếp tục

Hã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]
76

Tên người dùngMật khẩu

>>> title_index = html.find[""]
>>> title_index
14
106
>>> title_index = html.find[""]
>>> title_index
14
107

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 thẻ

>>> title_index = html.find[""]
>>> title_index
14
102.
>>> title_index = html.find[""]
>>> title_index
14
102 trên trang này có thuộc tính
>>> title_index = html.find[""]
>>> title_index
14
110 được đặt thành
>>> title_index = html.find[""]
>>> title_index
14
111. Biểu mẫu này chứa hai phần tử
>>> title_index = html.find[""]
>>> title_index
14
103, một phần tử có tên là
>>> title_index = html.find[""]
>>> title_index
14
113 và phần tử kia có tên là
>>> title_index = html.find[""]
>>> title_index
14
114. Phần tử
>>> title_index = html.find[""]
>>> title_index
14
103 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 đă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

>>> title_index = html.find[""]
>>> title_index
14
60

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

>>>

>>> title_index = html.find[""]
>>> title_index
14
61

Bây giờ chia nhỏ ví dụ trên

  1. Bạn tạo một phiên bản

    >>> page = urlopen[url]
    
    89 và sử dụng nó để yêu cầu URL
    >>> title_index = html.find[""]
    >>> title_index
    14
    
    117. Bạn gán nội dung HTML của trang cho biến
    >>> title_index = html.find[""]
    >>> title_index
    14
    
    118 bằng cách sử dụng thuộc tính
    >>> page = urlopen[url]
    
    99

  2. >>> title_index = html.find[""]
    >>> title_index
    14
    
    120 trả về danh sách tất cả các phần tử
    >>> title_index = html.find[""]
    >>> title_index
    14
    
    102 trên trang. Vì trang chỉ có một phần tử
    >>> title_index = html.find[""]
    >>> title_index
    14
    
    102 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
    >>> title_index = html.find[""]
    >>> title_index
    14
    
    123 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
    >>> title_index = html.find[""]
    >>> title_index
    14
    
    124. 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à
    >>> title_index = html.find[""]
    >>> title_index
    14
    
    125 và
    >>> title_index = html.find[""]
    >>> title_index
    14
    
    126

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

    >>> title_index = html.find[""]
    >>> title_index
    14
    
    127. Lưu ý rằng bạn truyền hai đối số cho phương thức này, đối tượng
    >>> title_index = html.find[""]
    >>> title_index
    14
    
    128 và URL của
    >>> title_index = html.find[""]
    >>> title_index
    14
    
    129 mà bạn truy cập thông qua
    >>> title_index = html.find[""]
    >>> title_index
    14
    
    130

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
>>> title_index = html.find[""]
>>> title_index
14
132 vẫn sẽ là
>>> title_index = html.find[""]
>>> title_index
14
133

Ghi 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

>>> title_index = html.find[""]
>>> title_index
14
134, đã đế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

>>> title_index = html.find[""]
>>> title_index
14
136, 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
>>> title_index = html.find[""]
>>> title_index
14
138 trên trang

>>>

>>> title_index = html.find[""]
>>> title_index
14
62

Bâ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

>>>

>>> title_index = html.find[""]
>>> title_index
14
63

Cá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à

>>> title_index = html.find[""]
>>> title_index
14
141. 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

>>>

>>> title_index = html.find[""]
>>> title_index
14
64

Bạn có thể làm được rất nhiều việc chỉ với

>>> page = urlopen[url]
91,
>>> title_index = html.find[""]
>>> title_index
14
136 và
>>> title_index = html.find[""]
>>> title_index
14
145. Đ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ức

Loại bỏ các quảng cáo

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

>>> title_index = html.find[""]
>>> title_index
14
106] và mật khẩu [
>>> title_index = html.find[""]
>>> title_index
14
107] cho biểu mẫu đăng nhập có tại URL
>>> title_index = html.find[""]
>>> title_index
14
117

Sau 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]
76

Chương trình của bạn sẽ in văn bản

>>> title_index = html.find[""]
>>> title_index
14
150

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

>>> title_index = html.find[""]
>>> title_index
14
151 và tạo đối tượng
>>> title_index = html.find[""]
>>> title_index
14
152

>>> title_index = html.find[""]
>>> title_index
14
65

Trỏ trình duyệt đến trang đăng nhập bằng cách chuyển URL tới

>>> title_index = html.find[""]
>>> title_index
14
153 và lấy HTML có thuộc tính
>>> page = urlopen[url]
99

>>> title_index = html.find[""]
>>> title_index
14
66

>>> title_index = html.find[""]
>>> title_index
14
118 là một phiên bản
>>> page = urlopen[url]
18. Vì trang 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
>>> title_index = html.find[""]
>>> title_index
14
124. Sử dụng
>>> title_index = html.find[""]
>>> title_index
14
136, 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
>>> title_index = html.find[""]
>>> title_index
14
125 và mật khẩu
>>> title_index = html.find[""]
>>> title_index
14
126

>>> title_index = html.find[""]
>>> title_index
14
67

Bây giờ biểu mẫu đã được điền đầy đủ, bạn có thể gửi kèm theo

>>> title_index = html.find[""]
>>> title_index
14
127

>>> title_index = html.find[""]
>>> title_index
14
68

Nếu bạn điền đúng tên người dùng và mật khẩu vào biểu mẫu, thì

>>> title_index = html.find[""]
>>> title_index
14
134 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
>>> title_index = html.find[""]
>>> title_index
14
164

>>> title_index = html.find[""]
>>> title_index
14
69

Bạn sẽ thấy văn bản sau được hiển thị

>>> title_index = html.find[""]
>>> title_index
14
0

Nếu thay vào đó, bạn thấy văn bản

>>> title_index = html.find[""]
>>> title_index
14
165 hoặc nội dung khác, thì việc gửi biểu mẫu không thành công

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

Trong 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]
89

Mở trình duyệt bạn chọn và điều hướng đến URL

>>> title_index = html.find[""]
>>> title_index
14
168

Trang

>>> title_index = html.find[""]
>>> title_index
14
169 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ẻ

>>> title_index = html.find[""]
>>> title_index
14
170 trông như thế này

>>> title_index = html.find[""]
>>> title_index
14
1

Văn bản của thẻ

>>> title_index = html.find[""]
>>> title_index
14
170 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ó

>>> title_index = html.find[""]
>>> title_index
14
172. Mặc dù thuộc tính
>>> title_index = html.find[""]
>>> title_index
14
173 đượ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ông

Bây giờ hãy bắt đầu bằng cách viết một chương trình đơn giản mở trang

>>> title_index = html.find[""]
>>> title_index
14
169, loại bỏ kết quả và in nó ra bàn điều khiển

>>> title_index = html.find[""]
>>> title_index
14
2

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

>>> title_index = html.find[""]
>>> title_index
14
136 của đối tượng
>>> page = urlopen[url]
18 để tìm phần tử có
>>> title_index = html.find[""]
>>> title_index
14
177. Chuỗi
>>> title_index = html.find[""]
>>> title_index
14
178 mà bạn chuyển đến
>>> title_index = html.find[""]
>>> title_index
14
136, sử dụng bộ chọn ID CSS
>>> title_index = html.find[""]
>>> title_index
14
180 để cho biết rằng
>>> title_index = html.find[""]
>>> title_index
14
181 là một giá trị
>>> title_index = html.find[""]
>>> title_index
14
173

Để đị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

>>> title_index = html.find[""]
>>> title_index
14
183 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

>>> title_index = html.find[""]
>>> title_index
14
184 từ mô-đun
>>> title_index = html.find[""]
>>> title_index
14
185 của Python. Phương thức
>>> title_index = html.find[""]
>>> title_index
14
184 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

>>> title_index = html.find[""]
>>> title_index
14
187

>>> title_index = html.find[""]
>>> title_index
14
3

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

>>> title_index = html.find[""]
>>> title_index
14
188 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ụ về cuộn xúc xắc, bạn sẽ cần chuyển số

>>> title_index = html.find[""]
>>> title_index
14
190 đến
>>> title_index = html.find[""]
>>> title_index
14
187. Đây là chương trình cập nhật

>>> title_index = html.find[""]
>>> title_index
14
4

Khi 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

>>> title_index = html.find[""]
>>> title_index
14
192 để chạy
>>> title_index = html.find[""]
>>> title_index
14
193 chỉ cho ba yêu cầu đầu tiên

>>> title_index = html.find[""]
>>> title_index
14
5

Vớ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áo

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 mô-đun
    >>> title_index = html.find[""]
    >>> title_index
    14
    
    6 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 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ề David

Mỗ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 »

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 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ẻ Email

Bà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. Nhận các mẹo để đặt câu hỏi hay 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

Làm cách nào để đọc dữ liệu URL bằng Python?

Cách lấy URL biểu mẫu tệp HTML bằng Python .
Gọi hàm đọc trên biến webURL
Biến đọc cho phép đọc nội dung của tệp dữ liệu
Đọc toàn bộ nội dung của URL vào một biến gọi là dữ liệu
Chạy mã- Nó sẽ in dữ liệu sang định dạng HTML

Làm cách nào để đọc URL từ trình duyệt bằng Python?

Bạn có thể lấy url hiện tại bằng cách thực hiện path_info = request. META. get['PATH_INFO'] http_host = yêu cầu. META .

Làm cách nào để trích xuất URL từ trang web bằng Python?

Để nhận tất cả các liên kết từ một trang web. .
từ bs4 nhập BeautifulSoup
từ urllib. yêu cầu nhập Yêu cầu, urlopen
nhập lại
req = Yêu cầu["http. // dấu gạch chéo. tổ chức"]
súp = BeautifulSoup[html_page, "lxml"]
cho liên kết trong súp. findAll['a']
liên kết. nối thêm [liên kết. lấy ['href']]

Chủ Đề