- E-mail:
- Twitter: @sagnewshreds
- GitHub: Sagnew
- Twitch [Mã trực tiếp phát trực tuyến]: Sagnewshreds
Internet có rất nhiều thông tin đáng kinh ngạc cho tiêu dùng của con người. Nhưng dữ liệu này thường khó truy cập theo chương trình nếu nó không xuất hiện dưới dạng API REST chuyên dụng. Với các công cụ Python như Súp đẹp, bạn có thể cạo và phân tích dữ liệu này trực tiếp từ các trang web để sử dụng cho các dự án và ứng dụng của bạn.
Chúng ta hãy sử dụng ví dụ về dữ liệu MIDI từ Internet để đào tạo một mạng lưới thần kinh với Magenta có thể tạo ra âm nhạc âm thanh cổ điển của Nintendo. Để làm điều này, chúng tôi sẽ cần một bộ nhạc MIDI từ các trò chơi cũ của Nintendo. Sử dụng súp đẹp, chúng tôi có thể lấy dữ liệu này từ kho lưu trữ nhạc trò chơi video.
Bắt đầu và thiết lập các phụ thuộc
Trước khi tiếp tục, bạn sẽ cần chắc chắn rằng bạn có phiên bản Python 3 và PIP cập nhật. Đảm bảo bạn tạo và kích hoạt một môi trường ảo trước khi cài đặt bất kỳ phụ thuộc nào.
Bạn sẽ cần cài đặt thư viện yêu cầu để thực hiện các yêu cầu HTTP để lấy dữ liệu từ trang web và súp đẹp để phân tích cú pháp qua HTML.
Với môi trường ảo của bạn được kích hoạt, hãy chạy lệnh sau trong thiết bị đầu cuối của bạn:
pip install requests==2.22.0 beautifulsoup4==4.8.1
Chúng tôi đang sử dụng Soup 4 đẹp vì đây là phiên bản mới nhất và Soup 3 đẹp không còn được phát triển hoặc hỗ trợ.
Sử dụng các yêu cầu để cạo dữ liệu cho súp đẹp để phân tích
Trước tiên, chúng ta hãy viết một số mã để lấy HTML từ trang web và xem cách chúng ta có thể bắt đầu phân tích cú pháp qua nó. Mã sau đây sẽ gửi yêu cầu GET
đến trang web mà chúng tôi muốn và tạo một đối tượng đẹp với HTML từ trang đó:
import requests
from bs4 import BeautifulSoup
vgm_url = '//www.vgmusic.com/music/console/nintendo/nes/'
html_text = requests.get[vgm_url].text
soup = BeautifulSoup[html_text, 'html.parser']
Với đối tượng soup
này, bạn có thể điều hướng và tìm kiếm thông qua HTML cho dữ liệu mà bạn muốn. Ví dụ: nếu bạn chạy soup.title
sau mã trước trong vỏ Python, bạn sẽ nhận được tiêu đề của trang web. Nếu bạn chạy print[soup.get_text[]]
, bạn sẽ thấy tất cả các văn bản trên trang.
Làm quen với món súp đẹp
Các phương thức Find [] và Find_all [] là một trong những vũ khí mạnh nhất trong kho vũ khí của bạn. soup.find[]
là tuyệt vời cho các trường hợp bạn biết chỉ có một yếu tố bạn đang tìm kiếm, chẳng hạn như thẻ
import requests
from bs4 import BeautifulSoup
vgm_url = '//www.vgmusic.com/music/console/nintendo/nes/'
html_text = requests.get[vgm_url].text
soup = BeautifulSoup[html_text, 'html.parser']
0. Trên trang này, import requests
from bs4 import BeautifulSoup
vgm_url = '//www.vgmusic.com/music/console/nintendo/nes/'
html_text = requests.get[vgm_url].text
soup = BeautifulSoup[html_text, 'html.parser']
1 sẽ đưa cho bạn văn bản từ phần tử HTML cho quảng cáo biểu ngữ.import requests
from bs4 import BeautifulSoup
vgm_url = '//www.vgmusic.com/music/console/nintendo/nes/'
html_text = requests.get[vgm_url].text
soup = BeautifulSoup[html_text, 'html.parser']
2 là phương pháp phổ biến nhất mà bạn sẽ sử dụng trong các cuộc phiêu lưu quét web của mình. Sử dụng điều này, bạn có thể lặp lại tất cả các siêu liên kết trên trang và in URL của họ:for link in soup.find_all['a']:
print[link.get['href']]
Bạn cũng có thể cung cấp các đối số khác nhau cho
import requests
from bs4 import BeautifulSoup
vgm_url = '//www.vgmusic.com/music/console/nintendo/nes/'
html_text = requests.get[vgm_url].text
soup = BeautifulSoup[html_text, 'html.parser']
3, chẳng hạn như các biểu thức thông thường hoặc thuộc tính thẻ để lọc tìm kiếm của bạn theo cụ thể như bạn muốn. Bạn có thể tìm thấy rất nhiều tính năng thú vị trong tài liệu.Phân tích cú pháp và điều hướng HTML với Đẹp
Trước khi viết thêm mã để phân tích nội dung mà chúng tôi muốn, trước tiên, hãy để xem HTML mà trình duyệt được trình duyệt hiển thị. Mỗi trang web là khác nhau và đôi khi nhận được dữ liệu phù hợp trong số chúng đòi hỏi một chút sáng tạo, nhận dạng mẫu và thử nghiệm.
Mục tiêu của chúng tôi là tải xuống một loạt các tệp MIDI, nhưng có rất nhiều bản nhạc trùng lặp trên trang web này cũng như phối lại các bài hát. Chúng tôi chỉ muốn một trong mỗi bài hát và vì cuối cùng chúng tôi muốn sử dụng dữ liệu này để đào tạo một mạng lưới thần kinh để tạo ra âm nhạc Nintendo chính xác, chúng tôi sẽ không muốn đào tạo nó trên các bản phối lại do người dùng tạo.
Khi bạn viết mã để phân tích thông qua một trang web, thường sẽ hữu ích khi sử dụng các công cụ nhà phát triển có sẵn cho bạn trong hầu hết các trình duyệt hiện đại. Nếu bạn nhấp chuột phải vào phần tử mà bạn quan tâm, bạn có thể kiểm tra HTML đằng sau yếu tố đó để tìm ra cách bạn có thể lập trình truy cập dữ liệu bạn muốn.
Hãy sử dụng phương thức
import requests
from bs4 import BeautifulSoup
vgm_url = '//www.vgmusic.com/music/console/nintendo/nes/'
html_text = requests.get[vgm_url].text
soup = BeautifulSoup[html_text, 'html.parser']
3 để xem qua tất cả các liên kết trên trang, nhưng sử dụng các biểu thức thông thường để lọc qua chúng để chúng tôi chỉ nhận các liên kết có chứa các tệp MIDI không có dấu ngoặc đơn, điều này sẽ cho phép chúng tôi loại trừ tất cả các bản sao và phối lại.Tạo một tệp có tên
import requests
from bs4 import BeautifulSoup
vgm_url = '//www.vgmusic.com/music/console/nintendo/nes/'
html_text = requests.get[vgm_url].text
soup = BeautifulSoup[html_text, 'html.parser']
5 và thêm mã sau vào nó:import re
import requests
from bs4 import BeautifulSoup
vgm_url = '//www.vgmusic.com/music/console/nintendo/nes/'
html_text = requests.get[vgm_url].text
soup = BeautifulSoup[html_text, 'html.parser']
if __name__ == '__main__':
attrs = {
'href': re.compile[r'\.mid$']
}
tracks = soup.find_all['a', attrs=attrs, string=re.compile[r'^[[?!\[].]*$']]
count = 0
for track in tracks:
print[track]
count += 1
print[len[tracks]]
Điều này sẽ lọc qua tất cả các tệp MIDI mà chúng tôi muốn trên trang, in ra thẻ liên kết tương ứng với chúng và sau đó in số lượng tệp chúng tôi đã lọc.
Chạy mã trong thiết bị đầu cuối của bạn với lệnh
import requests
from bs4 import BeautifulSoup
vgm_url = '//www.vgmusic.com/music/console/nintendo/nes/'
html_text = requests.get[vgm_url].text
soup = BeautifulSoup[html_text, 'html.parser']
6.Tải xuống các tệp MIDI mà chúng tôi muốn từ trang web
Bây giờ chúng tôi có mã hoạt động để lặp qua mỗi tệp MIDI mà chúng tôi muốn, chúng tôi phải viết mã để tải xuống tất cả chúng.
Trong
import requests
from bs4 import BeautifulSoup
vgm_url = '//www.vgmusic.com/music/console/nintendo/nes/'
html_text = requests.get[vgm_url].text
soup = BeautifulSoup[html_text, 'html.parser']
5, thêm một hàm vào mã của bạn có tên là import requests
from bs4 import BeautifulSoup
vgm_url = '//www.vgmusic.com/music/console/nintendo/nes/'
html_text = requests.get[vgm_url].text
soup = BeautifulSoup[html_text, 'html.parser']
8 và gọi hàm đó cho mỗi bản nhạc trong vòng lặp lặp qua chúng:import re
import requests
from bs4 import BeautifulSoup
vgm_url = '//www.vgmusic.com/music/console/nintendo/nes/'
html_text = requests.get[vgm_url].text
soup = BeautifulSoup[html_text, 'html.parser']
def download_track[count, track_element]:
# Get the title of the track from the HTML element
track_title = track_element.text.strip[].replace['/', '-']
download_url = '{}{}'.format[vgm_url, track_element['href']]
file_name = '{}_{}.mid'.format[count, track_title]
# Download the track
r = requests.get[download_url, allow_redirects=True]
with open[file_name, 'wb'] as f:
f.write[r.content]
# Print to the console to keep track of how the scraping is coming along.
print['Downloaded: {}'.format[track_title, download_url]]
if __name__ == '__main__':
attrs = {
'href': re.compile[r'\.mid$']
}
tracks = soup.find_all['a', attrs=attrs, string=re.compile[r'^[[?!\[].]*$']]
count = 0
for track in tracks:
download_track[count, track]
count += 1
print[len[tracks]]
Trong chức năng
import requests
from bs4 import BeautifulSoup
vgm_url = '//www.vgmusic.com/music/console/nintendo/nes/'
html_text = requests.get[vgm_url].text
soup = BeautifulSoup[html_text, 'html.parser']
8 này, chúng tôi sẽ chuyển qua đối tượng súp đẹp đại diện cho phần tử HTML của liên kết đến tệp MIDI, cùng với một số duy nhất để sử dụng trong tên tệp để tránh các vụ va chạm đặt tên.Chạy mã này từ một thư mục mà bạn muốn lưu tất cả các tệp MIDI và xem màn hình thiết bị đầu cuối của bạn hiển thị tất cả 2230 MIDI mà bạn đã tải xuống [tại thời điểm viết bài này]. Đây chỉ là một ví dụ thực tế cụ thể về những gì bạn có thể làm với súp đẹp.
Mở rộng rộng lớn của World Wide Web
Bây giờ bạn có thể lập trình lấy mọi thứ từ các trang web, bạn có quyền truy cập vào một nguồn dữ liệu lớn cho bất kỳ dự án nào của bạn cần. Một điều cần lưu ý là các thay đổi đối với trang web HT HTML có thể phá vỡ mã của bạn, vì vậy hãy đảm bảo cập nhật mọi thứ nếu bạn đang xây dựng các ứng dụng trên hết.
Nếu bạn đang tìm kiếm một cái gì đó để làm với dữ liệu bạn vừa lấy từ kho lưu trữ nhạc trò chơi video, bạn có thể thử sử dụng các thư viện Python như MIDO để làm việc với dữ liệu MIDI để làm sạch nó hoặc sử dụng Magenta để đào tạo mạng lưới thần kinh với nó Hoặc vui vẻ xây dựng một số điện thoại mà mọi người có thể gọi để nghe nhạc Nintendo.
Tôi mong muốn được xem những gì bạn xây dựng. Hãy tiếp cận và chia sẻ kinh nghiệm của bạn hoặc hỏi bất kỳ câu hỏi nào.