HomeLập trìnhPythonCách cạo trang...

Cách cạo trang web bằng Python và BeautifulSoup


của Justin Yek

8D8WScVgBMYV3BTVbL52-HS9v9f8LoV9fCR7

Có nhiều thông tin trên Internet hơn bất kỳ con người nào có thể tiếp thu trong cả cuộc đời. Điều bạn cần không phải là quyền truy cập vào thông tin đó mà là một cách có thể mở rộng để thu thập, sắp xếp và phân tích thông tin đó.

Bạn cần quét web.

Quét web tự động trích xuất dữ liệu và trình bày dữ liệu ở định dạng mà bạn có thể dễ dàng hiểu được. Trong hướng dẫn này, chúng ta sẽ tập trung vào các ứng dụng của nó trong thị trường tài chính, nhưng việc quét web có thể được sử dụng trong nhiều tình huống khác nhau.

Nếu bạn là một nhà đầu tư khao khát, việc nhận được giá đóng cửa mỗi ngày có thể là một điều khó khăn, đặc biệt là khi thông tin bạn cần được tìm thấy trên một số trang web. Chúng tôi sẽ làm cho việc trích xuất dữ liệu trở nên dễ dàng hơn bằng cách xây dựng một công cụ quét web để tự động truy xuất các chỉ số chứng khoán từ Internet.

trTuoesIzruCn5cstkdhl9poG5I8IjL9K5kP

Bắt đầu

Chúng tôi sẽ sử dụng Python làm ngôn ngữ tìm kiếm của mình, cùng với một thư viện đơn giản và mạnh mẽ, BeautifulSoup.

  • Đối với người dùng Mac, Python được cài đặt sẵn trong OS X. Mở Terminal và gõ python --version. Bạn sẽ thấy phiên bản python của mình là 2.7.x.
  • Đối với người dùng Windows, vui lòng cài đặt Python thông qua trang web chính thức.

Tiếp theo, chúng ta cần lấy thư viện BeautifulSoup bằng cách sử dụng pipmột công cụ quản lý gói cho Python.

Trong thiết bị đầu cuối, gõ:

easy_install pip
pip install BeautifulSoup4

Ghi chú: Nếu bạn không thực hiện được dòng lệnh trên, hãy thử thêm sudo trước mỗi dòng.

Những thứ cơ bản

Trước khi chúng ta bắt đầu viết mã, hãy hiểu những điều cơ bản về HTML và một số quy tắc cạo.

thẻ HTML
Nếu bạn đã hiểu các thẻ HTML, vui lòng bỏ qua phần này.

<!DOCTYPE html>  
<html>  
    <head>
    </head>
    <body>
        <h1> First Scraping </h1>
        <p> Hello World </p>
    <body>
</html>

Đây là cú pháp cơ bản của một trang web HTML. Mọi <tag> phục vụ một khối bên trong trang web:
1. <!DOCTYPE html>: Tài liệu HTML phải bắt đầu bằng một khai báo kiểu.
2. Tài liệu HTML được chứa giữa <html></html>.
3. Việc khai báo meta và script của tài liệu HTML nằm giữa <head></head>.
4. Phần hiển thị của tài liệu HTML nằm giữa <body></body>thẻ.
5. Tiêu đề tiêu đề được xác định bằng <h1> xuyên qua <h6> thẻ.
6. Đoạn văn được định nghĩa bằng <p> nhãn.

Đọc thêm  Python Xóa ký tự khỏi chuỗi – Cách xóa ký tự khỏi chuỗi

Các thẻ hữu ích khác bao gồm <a> cho các siêu liên kết, <table> cho bảng, <tr> cho các hàng của bảng và <td> cho các cột của bảng.

Ngoài ra, các thẻ HTML đôi khi đi kèm với id hoặc class thuộc tính. Các id thuộc tính chỉ định một id duy nhất cho thẻ HTML và giá trị phải là duy nhất trong tài liệu HTML. Các class thuộc tính được sử dụng để xác định các kiểu bằng nhau cho các thẻ HTML có cùng lớp. Chúng tôi có thể sử dụng các id và lớp này để giúp chúng tôi định vị dữ liệu mà chúng tôi muốn.

Để biết thêm thông tin về thẻ HTML, id và lớp, vui lòng tham khảo Hướng dẫn của W3Schools.

quy tắc cạo

  1. Bạn nên kiểm tra Điều khoản và Điều kiện của trang web trước khi cạo nó. Hãy cẩn thận đọc các tuyên bố về việc sử dụng hợp pháp dữ liệu. Thông thường, dữ liệu bạn cạo không nên được sử dụng cho mục đích thương mại.
  2. Không yêu cầu dữ liệu từ trang web quá mạnh mẽ với chương trình của bạn (còn được gọi là gửi thư rác), vì điều này có thể làm hỏng trang web. Hãy chắc chắn rằng chương trình của bạn hoạt động một cách hợp lý (nghĩa là hành động như một con người). Một yêu cầu cho một trang web mỗi giây là thông lệ tốt.
  3. Bố cục của trang web có thể thay đổi theo thời gian, vì vậy hãy nhớ truy cập lại trang web và viết lại mã của bạn nếu cần

