Làm cách nào để mở URL bằng urllib trong Python?

Mô-đun urllib trong Python 3 cho phép bạn truy cập các trang web thông qua chương trình của mình. Điều này mở ra nhiều cánh cửa cho các chương trình của bạn như internet mở ra cho bạn. urllib trong Python 3 hơi khác so với urllib2 trong Python 2, nhưng chúng hầu như giống nhau. Thông qua urllib, bạn có thể truy cập các trang web, tải xuống dữ liệu, phân tích cú pháp dữ liệu, sửa đổi tiêu đề của mình và thực hiện bất kỳ yêu cầu GET và POST nào mà bạn có thể cần thực hiện

Một số trang web không đánh giá cao các chương trình truy cập dữ liệu của họ và đặt trọng lượng lên máy chủ của họ. Khi họ phát hiện ra rằng một chương trình đang truy cập vào họ, đôi khi họ có thể chọn chặn bạn hoặc cung cấp cho bạn dữ liệu khác mà người dùng thông thường có thể thấy. Điều này có thể gây khó chịu lúc đầu, nhưng có thể khắc phục bằng một số mã đơn giản. Để làm điều này, bạn chỉ cần sửa đổi tác nhân người dùng, là một biến trong tiêu đề mà bạn gửi vào. Tiêu đề là các bit dữ liệu mà bạn chia sẻ với máy chủ để cho họ biết một chút về bạn. Theo mặc định, đây là nơi Python thông báo cho trang web mà bạn đang truy cập bằng urllib của Python và phiên bản Python của bạn. Tuy nhiên, chúng tôi có thể sửa đổi điều này và hành động như thể chúng tôi là người dùng Internet Explorer cấp thấp, người dùng Chrome hoặc bất kỳ thứ gì khác thực sự

Tuy nhiên, tôi không khuyên bạn nên làm điều này một cách mù quáng, nếu một trang web chặn bạn truy cập. Các trang web cũng sẽ sử dụng các chiến thuật khác, nhưng thông thường họ đang làm điều đó vì họ cũng cung cấp một API được tạo riêng để nhiều chương trình truy cập hơn. Các chương trình thường chỉ quan tâm đến dữ liệu và không cần phải cung cấp dữ liệu HTML hoặc CSS ưa thích, cũng như dữ liệu cho quảng cáo, v.v.

Đây là mã mẫu đi kèm với video

Đây là ví dụ đầu tiên và dễ nhất về việc sử dụng urllib. Chúng ta chỉ cần nhập urllib. yêu cầu. Từ đó, chúng tôi chỉ định việc mở url cho một biến, nơi cuối cùng chúng tôi có thể sử dụng một. read[] lệnh đọc dữ liệu. Kết quả là một mớ hỗn độn, nhưng chúng tôi thực sự đã đọc mã nguồn

#Used to make requests
import urllib.request

x = urllib.request.urlopen['//www.google.com/']
print[x.read[]]

Chẳng bao lâu nữa, chúng tôi sẽ sử dụng các biểu thức chính quy để xóa kết quả. Vấn đề là các trang web sử dụng tất cả các loại HTML, CSS và javascript để làm cho trang web bắt mắt. Các chương trình của chúng tôi thực sự không quan tâm trang web trông như thế nào. Chúng tôi chỉ muốn văn bản thông thường, vì vậy chúng tôi cần loại bỏ tất cả những thứ lộn xộn. Để làm điều đó, các biểu thức chính quy trở nên khá hữu ích, vì vậy chúng ta sẽ sớm đến đó, sau khi đề cập đến regex

Tiếp theo, đôi khi, chúng tôi muốn đưa vào các giá trị hoặc GET/POST, từ/đến một URL. Có hai phương pháp truyền dữ liệu bằng url và chúng là GET và POST. Phương thức tự nhiên là yêu cầu GET, có nghĩa là bạn đưa ra yêu cầu và bạn nhận được dữ liệu. Cái còn lại là POST, nơi bạn gửi dữ liệu vào máy chủ, giống như bạn đăng một số dữ liệu và bạn nhận được yêu cầu dựa trên bài đăng

Một ví dụ

http. //lập trình trăn. net/?s=basics&submit=Tìm kiếm

Bạn thấy có 2 biến ở đây. Bạn có thể nhìn thấy chúng vì dấu bằng. Biến đầu tiên được biểu thị bằng dấu chấm hỏi và tất cả các biến tiếp theo được biểu thị bằng dấu &

Có nhiều cách để chuyển các giá trị như thế này, bạn chỉ cần mã hóa chúng hoặc bạn có thể sử dụng urllib để làm điều đó. Hãy hiển thị một ví dụ về các yêu cầu với urllib

# used to parse values into the url
import urllib.parse


url = '//www.google.com/search'
values = {'q' : 'python programming tutorials'}

Ở trên, chúng tôi đang xác định các biến mà chúng tôi dự định POST tới url mà chúng tôi chỉ định

Từ đó, bên dưới, trước tiên chúng ta cần mã hóa url tất cả các giá trị. Về cơ bản, đây là những thứ như chuyển đổi "dấu cách" thành% 20 chẳng hạn

