Bài tập Python cho mọi người chương 12

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 Python

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

trong đó 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
8

Ví 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 ảnh

Khi 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ệu

Kế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ới

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

Mã 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ư sau

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

Khi 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ôi

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

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

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

Ví 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ép

Khi 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ình

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

Nhữ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
3

Mẫ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ư sau

Chươ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ạn

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

Chươ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
1

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

Lệ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ết

BeautifulSoupMộ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ình

bà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 sai

Bà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ệu

bà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ơn

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

Chủ Đề