Kiểm tra trang

Hãy lấy một trang từ trang web Bloomberg Quote làm ví dụ.

Là một người theo dõi thị trường chứng khoán, chúng tôi muốn lấy tên chỉ số (S&P 500) và giá của nó từ trang này. Đầu tiên, nhấp chuột phải và mở trình kiểm tra trình duyệt của bạn để kiểm tra trang web.

i3mWoIwj3FWfSPQPnyfBEQn3oWNp5czTCg0U

Hãy thử di con trỏ chuột lên giá và bạn sẽ có thể thấy một hộp màu xanh bao quanh nó. Nếu bạn nhấp vào nó, HTML có liên quan sẽ được chọn trong bảng điều khiển trình duyệt.

2Tnvx-rIrmKbElQGgSnPaNK1xiG6LJI5xwR8

Từ kết quả, chúng ta có thể thấy rằng giá nằm trong một vài cấp độ của thẻ HTML, đó là <div class="basic-quote"><div class="price-container up"><div class="price">.

Tương tự, nếu bạn di chuột và nhấp vào tên “Chỉ số S&P 500”, nó nằm trong <div class="basic-quote"><h1 class="name">.

o0p8x2WILUOE7lXyS1beHcztnAH63knKOyqd

Bây giờ chúng tôi biết vị trí duy nhất của dữ liệu của chúng tôi với sự trợ giúp của class thẻ.

Nhảy vào mã

Bây giờ chúng tôi đã biết dữ liệu của mình ở đâu, chúng tôi có thể bắt đầu mã hóa trình quét web của mình. Mở trình soạn thảo văn bản của bạn ngay bây giờ!

Đọc thêm  Cách tự động hóa công việc bằng Python

Đầu tiên, chúng ta cần nhập tất cả các thư viện mà chúng ta sẽ sử dụng.

# import libraries
import urllib2
from bs4 import BeautifulSoup

Tiếp theo, khai báo một biến cho url của trang.

# specify the url
quote_page = ‘http://www.bloomberg.com/quote/SPX:IND'

Sau đó, sử dụng Python urllib2 để lấy trang HTML của url được khai báo.

# query the website and return the html to the variable ‘page’
page = urllib2.urlopen(quote_page)

Cuối cùng, phân tích trang thành định dạng BeautifulSoup để chúng tôi có thể sử dụng BeautifulSoup để làm việc với nó.

# parse the html using beautiful soup and store in variable `soup`
soup = BeautifulSoup(page, ‘html.parser’)

Bây giờ chúng ta có một biến, soup, chứa HTML của trang. Đây là nơi chúng ta có thể bắt đầu mã hóa phần trích xuất dữ liệu.

Ghi nhớ các lớp dữ liệu duy nhất của chúng tôi? BeautifulSoup có thể giúp chúng tôi truy cập vào các lớp này và trích xuất nội dung bằng find(). Trong trường hợp này, vì lớp HTML name là duy nhất trên trang này, chúng ta chỉ cần truy vấn <div class="name">.

# Take out the <div> of name and get its value
name_box = soup.find(‘h1’, attrs={‘class’: ‘name’})

Sau khi chúng tôi có thẻ, chúng tôi có thể lấy dữ liệu bằng cách lấy text.

name = name_box.text.strip() # strip() is used to remove starting and trailing
print name

Tương tự, chúng ta cũng có thể nhận được giá.

# get the index price
price_box = soup.find(‘div’, attrs={‘class’:’price’})
price = price_box.text
print price

Khi chạy chương trình, bạn có thể thấy chương trình in ra giá hiện tại của Chỉ số S&P 500.

R7W6VXymQPtfUACuiHkwldc1CuMEs2NYdcW1

Xuất sang Excel CSV

Bây giờ chúng ta đã có dữ liệu, đã đến lúc lưu nó. Định dạng được phân tách bằng dấu phẩy trong Excel là một lựa chọn tốt. Nó có thể được mở trong Excel để bạn có thể xem dữ liệu và xử lý dễ dàng.

Nhưng trước tiên, chúng ta phải nhập mô-đun csv Python và mô-đun datetime để lấy ngày ghi. Chèn những dòng này vào mã của bạn trong phần nhập.

import csv
from datetime import datetime

Ở cuối mã của bạn, hãy thêm mã để ghi dữ liệu vào tệp csv.

# open a csv file with append, so old data will not be erased
with open(‘index.csv’, ‘a’) as csv_file:
 writer = csv.writer(csv_file)
 writer.writerow([name, price, datetime.now()])

