Chương 12
bài tập 12. 3
""" Exercise 12.3: Use urllub to replicate the previous exercise of [1] retrieving the document from a URL, [2] displaying up to 3000 characters, and [3] counting the overall characters in the document. Don't worry about the headers for this exercise, simply show the first 3000 characters of the document contents. Python for Everybody: Exploring Data Using Python 3 by Charles R. Severance Solution by Jamison Lahman, June 4, 2017 """ import urllib.request import urllib.parse import urllib.error fhand = urllib.request.urlopen['//data.pr4e.org/romeo.txt'] characters = 0 for line in fhand: # \n is considered a character # Amend to line.decode[].rstrip[] if needed words = line.decode[] characters = characters + len[words] if characters < 3000: print[line.decode[].strip[]] print[characters]
bài tập 12. 4
""" Exercise 12.4: Change the urllinks.py program to extract and count paragraph [p] tags from the retrieved HTML document and display the count of the paragraphs as the output of your program. Do not display the paragraph text, only count them. Test your program on several small pages as well as some larger web pages. Python for Everybody: Exploring Data Using Python 3 by Charles R. Severance Solution by Jamison Lahman, June 4, 2017 """ import urllib.request import urllib.parse import urllib.error import ssl from bs4 import BeautifulSoup count = 0 # Initialize variables # Ignore SSL certificate errors ctx = ssl.create_default_context[] ctx.check_hostname = False ctx.verify_mode = ssl.CERT_NONE url = input['Enter - '] html = urllib.request.urlopen[url, context=ctx].read[] soup = BeautifulSoup[html, 'html.parser'] # Retrieve all of the anchor tags tags = soup['p'] for tag in tags: count += 1 # Counter print[count]
bài tập 12. 5
""" Exercise 12.5: [Advanced] Change the socket program so that it only shows data after the headers and a blank line have been received. Remember that recv is receiving characters [newlines and all], not lines. Python for Everybody: Exploring Data Using Python 3 by Charles R. Severance Solution by Jamison Lahman, June 5, 2017 """ import socket import re my_sock = socket.socket[socket.AF_INET, socket.SOCK_STREAM] my_sock.connect[['data.pr4e.org', 80]] cmd = 'GET //data.pr4e.org/romeo.txt HTTP/1.0\n\n'.encode[] my_sock.send[cmd] data = my_sock.recv[512] message = data.decode[] header_end_pos = message.find['\r\n\r\n'] + 4 # Finds the end of header # Adds four to exclude:'\r\n\r\n' print[message[header_end_pos:]] while True: # Header in the first data only data = my_sock.recv[512] if not data: break print[data.decode[]] my_sock.close[]
Mặc dù nhiều ví dụ trong cuốn sách này tập trung vào việc đọc tệp và tìm kiếm dữ liệu trong các tệp đó, nhưng có nhiều nguồn khác nhau
thông tin khi xem xét Internet
Trong chương này, chúng ta sẽ giả vờ là một trình duyệt web và truy xuất các trang web bằng Giao thức truyền tải siêu văn bản [HTTP]. Sau đó, chúng tôi sẽ đọc qua dữ liệu trang web và phân tích cú pháp
Giao thức mạng cung cấp năng lượng cho web thực sự khá đơn giản và có hỗ trợ tích hợp sẵn trong Python có tên là
$ python urljpeg.py
2920 2920
1460 4380
1460 5840
1460 7300
...
1460 62780
1460 64240
2920 67160
1460 68620
1681 70301
Header length 240
HTTP/1.1 200 OK
Date: Sat, 02 Nov 2013 02:15:07 GMT
Server: Apache
Last-Modified: Sat, 02 Nov 2013 02:01:26 GMT
ETag: "19c141-111a9-4ea280f8354b8"
Accept-Ranges: bytes
Content-Length: 70057
Connection: close
Content-Type: image/jpeg
3 giúp dễ dàng tạo kết nối mạng và truy xuất dữ liệu qua các ổ cắm đó trong chương trình PythonMột ổ cắm giống như một tệp, ngoại trừ một ổ cắm duy nhất cung cấp kết nối hai chiều giữa hai chương trình. Bạn có thể vừa đọc vừa ghi vào cùng một ổ cắm. Nếu bạn viết một cái gì đó vào một ổ cắm, nó sẽ được gửi đến ứng dụng ở đầu kia của ổ cắm. Nếu bạn đọc từ ổ cắm, bạn sẽ được cung cấp dữ liệu mà ứng dụng khác đã gửi
Nhưng nếu bạn cố đọc một ổ cắm khi chương trình ở đầu bên kia của ổ cắm chưa gửi bất kỳ dữ liệu nào, bạn chỉ cần ngồi đợi. Nếu các chương trình ở cả hai đầu của ổ cắm chỉ đợi một số dữ liệu mà không gửi bất cứ thứ gì, thì chúng sẽ đợi rất lâu
Vì vậy, một phần quan trọng của các chương trình giao tiếp qua Internet là có một số loại giao thức. Một giao thức là một tập hợp các quy tắc chính xác xác định ai sẽ đi trước, họ phải làm gì và sau đó là phản hồi nào đối với thông báo đó và ai sẽ gửi tiếp theo, v.v. Theo một nghĩa nào đó, hai ứng dụng ở hai đầu của ổ cắm đang thực hiện một điệu nhảy và đảm bảo không giẫm lên chân nhau
Có nhiều tài liệu mô tả các giao thức mạng này. Giao thức truyền tải siêu văn bản được mô tả trong tài liệu sau
http. //www. w3. org/Giao thức/rfc2616/rfc2616. txt
Đây là một tài liệu dài và phức tạp dài 176 trang với rất nhiều chi tiết. Nếu thấy hay thì cứ thoải mái đọc hết. Nhưng nếu bạn xem qua trang 36 của RFC2616, bạn sẽ tìm thấy cú pháp cho yêu cầu GET. Để yêu cầu tài liệu từ máy chủ web, chúng tôi tạo kết nối với máy chủ
$ python urljpeg.py
2920 2920
1460 4380
1460 5840
1460 7300
...
1460 62780
1460 64240
2920 67160
1460 68620
1681 70301
Header length 240
HTTP/1.1 200 OK
Date: Sat, 02 Nov 2013 02:15:07 GMT
Server: Apache
Last-Modified: Sat, 02 Nov 2013 02:01:26 GMT
ETag: "19c141-111a9-4ea280f8354b8"
Accept-Ranges: bytes
Content-Length: 70057
Connection: close
Content-Type: image/jpeg
4 trên cổng 80, sau đó gửi một dòng có dạng$ python urljpeg.py
2920 2920
1460 4380
1460 5840
1460 7300
...
1460 62780
1460 64240
2920 67160
1460 68620
1681 70301
Header length 240
HTTP/1.1 200 OK
Date: Sat, 02 Nov 2013 02:15:07 GMT
Server: Apache
Last-Modified: Sat, 02 Nov 2013 02:01:26 GMT
ETag: "19c141-111a9-4ea280f8354b8"
Accept-Ranges: bytes
Content-Length: 70057
Connection: close
Content-Type: image/jpeg
5trong đó tham số thứ hai là trang web chúng tôi đang yêu cầu và sau đó chúng tôi cũng gửi một dòng trống. Máy chủ web sẽ phản hồi với một số thông tin tiêu đề về tài liệu và một dòng trống theo sau là nội dung tài liệu
Có lẽ cách dễ nhất để chỉ ra cách thức hoạt động của giao thức HTTP là viết một chương trình Python rất đơn giản để tạo kết nối với máy chủ web và tuân theo các quy tắc của giao thức HTTP để yêu cầu một tài liệu và hiển thị những gì máy chủ gửi lại
Đầu tiên chương trình tạo kết nối đến cổng 80 trên máy chủ www. py4e. com. Vì chương trình của chúng tôi đang đóng vai trò của "trình duyệt web", giao thức HTTP cho biết chúng tôi phải gửi lệnh GET theo sau là một dòng trống
Kết nối ổ cắm
Khi chúng tôi gửi dòng trống đó, chúng tôi viết một vòng lặp nhận dữ liệu trong các khối 512 ký tự từ ổ cắm và in dữ liệu ra cho đến khi không còn dữ liệu để đọc [i. e. , recv[] trả về một chuỗi rỗng]
Chương trình tạo ra đầu ra sau
HTTP/1.1 200 OK
Date: Sun, 14 Mar 2010 23:52:41 GMT
Server: Apache
Last-Modified: Tue, 29 Dec 2009 01:31:22 GMT
ETag: "143c1b33-a7-4b395bea"
Accept-Ranges: bytes
Content-Length: 167
Connection: close
Content-Type: text/plain
But soft what light through yonder window breaks
It is the east and Juliet is the sun
Arise fair sun and kill the envious moon
Who is already sick and pale with grief
Đầu ra bắt đầu với các tiêu đề mà máy chủ web gửi để mô tả tài liệu. Ví dụ: tiêu đề
$ python urljpeg.py
2920 2920
1460 4380
1460 5840
1460 7300
...
1460 62780
1460 64240
2920 67160
1460 68620
1681 70301
Header length 240
HTTP/1.1 200 OK
Date: Sat, 02 Nov 2013 02:15:07 GMT
Server: Apache
Last-Modified: Sat, 02 Nov 2013 02:01:26 GMT
ETag: "19c141-111a9-4ea280f8354b8"
Accept-Ranges: bytes
Content-Length: 70057
Connection: close
Content-Type: image/jpeg
6 chỉ ra rằng tài liệu là tài liệu văn bản thuần túy [$ python urljpeg.py
2920 2920
1460 4380
1460 5840
1460 7300
...
1460 62780
1460 64240
2920 67160
1460 68620
1681 70301
Header length 240
HTTP/1.1 200 OK
Date: Sat, 02 Nov 2013 02:15:07 GMT
Server: Apache
Last-Modified: Sat, 02 Nov 2013 02:01:26 GMT
ETag: "19c141-111a9-4ea280f8354b8"
Accept-Ranges: bytes
Content-Length: 70057
Connection: close
Content-Type: image/jpeg
7]Sau khi máy chủ gửi cho chúng tôi các tiêu đề, nó sẽ thêm một dòng trống để cho biết phần cuối của các tiêu đề, sau đó gửi dữ liệu thực của tệp
$ python urljpeg.py
2920 2920
1460 4380
1460 5840
1460 7300
...
1460 62780
1460 64240
2920 67160
1460 68620
1681 70301
Header length 240
HTTP/1.1 200 OK
Date: Sat, 02 Nov 2013 02:15:07 GMT
Server: Apache
Last-Modified: Sat, 02 Nov 2013 02:01:26 GMT
ETag: "19c141-111a9-4ea280f8354b8"
Accept-Ranges: bytes
Content-Length: 70057
Connection: close
Content-Type: image/jpeg
8Ví dụ này cho thấy cách tạo kết nối mạng cấp thấp với ổ cắm. Ổ cắm có thể được sử dụng để giao tiếp với máy chủ web hoặc với máy chủ thư hoặc nhiều loại máy chủ khác. Tất cả những gì cần thiết là tìm tài liệu mô tả giao thức và viết mã để gửi và nhận dữ liệu theo giao thức
Tuy nhiên, vì giao thức mà chúng ta sử dụng phổ biến nhất là giao thức web HTTP, nên Python có một thư viện đặc biệt được thiết kế riêng để hỗ trợ giao thức HTTP để truy xuất tài liệu và dữ liệu trên web.
Trong ví dụ trên, chúng tôi đã truy xuất một tệp văn bản thuần túy có các dòng mới trong tệp và chúng tôi chỉ cần sao chép dữ liệu vào màn hình khi chương trình chạy. Chúng ta có thể sử dụng một chương trình tương tự để lấy một hình ảnh qua HTTP. Thay vì sao chép dữ liệu ra màn hình khi chương trình chạy, chúng tôi tích lũy dữ liệu thành một chuỗi, cắt bỏ các tiêu đề và sau đó lưu dữ liệu hình ảnh vào một tệp như sau
Khi chương trình chạy nó cho kết quả như sau
$ python urljpeg.py
2920 2920
1460 4380
1460 5840
1460 7300
...
1460 62780
1460 64240
2920 67160
1460 68620
1681 70301
Header length 240
HTTP/1.1 200 OK
Date: Sat, 02 Nov 2013 02:15:07 GMT
Server: Apache
Last-Modified: Sat, 02 Nov 2013 02:01:26 GMT
ETag: "19c141-111a9-4ea280f8354b8"
Accept-Ranges: bytes
Content-Length: 70057
Connection: close
Content-Type: image/jpeg
Bạn có thể thấy rằng đối với url này, tiêu đề
$ python urljpeg.py
2920 2920
1460 4380
1460 5840
1460 7300
...
1460 62780
1460 64240
2920 67160
1460 68620
1681 70301
Header length 240
HTTP/1.1 200 OK
Date: Sat, 02 Nov 2013 02:15:07 GMT
Server: Apache
Last-Modified: Sat, 02 Nov 2013 02:01:26 GMT
ETag: "19c141-111a9-4ea280f8354b8"
Accept-Ranges: bytes
Content-Length: 70057
Connection: close
Content-Type: image/jpeg
6 chỉ ra rằng nội dung của tài liệu là một hình ảnh [$ python urljpeg.py
1460 1460
5120 6580
5120 11700
...
5120 62900
5120 68020
2281 70301
Header length 240
HTTP/1.1 200 OK
Date: Sat, 02 Nov 2013 02:22:04 GMT
Server: Apache
Last-Modified: Sat, 02 Nov 2013 02:01:26 GMT
ETag: "19c141-111a9-4ea280f8354b8"
Accept-Ranges: bytes
Content-Length: 70057
Connection: close
Content-Type: image/jpeg
0]. Sau khi chương trình hoàn tất, bạn có thể xem dữ liệu hình ảnh bằng cách mở tệp $ python urljpeg.py
1460 1460
5120 6580
5120 11700
...
5120 62900
5120 68020
2281 70301
Header length 240
HTTP/1.1 200 OK
Date: Sat, 02 Nov 2013 02:22:04 GMT
Server: Apache
Last-Modified: Sat, 02 Nov 2013 02:01:26 GMT
ETag: "19c141-111a9-4ea280f8354b8"
Accept-Ranges: bytes
Content-Length: 70057
Connection: close
Content-Type: image/jpeg
1 trong trình xem ảnhKhi chương trình chạy, bạn có thể thấy rằng chúng tôi không nhận được 5120 ký tự mỗi khi chúng tôi gọi phương thức
$ python urljpeg.py
1460 1460
5120 6580
5120 11700
...
5120 62900
5120 68020
2281 70301
Header length 240
HTTP/1.1 200 OK
Date: Sat, 02 Nov 2013 02:22:04 GMT
Server: Apache
Last-Modified: Sat, 02 Nov 2013 02:01:26 GMT
ETag: "19c141-111a9-4ea280f8354b8"
Accept-Ranges: bytes
Content-Length: 70057
Connection: close
Content-Type: image/jpeg
2. Chúng tôi nhận được số lượng ký tự đã được máy chủ web chuyển qua mạng cho chúng tôi tại thời điểm chúng tôi gọi là $ python urljpeg.py
1460 1460
5120 6580
5120 11700
...
5120 62900
5120 68020
2281 70301
Header length 240
HTTP/1.1 200 OK
Date: Sat, 02 Nov 2013 02:22:04 GMT
Server: Apache
Last-Modified: Sat, 02 Nov 2013 02:01:26 GMT
ETag: "19c141-111a9-4ea280f8354b8"
Accept-Ranges: bytes
Content-Length: 70057
Connection: close
Content-Type: image/jpeg
2. Trong ví dụ này, chúng tôi nhận được 1460 hoặc 2920 ký tự mỗi khi chúng tôi yêu cầu tối đa 5120 ký tự dữ liệuKết quả của bạn có thể khác tùy thuộc vào tốc độ mạng của bạn. Cũng lưu ý rằng trong lần gọi cuối cùng tới
$ python urljpeg.py
1460 1460
5120 6580
5120 11700
...
5120 62900
5120 68020
2281 70301
Header length 240
HTTP/1.1 200 OK
Date: Sat, 02 Nov 2013 02:22:04 GMT
Server: Apache
Last-Modified: Sat, 02 Nov 2013 02:01:26 GMT
ETag: "19c141-111a9-4ea280f8354b8"
Accept-Ranges: bytes
Content-Length: 70057
Connection: close
Content-Type: image/jpeg
2, chúng tôi nhận được 1681 byte, là phần cuối của luồng và trong lần gọi tiếp theo tới $ python urljpeg.py
1460 1460
5120 6580
5120 11700
...
5120 62900
5120 68020
2281 70301
Header length 240
HTTP/1.1 200 OK
Date: Sat, 02 Nov 2013 02:22:04 GMT
Server: Apache
Last-Modified: Sat, 02 Nov 2013 02:01:26 GMT
ETag: "19c141-111a9-4ea280f8354b8"
Accept-Ranges: bytes
Content-Length: 70057
Connection: close
Content-Type: image/jpeg
2, chúng tôi nhận được một chuỗi có độ dài bằng 0 cho chúng tôi biết rằng máy chủ đã gọi $ python urljpeg.py
1460 1460
5120 6580
5120 11700
...
5120 62900
5120 68020
2281 70301
Header length 240
HTTP/1.1 200 OK
Date: Sat, 02 Nov 2013 02:22:04 GMT
Server: Apache
Last-Modified: Sat, 02 Nov 2013 02:01:26 GMT
ETag: "19c141-111a9-4ea280f8354b8"
Accept-Ranges: bytes
Content-Length: 70057
Connection: close
Content-Type: image/jpeg
6 ở phần cuối của nó Chúng tôi có thể làm chậm các cuộc gọi
$ python urljpeg.py
1460 1460
5120 6580
5120 11700
...
5120 62900
5120 68020
2281 70301
Header length 240
HTTP/1.1 200 OK
Date: Sat, 02 Nov 2013 02:22:04 GMT
Server: Apache
Last-Modified: Sat, 02 Nov 2013 02:01:26 GMT
ETag: "19c141-111a9-4ea280f8354b8"
Accept-Ranges: bytes
Content-Length: 70057
Connection: close
Content-Type: image/jpeg
2 liên tiếp của mình bằng cách bỏ ghi chú cuộc gọi tới $ python urljpeg.py
1460 1460
5120 6580
5120 11700
...
5120 62900
5120 68020
2281 70301
Header length 240
HTTP/1.1 200 OK
Date: Sat, 02 Nov 2013 02:22:04 GMT
Server: Apache
Last-Modified: Sat, 02 Nov 2013 02:01:26 GMT
ETag: "19c141-111a9-4ea280f8354b8"
Accept-Ranges: bytes
Content-Length: 70057
Connection: close
Content-Type: image/jpeg
8. Bằng cách này, chúng tôi đợi một phần tư giây sau mỗi cuộc gọi để máy chủ có thể "đi trước" chúng tôi và gửi thêm dữ liệu cho chúng tôi trước khi chúng tôi gọi lại $ python urljpeg.py
1460 1460
5120 6580
5120 11700
...
5120 62900
5120 68020
2281 70301
Header length 240
HTTP/1.1 200 OK
Date: Sat, 02 Nov 2013 02:22:04 GMT
Server: Apache
Last-Modified: Sat, 02 Nov 2013 02:01:26 GMT
ETag: "19c141-111a9-4ea280f8354b8"
Accept-Ranges: bytes
Content-Length: 70057
Connection: close
Content-Type: image/jpeg
2. Với độ trễ, tại chỗ chương trình thực hiện như sau$ python urljpeg.py
1460 1460
5120 6580
5120 11700
...
5120 62900
5120 68020
2281 70301
Header length 240
HTTP/1.1 200 OK
Date: Sat, 02 Nov 2013 02:22:04 GMT
Server: Apache
Last-Modified: Sat, 02 Nov 2013 02:01:26 GMT
ETag: "19c141-111a9-4ea280f8354b8"
Accept-Ranges: bytes
Content-Length: 70057
Connection: close
Content-Type: image/jpeg
Bây giờ ngoài các cuộc gọi đầu tiên và cuối cùng tới
$ python urljpeg.py
1460 1460
5120 6580
5120 11700
...
5120 62900
5120 68020
2281 70301
Header length 240
HTTP/1.1 200 OK
Date: Sat, 02 Nov 2013 02:22:04 GMT
Server: Apache
Last-Modified: Sat, 02 Nov 2013 02:01:26 GMT
ETag: "19c141-111a9-4ea280f8354b8"
Accept-Ranges: bytes
Content-Length: 70057
Connection: close
Content-Type: image/jpeg
2, giờ đây chúng tôi nhận được 5120 ký tự mỗi khi chúng tôi yêu cầu dữ liệu mớiCó một vùng đệm giữa máy chủ thực hiện yêu cầu
But soft what light through yonder window breaks
It is the east and Juliet is the sun
Arise fair sun and kill the envious moon
Who is already sick and pale with grief
1 và ứng dụng của chúng tôi thực hiện yêu cầu $ python urljpeg.py
1460 1460
5120 6580
5120 11700
...
5120 62900
5120 68020
2281 70301
Header length 240
HTTP/1.1 200 OK
Date: Sat, 02 Nov 2013 02:22:04 GMT
Server: Apache
Last-Modified: Sat, 02 Nov 2013 02:01:26 GMT
ETag: "19c141-111a9-4ea280f8354b8"
Accept-Ranges: bytes
Content-Length: 70057
Connection: close
Content-Type: image/jpeg
2. Khi chúng tôi chạy chương trình với độ trễ tại chỗ, tại một số điểm, máy chủ có thể lấp đầy bộ đệm trong ổ cắm và buộc phải tạm dừng cho đến khi chương trình của chúng tôi bắt đầu làm trống bộ đệm. Việc tạm dừng ứng dụng gửi hoặc ứng dụng nhận được gọi là "điều khiển luồng"Mặc dù chúng ta có thể gửi và nhận dữ liệu qua HTTP theo cách thủ công bằng thư viện socket, nhưng có một cách đơn giản hơn nhiều để thực hiện tác vụ thông thường này trong Python bằng cách sử dụng thư viện
But soft what light through yonder window breaks
It is the east and Juliet is the sun
Arise fair sun and kill the envious moon
Who is already sick and pale with grief
3Sử dụng
But soft what light through yonder window breaks
It is the east and Juliet is the sun
Arise fair sun and kill the envious moon
Who is already sick and pale with grief
3, bạn có thể coi một trang web giống như một tệp. Bạn chỉ cần cho biết trang web nào bạn muốn truy xuất và But soft what light through yonder window breaks
It is the east and Juliet is the sun
Arise fair sun and kill the envious moon
Who is already sick and pale with grief
3 xử lý tất cả các chi tiết tiêu đề và giao thức HTTPMã tương đương để đọc tệp
$ python urljpeg.py
2920 2920
1460 4380
1460 5840
1460 7300
...
1460 62780
1460 64240
2920 67160
1460 68620
1681 70301
Header length 240
HTTP/1.1 200 OK
Date: Sat, 02 Nov 2013 02:15:07 GMT
Server: Apache
Last-Modified: Sat, 02 Nov 2013 02:01:26 GMT
ETag: "19c141-111a9-4ea280f8354b8"
Accept-Ranges: bytes
Content-Length: 70057
Connection: close
Content-Type: image/jpeg
8 từ web bằng cách sử dụng But soft what light through yonder window breaks
It is the east and Juliet is the sun
Arise fair sun and kill the envious moon
Who is already sick and pale with grief
3 như sauKhi trang web đã được mở bằng
But soft what light through yonder window breaks
It is the east and Juliet is the sun
Arise fair sun and kill the envious moon
Who is already sick and pale with grief
8, chúng ta có thể coi nó như một tệp và đọc qua nó bằng vòng lặp But soft what light through yonder window breaks
It is the east and Juliet is the sun
Arise fair sun and kill the envious moon
Who is already sick and pale with grief
9Khi chương trình chạy ta chỉ thấy kết xuất ra nội dung của file. Các tiêu đề vẫn được gửi, nhưng mã
But soft what light through yonder window breaks
It is the east and Juliet is the sun
Arise fair sun and kill the envious moon
Who is already sick and pale with grief
3 tiêu thụ các tiêu đề và chỉ trả lại dữ liệu cho chúng tôiBut soft what light through yonder window breaks
It is the east and Juliet is the sun
Arise fair sun and kill the envious moon
Who is already sick and pale with grief
Ví dụ, chúng ta có thể viết một chương trình để truy xuất dữ liệu cho
$ python urljpeg.py
2920 2920
1460 4380
1460 5840
1460 7300
...
1460 62780
1460 64240
2920 67160
1460 68620
1681 70301
Header length 240
HTTP/1.1 200 OK
Date: Sat, 02 Nov 2013 02:15:07 GMT
Server: Apache
Last-Modified: Sat, 02 Nov 2013 02:01:26 GMT
ETag: "19c141-111a9-4ea280f8354b8"
Accept-Ranges: bytes
Content-Length: 70057
Connection: close
Content-Type: image/jpeg
8 và tính toán tần suất xuất hiện của mỗi từ trong tệp như sauMột lần nữa, khi chúng tôi đã mở trang web, chúng tôi có thể đọc nó như một tệp cục bộ
Một trong những cách sử dụng phổ biến của khả năng
But soft what light through yonder window breaks
It is the east and Juliet is the sun
Arise fair sun and kill the envious moon
Who is already sick and pale with grief
3 trong Python là cạo trang web. Quét web là khi chúng ta viết một chương trình giả làm trình duyệt web và truy xuất các trang, sau đó kiểm tra dữ liệu trong các trang đó để tìm kiếm các mẫuVí dụ: một công cụ tìm kiếm như Google sẽ xem xét nguồn của một trang web và trích xuất các liên kết đến các trang khác và truy xuất các trang đó, trích xuất các liên kết, v.v. Sử dụng kỹ thuật này, Google tìm đường đi qua gần như tất cả các trang trên web
Google cũng sử dụng tần suất của các liên kết từ các trang mà Google tìm thấy đến một trang cụ thể làm thước đo mức độ "quan trọng" của một trang và mức độ xuất hiện của trang đó trong kết quả tìm kiếm của Google.
Một cách đơn giản để phân tích cú pháp HTML là sử dụng các biểu thức chính quy để liên tục tìm kiếm và trích xuất các chuỗi con khớp với một mẫu cụ thể
Đây là một trang web đơn giản
The First Page
If you like, you can switch to the
Second Page.
Chúng ta có thể xây dựng một biểu thức chính quy được định dạng tốt để khớp và trích xuất các giá trị liên kết từ văn bản trên như sau
href="//.+?"
Biểu thức chính quy của chúng tôi tìm kiếm các chuỗi bắt đầu bằng "href="http. //", theo sau là một hoặc nhiều ký tự [". +?"], theo sau là một trích dẫn kép khác. Dấu chấm hỏi được thêm vào ". +?" biểu thị rằng trận đấu sẽ được thực hiện theo kiểu "không tham lam" thay vì kiểu "tham lam". Đối sánh không tham lam cố gắng tìm chuỗi khớp nhỏ nhất có thể và đối sánh tham lam cố gắng tìm chuỗi khớp lớn nhất có thể
Chúng tôi thêm dấu ngoặc đơn vào biểu thức chính quy của mình để cho biết phần nào của chuỗi phù hợp mà chúng tôi muốn trích xuất và tạo chương trình sau
Phương thức biểu thức chính quy
The First Page
If you like, you can switch to the
Second Page.
3 sẽ cung cấp cho chúng ta danh sách tất cả các chuỗi khớp với biểu thức chính quy của chúng ta, chỉ trả về văn bản liên kết giữa các dấu ngoặc képKhi chúng tôi chạy chương trình, chúng tôi nhận được đầu ra sau
python urlregex.py
Enter - //www.dr-chuck.com/page1.htm
//www.dr-chuck.com/page2.htm
python urlregex.py
Enter - //www.py4e.com/book.htm
//www.greenteapress.com/thinkpython/thinkpython.html
//allendowney.com/
//www.py4e.com/code
//www.lib.umich.edu/espresso-book-machine
//www.py4e.com/py4inf-slides.zip
Biểu thức chính quy hoạt động rất tốt khi HTML của bạn được định dạng tốt và có thể dự đoán được. Nhưng vì có rất nhiều trang HTML "bị hỏng", một giải pháp chỉ sử dụng các biểu thức chính quy có thể bỏ lỡ một số liên kết hợp lệ hoặc kết thúc bằng dữ liệu xấu
Điều này có thể được giải quyết bằng cách sử dụng thư viện phân tích cú pháp HTML mạnh mẽ
Có một số thư viện Python có thể giúp bạn phân tích cú pháp HTML và trích xuất dữ liệu từ các trang. Mỗi thư viện đều có điểm mạnh và điểm yếu và bạn có thể chọn một thư viện dựa trên nhu cầu của mình
Ví dụ: chúng tôi sẽ chỉ phân tích một số đầu vào HTML và trích xuất các liên kết bằng thư viện BeautifulSoup. Bạn có thể tải xuống và cài đặt mã BeautifulSoup từ
http. //www. vụn vặt. com/phần mềm/
Bạn có thể tải xuống và "cài đặt" BeautifulSoup hoặc bạn chỉ cần đặt tệp
The First Page
If you like, you can switch to the
Second Page.
4 vào cùng thư mục với ứng dụng của mìnhMặc dù HTML trông giống như XMLi và một số trang được xây dựng cẩn thận để trở thành XML, nhưng hầu hết HTML thường bị hỏng theo cách khiến trình phân tích cú pháp XML từ chối toàn bộ trang HTML do được định dạng không đúng. BeautifulSoup chấp nhận HTML có nhiều lỗi và vẫn cho phép bạn dễ dàng trích xuất dữ liệu bạn cần
Chúng tôi sẽ sử dụng
But soft what light through yonder window breaks
It is the east and Juliet is the sun
Arise fair sun and kill the envious moon
Who is already sick and pale with grief
3 để đọc trang và sau đó sử dụng The First Page
If you like, you can switch to the
Second Page.
6 để trích xuất các thuộc tính The First Page
If you like, you can switch to the
Second Page.
7 từ các thẻ neo [The First Page
If you like, you can switch to the
Second Page.
8]Chương trình nhắc nhập địa chỉ web, sau đó mở trang web, đọc dữ liệu và chuyển dữ liệu đến trình phân tích cú pháp BeautifulSoup, sau đó truy xuất tất cả các thẻ neo và in ra thuộc tính
The First Page
If you like, you can switch to the
Second Page.
7 cho mỗi thẻKhi chạy chương trình có dạng như sau
python urllinks.py
Enter - //www.dr-chuck.com/page1.htm
//www.dr-chuck.com/page2.htm
python urllinks.py
Enter - //www.py4e.com/book.htm
//www.greenteapress.com/thinkpython/thinkpython.html
//allendowney.com/
//www.si502.com/
//www.lib.umich.edu/espresso-book-machine
//www.py4e.com/code
//www.py4e.com/
Bạn có thể sử dụng BeautifulSoup để rút ra các phần khác nhau của mỗi thẻ như sau
$ python urljpeg.py
2920 2920
1460 4380
1460 5840
1460 7300
...
1460 62780
1460 64240
2920 67160
1460 68620
1681 70301
Header length 240
HTTP/1.1 200 OK
Date: Sat, 02 Nov 2013 02:15:07 GMT
Server: Apache
Last-Modified: Sat, 02 Nov 2013 02:01:26 GMT
ETag: "19c141-111a9-4ea280f8354b8"
Accept-Ranges: bytes
Content-Length: 70057
Connection: close
Content-Type: image/jpeg
0Những ví dụ này chỉ bắt đầu cho thấy sức mạnh của BeautifulSoup khi phân tích cú pháp HTML
Đôi khi bạn muốn truy xuất tệp không phải văn bản [hoặc tệp nhị phân], chẳng hạn như tệp hình ảnh hoặc video. Dữ liệu trong các tệp này thường không hữu ích để in ra, nhưng bạn có thể dễ dàng tạo một bản sao URL tới tệp cục bộ trên đĩa cứng của mình bằng cách sử dụng
But soft what light through yonder window breaks
It is the east and Juliet is the sun
Arise fair sun and kill the envious moon
Who is already sick and pale with grief
3Mẫu là mở URL và sử dụng
href="//.+?"
1 để tải xuống toàn bộ nội dung của tài liệu thành một biến chuỗi [href="//.+?"
2] sau đó ghi thông tin đó vào một tệp cục bộ như sauChương trình này đọc tất cả dữ liệu cùng một lúc qua mạng và lưu trữ nó trong biến
href="//.+?"
2 trong bộ nhớ chính của máy tính của bạn, sau đó mở tệp href="//.+?"
4 và ghi dữ liệu ra đĩa của bạn. Điều này sẽ hoạt động nếu kích thước của tệp nhỏ hơn kích thước bộ nhớ của máy tính của bạnTuy nhiên, nếu đây là tệp âm thanh hoặc video lớn, chương trình này có thể gặp sự cố hoặc ít nhất là chạy rất chậm khi máy tính của bạn hết bộ nhớ. Để tránh hết bộ nhớ, chúng tôi truy xuất dữ liệu theo khối [hoặc bộ đệm] rồi ghi từng khối vào đĩa của bạn trước khi truy xuất khối tiếp theo. Bằng cách này, chương trình có thể đọc bất kỳ tệp có kích thước nào mà không sử dụng hết bộ nhớ bạn có trong máy tính của mình
Trong ví dụ này, chúng tôi chỉ đọc 100.000 ký tự mỗi lần và sau đó ghi các ký tự đó vào tệp
href="//.+?"
4 trước khi truy xuất 100.000 ký tự dữ liệu tiếp theo từ trang webChương trình này chạy như sau
$ python urljpeg.py
2920 2920
1460 4380
1460 5840
1460 7300
...
1460 62780
1460 64240
2920 67160
1460 68620
1681 70301
Header length 240
HTTP/1.1 200 OK
Date: Sat, 02 Nov 2013 02:15:07 GMT
Server: Apache
Last-Modified: Sat, 02 Nov 2013 02:01:26 GMT
ETag: "19c141-111a9-4ea280f8354b8"
Accept-Ranges: bytes
Content-Length: 70057
Connection: close
Content-Type: image/jpeg
1Nếu bạn có máy tính Unix hoặc Macintosh, có thể bạn có một lệnh được tích hợp sẵn trong hệ điều hành của mình để thực hiện thao tác này như sau
$ python urljpeg.py
2920 2920
1460 4380
1460 5840
1460 7300
...
1460 62780
1460 64240
2920 67160
1460 68620
1681 70301
Header length 240
HTTP/1.1 200 OK
Date: Sat, 02 Nov 2013 02:15:07 GMT
Server: Apache
Last-Modified: Sat, 02 Nov 2013 02:01:26 GMT
ETag: "19c141-111a9-4ea280f8354b8"
Accept-Ranges: bytes
Content-Length: 70057
Connection: close
Content-Type: image/jpeg
2Lệnh
href="//.+?"
6 là viết tắt của "sao chép URL" và vì vậy hai ví dụ này được đặt tên khéo léo là href="//.+?"
7 và href="//.+?"
8 trên www. py4e. com/code3 khi chúng triển khai chức năng tương tự như lệnh href="//.+?"
6. Ngoài ra còn có một chương trình mẫu python urlregex.py
Enter - //www.dr-chuck.com/page1.htm
//www.dr-chuck.com/page2.htm
0 thực hiện nhiệm vụ này hiệu quả hơn một chút, trong trường hợp bạn thực sự muốn sử dụng mẫu này trong chương trình mà bạn đang viếtBeautifulSoupMột thư viện Python để phân tích cú pháp các tài liệu HTML và trích xuất dữ liệu từ các tài liệu HTML để bù đắp cho hầu hết các điểm không hoàn hảo trong HTML mà các trình duyệt thường bỏ qua. Bạn có thể tải xuống mã BeautifulSoup từ www. vụn vặt. com. portMột số thường cho biết bạn đang liên hệ với ứng dụng nào khi thực hiện kết nối ổ cắm với máy chủ. Ví dụ: lưu lượng truy cập web thường sử dụng cổng 80 trong khi lưu lượng email sử dụng cổng 25. scrapeKhi một chương trình giả làm trình duyệt web và truy xuất một trang web, sau đó xem nội dung trang web. Thường thì các chương trình đang theo các liên kết trong một trang để tìm trang tiếp theo để chúng có thể duyệt qua một mạng các trang hoặc mạng xã hội. socketMột kết nối mạng giữa hai ứng dụng nơi các ứng dụng có thể gửi và nhận dữ liệu theo một trong hai hướng. con nhệnHành động của một công cụ tìm kiếm web truy xuất một trang và sau đó là tất cả các trang được liên kết từ một trang, v.v. cho đến khi chúng có gần như tất cả các trang trên Internet mà chúng sử dụng để xây dựng chỉ mục tìm kiếm của mìnhbài tập 1. Thay đổi chương trình ổ cắm
python urlregex.py
Enter - //www.dr-chuck.com/page1.htm
//www.dr-chuck.com/page2.htm
1 để nhắc người dùng nhập URL để nó có thể đọc bất kỳ trang web nào. Bạn có thể sử dụng python urlregex.py
Enter - //www.dr-chuck.com/page1.htm
//www.dr-chuck.com/page2.htm
2 để chia URL thành các phần cấu thành của nó để bạn có thể trích xuất tên máy chủ cho cuộc gọi ổ cắm python urlregex.py
Enter - //www.dr-chuck.com/page1.htm
//www.dr-chuck.com/page2.htm
3. Thêm tính năng kiểm tra lỗi bằng cách sử dụng python urlregex.py
Enter - //www.dr-chuck.com/page1.htm
//www.dr-chuck.com/page2.htm
4 và python urlregex.py
Enter - //www.dr-chuck.com/page1.htm
//www.dr-chuck.com/page2.htm
5 để xử lý tình trạng người dùng nhập URL không tồn tại hoặc có định dạng saiBài tập 2. Thay đổi chương trình ổ cắm của bạn để nó đếm số ký tự đã nhận và dừng hiển thị bất kỳ văn bản nào sau khi nó đã hiển thị 3000 ký tự. Chương trình sẽ truy xuất toàn bộ tài liệu và đếm tổng số ký tự và hiển thị số lượng ký tự ở cuối tài liệu
bài tập 3. Sử dụng
But soft what light through yonder window breaks
It is the east and Juliet is the sun
Arise fair sun and kill the envious moon
Who is already sick and pale with grief
3 để lặp lại bài tập trước về [1] truy xuất tài liệu từ một URL, [2] hiển thị tối đa 3000 ký tự và [3] đếm tổng số ký tự trong tài liệu. Đừng lo lắng về các tiêu đề cho bài tập này, chỉ cần hiển thị 3000 ký tự đầu tiên của nội dung tài liệubài tập 4. Thay đổi chương trình
python urlregex.py
Enter - //www.dr-chuck.com/page1.htm
//www.dr-chuck.com/page2.htm
7 để trích xuất và đếm các thẻ đoạn văn [p] từ tài liệu HTML đã truy xuất và hiển thị số lượng đoạn văn dưới dạng đầu ra của chương trình của bạn. Không hiển thị đoạn văn bản, chỉ đếm chúng. Kiểm tra chương trình của bạn trên một số trang web nhỏ cũng như một số trang web lớn hơnbài tập 5. [Nâng cao] Thay đổi chương trình ổ cắm để nó chỉ hiển thị dữ liệu sau khi nhận được tiêu đề và dòng trống. Hãy nhớ rằng
python urlregex.py
Enter - //www.dr-chuck.com/page1.htm
//www.dr-chuck.com/page2.htm
8 đang nhận ký tự [dòng mới và tất cả], không phải dòng