Sau đó, chúng tôi mã hóa thành byte utf-8. Chúng tôi đưa ra yêu cầu của mình, thêm vào một giá trị nữa, dữ liệu, là từ điển mã hóa của các khóa và giá trị hoặc được hiểu rõ hơn trong trường hợp này là các biến và giá trị của chúng. Sau đó, chúng tôi mở url với yêu cầu mà chúng tôi đã tạo, cái mà chúng tôi gọi là phản hồi, vì đó là những gì chúng tôi nhận được với nó. Cuối cùng, chúng tôi đọc phản hồi đó với một. đọc[]

data = urllib.parse.urlencode[values]
data = data.encode['utf-8'] # data should be bytes
req = urllib.request.Request[url, data]
resp = urllib.request.urlopen[req]
respData = resp.read[]

print[respData]

Hóa ra, Google sẽ trả về 405, phương thức không được phép. Google không hài lòng với yêu cầu của chúng tôi. Hãy thử cách trên trên một trang web khác, sửa đổi các biến. Tìm một trang web có thanh tìm kiếm và xem liệu bạn có thể sử dụng nó thông qua Python không

Cuối cùng, sửa đổi tiêu đề. Đôi khi, các trang web không đánh giá cao việc bị rô bốt truy cập hoặc chúng có thể đối xử khác với chúng. Trước đây, hầu hết các trang web nếu có lập trường gì thì cũng chỉ chặn các chương trình. Giờ đây, phương pháp phổ biến dường như là cung cấp các dữ liệu khác nhau cho các chương trình, để chúng không dễ dàng nhận ra điều gì đã xảy ra hoặc có thể chia sẻ thông tin với các nhà phát triển. Đôi khi, họ cũng chỉ đơn giản là phục vụ chương trình với dữ liệu hạn chế, để giữ cho tải trên máy chủ của họ ở mức thấp. Wikipedia đã từng chặn hoàn toàn các chương trình, nhưng giờ đây chúng phục vụ một trang, Google cũng vậy. Đây thường là một trang không phải là những gì bạn thực sự muốn, vì vậy bạn sẽ cần phải giải quyết nó

Bất cứ khi nào bạn truy cập một liên kết, bạn sẽ gửi một tiêu đề, đây chỉ là một số thông tin cơ bản về bạn. Đây là cách Google Analytics biết bạn đang sử dụng trình duyệt nào, chẳng hạn

Trong tiêu đề, có một giá trị được gọi là tác nhân người dùng, xác định trình duyệt đang truy cập máy chủ của trang web

Nếu bạn đang sử dụng tác nhân người dùng python mặc định với urllib, thì bạn đang thông báo mình là Python-urllib/3. 4, nếu phiên bản Python của bạn là 3. 4. Điều này hoặc là xa lạ với trang web, hoặc họ sẽ chặn nó hoàn toàn. Một giải pháp cho vấn đề này là chỉ xác định bản thân bạn là một thứ gì đó hoàn toàn khác.

try:
    x = urllib.request.urlopen['//www.google.com/search?q=test']
    #print[x.read[]]

    saveFile = open['noheaders.txt','w']
    saveFile.write[str[x.read[]]]
    saveFile.close[]
except Exception as e:
    print[str[e]]

Đầu ra ở trên là của Google, ai biết bạn là Python. Trong những năm qua, cách Google và các trang web khác xử lý các chương trình đã thay đổi, vì vậy điều này cũng có thể thay đổi theo thời gian. Phản hồi hiện tại họ đang đưa ra chỉ là một trang tìm kiếm mặc định, sau khi bạn phân tích cú pháp qua tất cả mớ mã được trả về

Google đang làm điều này bởi vì chúng tôi đang cho Google biết chúng tôi là ai, một bot Python urllib. Hãy thay đổi điều đó bằng cách sửa đổi tác nhân người dùng của chúng tôi trong tiêu đề

try:
    url = '//www.google.com/search?q=python'

    # now, with the below headers, we defined ourselves as a simpleton who is
    # still using internet explorer.
    headers = {}
    headers['User-Agent'] = "Mozilla/5.0 [X11; Linux i686] AppleWebKit/537.17 [KHTML, like Gecko] Chrome/24.0.1312.27 Safari/537.17"
    req = urllib.request.Request[url, headers = headers]
    resp = urllib.request.urlopen[req]
    respData = resp.read[]

    saveFile = open['withHeaders.txt','w']
    saveFile.write[str[respData]]
    saveFile.close[]
except Exception as e:
    print[str[e]]

Ở trên, về cơ bản, chúng tôi làm điều tương tự, chỉ lần này, chúng tôi tạo yêu cầu của mình trước, chuyển qua URL và các tiêu đề mới được sửa đổi. Sau đó, chúng tôi đưa ra yêu cầu và phản hồi của chúng tôi thực sự khác. Chúng tôi thực sự lấy lại dữ liệu mà chúng tôi quan tâm

Chủ Đề