Bây giờ nếu bạn chạy chương trình của mình, bạn sẽ có thể xuất một index.csv tệp mà sau đó bạn có thể mở bằng Excel, nơi bạn sẽ thấy một dòng dữ liệu.

7O7PaHRqlgGALct2ZdjI2K773eGgXMAaJvMH

Vì vậy, nếu bạn chạy chương trình này hàng ngày, bạn sẽ có thể dễ dàng nhận được giá Chỉ số S&P 500 mà không cần lục lọi trên trang web!

Đi xa hơn (Sử dụng nâng cao)

Nhiều chỉ số
Vì vậy, cạo một chỉ số là không đủ cho bạn, phải không? Chúng tôi có thể cố gắng trích xuất nhiều chỉ số cùng một lúc.

Đầu tiên, sửa đổi các quote_page thành một mảng các URL.

quote_page = [‘http://www.bloomberg.com/quote/SPX:IND', ‘http://www.bloomberg.com/quote/CCMP:IND']

Sau đó, chúng tôi thay đổi mã trích xuất dữ liệu thành for vòng lặp, sẽ xử lý từng URL một và lưu trữ tất cả dữ liệu vào một biến data trong bộ dữ liệu.

# for loop
data = []
for pg in quote_page:
 # query the website and return the html to the variable ‘page’
 page = urllib2.urlopen(pg)
 
# parse the html using beautiful soap and store in variable `soup`
 soup = BeautifulSoup(page, ‘html.parser’)
 
# Take out the <div> of name and get its value
 name_box = soup.find(‘h1’, attrs={‘class’: ‘name’})
 name = name_box.text.strip() # strip() is used to remove starting and trailing
 
# get the index price
 price_box = soup.find(‘div’, attrs={‘class’:’price’})
 price = price_box.text
 
# save the data in tuple
 data.append((name, price))

Ngoài ra, hãy sửa đổi phần lưu để lưu dữ liệu theo từng hàng.

# open a csv file with append, so old data will not be erased
with open(‘index.csv’, ‘a’) as csv_file:
 writer = csv.writer(csv_file)
 # The for loop
 for name, price in data:
 writer.writerow([name, price, datetime.now()])

Chạy lại chương trình và bạn sẽ có thể trích xuất hai chỉ số cùng một lúc!

Đọc thêm  Cách sử dụng Elaticsearch, Logstash và Kibana để trực quan hóa nhật ký trong Python trong thời gian thực

Kỹ thuật cạo nâng cao

BeautifulSoup rất đơn giản và tuyệt vời để quét web quy mô nhỏ. Nhưng nếu bạn quan tâm đến việc thu thập dữ liệu ở quy mô lớn hơn, bạn nên cân nhắc sử dụng các lựa chọn thay thế khác sau:

  1. Scrapy, một framework cạo python mạnh mẽ
  2. Cố gắng tích hợp mã của bạn với một số API công khai. Hiệu quả của việc truy xuất dữ liệu cao hơn nhiều so với việc cạo các trang web. Ví dụ: hãy xem Facebook Graph API, API này có thể giúp bạn lấy dữ liệu ẩn không hiển thị trên các trang web Facebook.
  3. Cân nhắc sử dụng phần phụ trợ cơ sở dữ liệu như MySQL để lưu trữ dữ liệu của bạn khi dữ liệu quá lớn.

Áp dụng phương pháp DRY

e71XWhRmRZLario-leNUQuWlNwrMzZXv-e8n

DRY là viết tắt của cụm từ “Don’t Repeat Yourself”, hãy cố gắng tự động hóa các công việc hàng ngày của bạn giống như người này. Một số dự án thú vị khác để xem xét có thể là theo dõi thời gian hoạt động của bạn bè trên Facebook của bạn (tất nhiên là với sự đồng ý của họ) hoặc lấy danh sách các chủ đề trong diễn đàn và thử xử lý ngôn ngữ tự nhiên (đây là một chủ đề nóng cho Trí tuệ nhân tạo phải không? hiện nay)!

Nếu bạn có bất kỳ câu hỏi nào, xin vui lòng để lại nhận xét bên dưới.

Người giới thiệu
http://www.gregreda.com/2013/03/03/web-scraping-101-with-python/
http://www.analyticsvidhya.com/blog/2015/10/beginner-guide-web-scraping-Beautiful-soup-python/

Bài viết này ban đầu được xuất bản trên blog của Altitude Labs và được viết bởi kỹ sư phần mềm của chúng tôi, Leonard Mok. Altitude Labs là một công ty phần mềm chuyên về các ứng dụng React dành cho thiết bị di động được cá nhân hóa.



Zik.vn – Biên dịch & Biên soạn Lại

spot_img

Create a website from scratch

Just drag and drop elements in a page to get started with Newspaper Theme.

Buy Now ⟶

Bài viết liên quang

DMCA.com Protection Status