cURL, các yêu cầu Python và Cách tải nội dung xuống từ Internet
26/04/2023 01:22
Một trong những bước đầu tiên trong bất kỳ dự án phân tích dữ liệu nào là bắt tay vào tập dữ liệu. Nó có thể là bất cứ thứ gì – phép đo hiện tượng vật lý, kết quả từ mô phỏng, hình ảnh, văn bản, thậm chí cả âm nhạc.
Một trong những bước đầu tiên trong bất kỳ dự án phân tích dữ liệu nào là bắt tay vào tập dữ liệu. Nó có thể là bất cứ thứ gì – phép đo hiện tượng vật lý, kết quả từ mô phỏng, hình ảnh, văn bản, thậm chí cả âm nhạc.
Một cách phổ biến để lấy dữ liệu là tải xuống từ Internet. Trong bài viết này, chúng tôi sẽ giới thiệu cho bạn một số cách để thực hiện việc này, từ công cụ dòng lệnh đến một số thư viện Python.
Bài viết này dành cho các nhà phân tích dữ liệu có thêm một chút kinh nghiệm về Python. Chúng ta sẽ bắt đầu chậm rãi, nhưng cuối cùng chúng ta sẽ đề cập đến một số tài liệu nâng cao hơn. Ngay cả khi bạn là người mới lập trình với Python, sẽ có thứ gì đó ở đây dành cho bạn..
Yêu cầu GET trong HTTP
Yêu cầu GET tạo thành xương sống của việc tải xuống nội dung từ internet bằng Python. Đó là liên kết giữa nguồn (bạn) và đích (trang web bạn muốn cạo). Đó là một PHƯƠNG THỨC YÊU CẦU HTTP rất phổ biến được sử dụng để truy xuất dữ liệu mà không có bất kỳ ảnh hưởng nào khác đến trạng thái của mục tiêu (nghĩa là GET không thay đổi trang web, nó chỉ tải một biểu diễn của trang web đó vào trình duyệt). Mỗi yêu cầu bao gồm một tiêu đề và một cơ thể. Tiêu đề có thể được coi là chứa siêu dữ liệu yêu cầu, chẳng hạn như thông tin về loại và kích thước của dữ liệu trong phần thân yêu cầu. Phần thân chứa dữ liệu. Chúng ta sẽ xem một số ví dụ trong phần tiếp theo để làm rõ điều này.
cURL và Dòng lệnh
cURL (Client for URL) là một công cụ được sử dụng để truy vấn URL từ dòng lệnh. Nó có thể thực hiện yêu cầu GET để tải xuống dữ liệu từ một trang web; nó cũng có thể tải lên hoặc xóa dữ liệu trên trang web, đăng thông báo lên bảng tin, xác thực người dùng và thực hiện những việc hữu ích khác.
Để kiểm tra, hãy mở dòng lệnh (ví dụ: Dấu nhắc lệnh trong Windows) và thực hiện lệnh sau:
>>> curl https: / / learnpython.com / |
Phản hồi từ máy chủ đích được in ra dòng lệnh. Trong trường hợp này, nó chỉ in HTML cho trang chủ learnpython.com dưới dạng văn bản. Có nhiều tùy chọn bạn có thể sử dụng để định cấu hình phản hồi. Để chỉ nhận thông tin tiêu đề (sử dụng phương thức HEAD), hãy thử gửi yêu cầu với tùy -I
chọn (hoặc sử dụng cách khác --head
):
>>> curl - I https: / / learnpython.com / |
Phản hồi lần này ngắn hơn nhiều và chứa dữ liệu như ngày và giờ của yêu cầu cũng như thông tin về cookie.
Để sử dụng curl
để tải xuống dữ liệu, hãy thêm -o
hoặc -O
tùy chọn. Sử dụng tùy chọn -o để xác định rõ ràng nơi lưu kết quả. Ví dụ: để tải xuống ảnh chú dê con dễ thương nhất mà bạn từng thấy, chỉ cần chạy lệnh sau:
>>> curl - o goat.jpg https: / / learnpython.com / blog / python - pillow - module / 1.jpg |
Thao tác này sẽ lưu ảnh vào thư mục làm việc hiện tại của bạn dưới dạng dê.jpg. Để tìm đường dẫn đầy đủ đến thư mục, chỉ cần chạy lệnh pwd trong dòng lệnh. Có rất nhiều tùy chọn mà bạn có thể sử dụng để định cấu hình yêu cầu. Kiểm tra TÀI LIỆU CURL để biết thêm thông tin.
Thư viện yêu cầu trong Python
Chẳng hạn, sử dụng lệnh curl là một cách nhanh chóng và thuận tiện để tải xuống một số lượng nhỏ hình ảnh. Nhưng đối với hầu hết các dự án phân tích, bạn sẽ cần một bộ dữ liệu lớn hơn nhiều. Vì vậy, bây giờ chúng ta sẽ chuyển sang một số thư viện Python hữu ích cho phép bạn viết các chương trình phức tạp hơn và tải xuống nhiều dữ liệu hơn.
Thư viện YÊU CẦU là một thư viện Python đơn giản để thực hiện các yêu cầu HTTP. Chúng tôi đã trình bày một số điều cơ bản về thư viện này trong bài viết TÌM KIẾM TRÊN WEB VỚI THƯ VIỆN PYTHON , vì vậy hãy đọc nó để biết một số tài liệu cơ bản. Có một ví dụ hữu ích về cách tải xuống dữ liệu văn bản từ một trang web và phân tích dữ liệu đó thành định dạng có thể đọc được. Chúng tôi sẽ xây dựng tài liệu đó để làm một cái gì đó phức tạp và thú vị hơn.
Đối với ví dụ này, chúng tôi sẽ viết một kịch bản để tải xuống Ảnh thiên văn trong ngày từ trang web của NASA. Đây là những hình ảnh tuyệt đẹp được đăng hàng ngày; trang web đã trở thành một trong những trang web của chính phủ Hoa Kỳ được truy cập nhiều nhất. Nhưng trước khi bắt đầu, chúng ta cần thiết lập một số thứ.
Bước đầu tiên là tạo khóa API bằng BIỂU MẪU NÀY . Chúng tôi sẽ sử dụng thư viện yêu cầu để nhận phản hồi từ máy chủ. Chúng ta cần chuyển khóa API và ngày làm từ điển cho hàm get. Chúng tôi cũng sẽ sử dụng mô-đun DATETIME để làm việc với các ngày trong tập lệnh Python của chúng tôi.
Thiết lập dự án của chúng tôi trông như thế này:
>>> import requests >>> import datetime as dt >>> import json >>> # define your api key here >>> api_key = 'YourUniqueAPIKeyHere' >>> # define the date as datetime object, then get string >>> dte = dt.datetime( 2023 , 1 , 2 ) >>> dte_string = dt.datetime.strftime(dte, '%Y-%m-%d' ) >>> # define parameters >>> params = { 'api_key' :api_key, 'hd' : 'True' , 'date' :dte_string} >>> # first request >>> r = requests.get( 'https://api.nasa.gov/planetary/apod' , params = params) |
Chúng tôi cũng đã chuyển 'hd':'True'
tham số để yêu cầu phiên bản độ nét cao của hình ảnh. Phản hồi, r, ở định dạng JSON. Chúng tôi cần kiểm tra xem phản hồi có thành công hay không, sau đó chúng tôi có thể phân tích cú pháp phản hồi đó để lấy URL cho hình ảnh độ nét cao. Khi chúng tôi có URL, chúng tôi có thể gửi một yêu cầu khác và lưu hình ảnh:
>>> # check response. 200 = good, 404 = bad >>> if r.status_code = = 200 : ... # parse json data ... data = json.loads(r.content.decode( 'utf-8' )) ... # check if data is an image ... if (data[ 'media_type' ] = = 'image' ): ... # get the image ... r = requests.get(data[ 'hdurl' ], stream = True ) ... # check response again ... if r.status_code = = 200 : ... # save the image ... with open ( 'apod_{}.jpg' . format (dte_string), 'wb' ) as f: ... for chunk in r.iter_content(): ... f.write(chunk) |
Bằng cách đặt stream=True
, dữ liệu được gửi theo từng đoạn không chồng chéo, lần lượt từng đoạn một. Điều này tránh đọc tất cả nội dung vào bộ nhớ cùng một lúc, điều này rất hữu ích đối với lượng lớn dữ liệu. Chúng tôi sử dụng iter_content()
chức năng này để lặp lại các đoạn phản hồi và lưu chúng dưới dạng một hình ảnh jpg trong thư mục làm việc hiện tại, với tên tệp 'apod_2023-01-02.jpg' .
Tập lệnh này có thể được mở rộng để tải xuống ảnh từ một loạt các ngày và lưu trữ chúng trong một thư mục. Để làm điều này, bạn cần sử dụng các phím 'start_date' và 'end_date' trong từ điển params. Sử dụng một số thư viện xử lý hình ảnh (ví dụ: PIL ), mô tả có thể được in trên hình ảnh, sau đó có thể được sử dụng làm hình ảnh màn hình nền mới của bạn.
PycURL
Công cụ tiếp theo mà chúng ta sẽ xem xét là PYCURL , công cụ này cũng có thể được sử dụng để lấy dữ liệu từ một URL trong chương trình Python của bạn. Nó hướng nhiều hơn đến các nhà phát triển nâng cao và có rất nhiều tính năng. Nó linh hoạt, mạnh mẽ và rất nhanh.
Bây giờ chúng ta sẽ xem xét việc gửi GET
yêu cầu đến một trang web bằng cách sử dụng pycurl
. Chúng tôi cũng sẽ cần sự trợ giúp của mô-đun BYTESIO :
>>> import pycurl >>> from io import BytesIO >>> crl_obj = pycurl.Curl() >>> b_obj = BytesIO() |
Chúng tôi đã tạo một curl
đối tượng để truyền dữ liệu qua URL và một đối tượng byte để lưu trữ dữ liệu. Đối curl
tượng có thể được tùy chỉnh với nhiều tùy chọn bằng setopt()
chức năng. Ví dụ: để xác định URL và báo cho curl
đối tượng biết nơi lưu trữ dữ liệu, chúng tôi thực hiện như sau:
>>> url = 'https://en.wikipedia.org/wiki/Stephen_Hawking' >>> crl_obj.setopt(crl_obj.URL, url) >>> crl_obj.setopt(crl_obj.WRITEDATA, b_obj) |
Bây giờ chúng tôi muốn thực hiện truyền dữ liệu và kết thúc phiên:
>>> crl_obj.perform() >>> crl_obj.close() |
Để có được dữ liệu được lưu trữ trong đối tượng byte, chúng tôi sử dụng:
>>> data = b_obj.getvalue() >>> print (data.decode( 'utf8' )) |
Điều này sẽ in ra HTML của trang web. Có nhiều tùy chọn khác để tùy chỉnh yêu cầu.
Thực hành cURL và các công cụ yêu cầu Python khác
Trong bài viết này, chúng tôi đã giới thiệu cho bạn một số công cụ giúp bạn tải xuống nội dung trong Python. Công cụ đầu tiên, cURL, có thể được sử dụng độc lập với Python ngay từ dòng lệnh. Tuy nhiên, việc sử dụng các thư viện Python để tải xuống dữ liệu Internet sẽ mở ra cơ hội có nhiều sức mạnh và tính linh hoạt hơn. Với những công cụ này, bạn có thể truy cập vào dữ liệu văn bản, hình ảnh, âm nhạc, dữ liệu dạng bảng, v.v. của Wikipedia.