Hướng dẫn how do you scrape an html table in python? - làm thế nào để bạn cạo một bảng html trong python?

Dữ liệu dạng bảng là một trong những nguồn dữ liệu tốt nhất trên web. Họ có thể lưu trữ một lượng lớn thông tin hữu ích mà không mất định dạng dễ đọc, biến nó thành mỏ vàng cho các dự án liên quan đến dữ liệu.

Cho dù đó là để loại bỏ dữ liệu bóng đá hoặc trích xuất dữ liệu thị trường chứng khoán, chúng ta có thể sử dụng Python để nhanh chóng truy cập, phân tích và trích xuất dữ liệu từ các bảng HTML, nhờ các yêu cầu và súp đẹp.

Ngoài ra, chúng tôi có một chút bất ngờ đen trắng cho bạn vào cuối, vì vậy hãy tiếp tục đọc!

Hiểu cấu trúc bảng HTML

Trực quan, một bảng HTML là một tập hợp các hàng và cột hiển thị thông tin ở định dạng bảng. Đối với hướng dẫn này, chúng tôi sẽ cạo bảng trên:

Hướng dẫn how do you scrape an html table in python? - làm thế nào để bạn cạo một bảng html trong python?

Để có thể xóa dữ liệu trong bảng này, chúng tôi sẽ cần đi sâu hơn một chút vào mã hóa của nó.

Nói chung, các bảng HTML thực sự được xây dựng bằng cách sử dụng các thẻ HTML sau:

  • : Nó đánh dấu sự khởi đầu của bảng HTML
  • hoặc: định nghĩa một hàng là tiêu đề của bảng
  • : Cho biết phần nơi dữ liệu là
  • : Cho biết một hàng trong bảng
  • : Xác định một ô trong bảng

Tuy nhiên, như chúng ta sẽ thấy trong các kịch bản ngoài đời thực, không phải tất cả các nhà phát triển đều tôn trọng các quy ước này khi xây dựng bảng của họ, khiến một số dự án trở nên khó khăn hơn những dự án khác. Tuy nhiên, hiểu cách họ làm việc là rất quan trọng để tìm ra cách tiếp cận đúng đắn.

Hãy cùng nhập vào bảng URL URL (https://datatables.net/examples/styling/stripe.html) trong trình duyệt của chúng tôi và kiểm tra trang để xem những gì xảy ra dưới mui xe.

Hướng dẫn how do you scrape an html table in python? - làm thế nào để bạn cạo một bảng html trong python?

Đây là lý do tại sao đây là một trang tuyệt vời để thực hành quét dữ liệu bảng với Python. Có một cặp thẻ rõ ràng mở và đóng bảng và tất cả các dữ liệu liên quan nằm trong thẻ. Nó chỉ hiển thị mười hàng phù hợp với số lượng mục được chọn ở phía trước.

Hướng dẫn how do you scrape an html table in python? - làm thế nào để bạn cạo một bảng html trong python?

Một vài điều nữa cần biết về bảng này là nó có tổng cộng 57 mục mà chúng tôi muốn cạo và dường như có hai giải pháp để truy cập dữ liệu. Đầu tiên là nhấp vào menu thả xuống và chọn 100 100, để hiển thị tất cả các mục:

Hướng dẫn how do you scrape an html table in python? - làm thế nào để bạn cạo một bảng html trong python?

Hoặc nhấp vào nút tiếp theo để di chuyển qua phân trang.

Hướng dẫn how do you scrape an html table in python? - làm thế nào để bạn cạo một bảng html trong python?

Vậy cái nào sẽ là? Một trong hai giải pháp này sẽ thêm sự phức tạp hơn vào tập lệnh của chúng tôi, do đó, hãy để kiểm tra xem dữ liệu được rút ra từ đầu tiên.

Tất nhiên, vì đây là bảng HTML, tất cả dữ liệu phải có trên tệp HTML mà không cần tiêm AJAX. Để xác minh điều này, nhấp chuột phải> Xem nguồn trang. Tiếp theo, sao chép một vài ô và tìm kiếm chúng trong mã nguồn.

Hướng dẫn how do you scrape an html table in python? - làm thế nào để bạn cạo một bảng html trong python?

Chúng tôi đã làm điều tương tự cho một vài mục khác từ các ô được phân trang khác nhau và vâng, có vẻ như tất cả dữ liệu mục tiêu của chúng tôi đều ở đó mặc dù mặt trước không hiển thị nó.

Và với thông tin này, chúng tôi đã sẵn sàng để chuyển sang mã!

Cán bàn HTML bằng súp đẹp Python

Bởi vì tất cả dữ liệu của nhân viên mà chúng tôi đang tìm cách cạo đều nằm trên tệp HTML, chúng tôi có thể sử dụng thư viện yêu cầu để gửi yêu cầu HTTP và phân tích trả lời bằng súp đẹp.

Lưu ý: Nếu bạn mới sử dụng máy quét web, chúng tôi đã tạo ra một bản dựng web trong hướng dẫn Python cho người mới bắt đầu. Mặc dù bạn có thể theo dõi mà không cần kinh nghiệm, nhưng nó luôn luôn là một ý tưởng tốt để bắt đầu từ những điều cơ bản. If you’re new to web scraping, we’ve created a web scraping in Python tutorial for beginners. Although you’ll be able to follow along without experience, it’s always a good idea to start from the basics.

1. Gửi yêu cầu chính của chúng tôi

Hãy để tạo ra một thư mục mới cho dự án có tên Python-HTML-Table, sau đó là một thư mục mới có tên BS4-Table-SCRAPER và cuối cùng, tạo tệp python_table_scraper.py mới.54 mới.

Từ thiết bị đầu cuối, hãy để Lừa ____ và nhập chúng vào dự án của chúng tôi như sau:

import requests<br />from bs4 import BeautifulSoup

Để gửi các yêu cầu HTTP với các yêu cầu, tất cả những gì chúng tôi cần làm là đặt URL và chuyển nó qua các yêu cầu.get (), lưu trữ HTML được trả về bên trong một biến phản hồi và in phản hồi.status_code.

Lưu ý: Nếu bạn hoàn toàn mới đối với Python, bạn có thể chạy mã của mình từ thiết bị đầu cuối với lệnh python3 python_table_scraper.py.

url = 'https://datatables.net/examples/styling/stripe.html'</p><p>response = requests.get(url)</p><p>print(response.status_code)

Nếu nó hoạt động, nó sẽ trả lại mã trạng thái 200. Bất cứ điều gì khác có nghĩa là IP của bạn đang bị từ chối bởi các hệ thống chống xẹp mà trang web đã đặt. Một giải pháp tiềm năng là thêm các tiêu đề tùy chỉnh vào tập lệnh của bạn để làm cho tập lệnh của bạn trông giống con người hơn - nhưng điều đó có thể không đủ. Một giải pháp khác là sử dụng API quét web để xử lý tất cả những phức tạp này cho bạn.

2. Tích hợp Scraperapi để tránh các hệ thống chống xẹp

Scraperapi là một giải pháp thanh lịch để tránh hầu hết mọi loại kỹ thuật chống xẹp. Nó sử dụng học máy và nhiều năm phân tích thống kê để xác định các tiêu đề và kết hợp IP tốt nhất để truy cập dữ liệu, xử lý các captchas và xoay IP của bạn giữa mỗi yêu cầu.

Để bắt đầu, hãy để Lôi tạo một tài khoản miễn phí mới của Scraperapi để đổi 5000 API miễn phí và khóa API của chúng tôi. Từ bảng điều khiển tài khoản của chúng tôi, chúng tôi có thể sao chép giá trị chính của mình để xây dựng URL của yêu cầu.

http://api.scraperapi.com?api_key={Your_API_KEY}&amp;amp;amp;amp;amp;url={TARGET_URL}

Theo cấu trúc này, chúng tôi thay thế các chủ sở hữu bằng dữ liệu của chúng tôi và gửi lại yêu cầu của chúng tôi:

import requests<br />from bs4 import BeautifulSoup</p><p>url = 'http://api.scraperapi.com?api_key=51e43be283e4db2a5afbxxxxxxxxxxxx&amp;amp;amp;amp;amp;url=https://datatables.net/examples/styling/stripe.html'</p><p>response = requests.get(url)</p><p>print(response.status_code)

Hướng dẫn how do you scrape an html table in python? - làm thế nào để bạn cạo một bảng html trong python?

Tuyệt vời, nó làm việc mà không có Hiccup!

3. Xây dựng trình phân tích cú pháp bằng súp đẹp

Trước khi chúng tôi có thể trích xuất dữ liệu, chúng tôi cần biến HTML thô thành dữ liệu được định dạng hoặc phân tích cú pháp. Chúng tôi sẽ lưu trữ HTML phân tích cú pháp này vào một đối tượng súp như thế này:

soup = BeautifulSoup(response.text, 'html.parser')

Từ đây, chúng ta có thể đi qua cây phân tích bằng cách sử dụng các thẻ HTML và các thuộc tính của chúng.

Nếu chúng tôi quay lại bảng trên trang, chúng tôi đã thấy rằng bảng được đặt giữa các thẻ

http://api.scraperapi.com?api_key={Your_API_KEY}&amp;amp;amp;amp;amp;url={TARGET_URL}
1 với lớp
http://api.scraperapi.com?api_key={Your_API_KEY}&amp;amp;amp;amp;amp;url={TARGET_URL}
2 mà chúng tôi có thể sử dụng để chọn bảng.

table = soup.find('table', class_ = 'stripe')<br />print(table)

Lưu ý: Sau khi thử nghiệm, thêm lớp thứ hai (DataTable) đã không trả về phần tử. Trên thực tế, trong các phần tử trở lại, lớp bảng Bảng chỉ là sọc. Bạn cũng có thể sử dụng ID = ‘ví dụ. After testing, adding the second class (dataTable) didn’t return the element. In fact, in the return elements, the table’s class is only stripe. You can also use id = ‘example’.

Đây là những gì nó trở lại:

Hướng dẫn how do you scrape an html table in python? - làm thế nào để bạn cạo một bảng html trong python?

Bây giờ chúng tôi đã lấy bảng, chúng tôi có thể lặp qua các hàng và lấy dữ liệu chúng tôi muốn.

4. Vòng lặp qua bảng HTML

Suy nghĩ lại về cấu trúc bảng, mỗi hàng được biểu thị bằng phần tử

http://api.scraperapi.com?api_key={Your_API_KEY}&amp;amp;amp;amp;amp;url={TARGET_URL}
3 và trong đó có phần tử
http://api.scraperapi.com?api_key={Your_API_KEY}&amp;amp;amp;amp;amp;url={TARGET_URL}
4 chứa dữ liệu, tất cả điều này được bao bọc giữa một cặp thẻ
http://api.scraperapi.com?api_key={Your_API_KEY}&amp;amp;amp;amp;amp;url={TARGET_URL}
5.

Để trích xuất dữ liệu, chúng tôi sẽ tạo hai cho ngoại hình, một để lấy phần

http://api.scraperapi.com?api_key={Your_API_KEY}&amp;amp;amp;amp;amp;url={TARGET_URL}
5 của bảng (nơi tất cả các hàng) và một để lưu trữ tất cả các hàng vào một biến chúng tôi có thể sử dụng:

for employee_data in table.find_all('tbody'):<br />rows = employee_data.find_all('tr')<br />print(rows)

Trong các hàng, chúng tôi sẽ lưu trữ tất cả các yếu tố

http://api.scraperapi.com?api_key={Your_API_KEY}&amp;amp;amp;amp;amp;url={TARGET_URL}
3 được tìm thấy trong phần cơ thể của bảng. Nếu bạn theo dõi logic của chúng tôi, bước tiếp theo là lưu trữ từng hàng riêng lẻ vào một đối tượng và lặp qua chúng để tìm dữ liệu mong muốn.

Để bắt đầu, hãy để Lôi cố gắng chọn tên nhân viên đầu tiên trên bảng điều khiển trình duyệt của chúng tôi bằng cách sử dụng phương thức .QuerySelectorall (). Một tính năng thực sự sử dụng của phương pháp này là chúng ta có thể đi sâu hơn và sâu hơn vào hệ thống phân cấp thực hiện biểu tượng lớn hơn (>) để xác định phần tử cha (ở bên trái) và đứa trẻ chúng ta muốn lấy (ở bên phải).

document.querySelectorAll('table.stripe &amp;amp;amp;amp;gt; tbody &amp;amp;amp;amp;gt; tr &amp;amp;amp;amp;gt; td')[0]

Hướng dẫn how do you scrape an html table in python? - làm thế nào để bạn cạo một bảng html trong python?

Điều đó không thể làm việc tốt hơn. Như bạn thấy, một khi chúng ta lấy tất cả các yếu tố, chúng trở thành một gật đầu. Bởi vì chúng ta có thể dựa vào một lớp để lấy từng ô, tất cả những gì chúng ta cần biết là vị trí của họ trong chỉ mục và cái đầu tiên, tên, là 0.

Từ đó, chúng ta có thể viết mã của mình như thế này:

 for row in rows:<br />name = row.find_all('td')[0].text<br />print(name)

Nói một cách đơn giản, chúng tôi sẽ thực hiện từng hàng, từng cái một và tìm tất cả các ô bên trong, một khi chúng tôi có danh sách, chúng tôi chỉ lấy cái đầu tiên trong chỉ mục (vị trí 0) và kết thúc với phương thức .text để chỉ Lấy văn bản của phần tử, bỏ qua dữ liệu HTML mà chúng ta không cần.

Hướng dẫn how do you scrape an html table in python? - làm thế nào để bạn cạo một bảng html trong python?

Họ ở đó, một danh sách với tất cả các tên nhân viên tên! Đối với phần còn lại, chúng tôi chỉ theo cùng một logic:

 position = row.find_all('td')[1].text<br />office = row.find_all('td')[2].text<br />age = row.find_all('td')[3].text<br />start_date = row.find_all('td')[4].text<br />salary = row.find_all('td')[5].text

Tuy nhiên, có tất cả dữ liệu này được in trên bảng điều khiển của chúng tôi là siêu hữu ích. Thay vào đó, hãy để lưu trữ dữ liệu này thành một định dạng mới, hữu ích hơn.

5. Lưu trữ dữ liệu bảng vào tệp JSON

Mặc dù chúng tôi có thể dễ dàng tạo một tệp CSV và gửi dữ liệu của chúng tôi ở đó, nhưng đó sẽ là định dạng quản lý nhất nếu chúng tôi có thể tạo một cái gì đó mới bằng cách sử dụng dữ liệu bị xóa.

Tuy nhiên, ở đây, một dự án mà chúng tôi đã thực hiện vài tháng trước để giải thích cách tạo tệp CSV để lưu trữ dữ liệu bị xóa.

Tin tốt là Python có mô -đun JSON của riêng mình để làm việc với các đối tượng JSON, vì vậy chúng tôi không cần phải cài đặt bất cứ thứ gì, chỉ cần nhập nó.

url = 'https://datatables.net/examples/styling/stripe.html'</p><p>response = requests.get(url)</p><p>print(response.status_code)
0

Nhưng, trước khi chúng tôi có thể tiếp tục và tạo tệp JSON của mình, chúng tôi sẽ cần biến tất cả dữ liệu đã bị xóa này thành một danh sách. Để làm như vậy, chúng tôi sẽ tạo ra một mảng trống bên ngoài vòng lặp của chúng tôi.

url = 'https://datatables.net/examples/styling/stripe.html'</p><p>response = requests.get(url)</p><p>print(response.status_code)
1

Và sau đó nối dữ liệu vào nó, với mỗi vòng lặp nối lại một đối tượng mới vào mảng.

url = 'https://datatables.net/examples/styling/stripe.html'</p><p>response = requests.get(url)</p><p>print(response.status_code)
2

Nếu chúng ta

http://api.scraperapi.com?api_key={Your_API_KEY}&amp;amp;amp;amp;amp;url={TARGET_URL}
8, thì đây là kết quả:

Hướng dẫn how do you scrape an html table in python? - làm thế nào để bạn cạo một bảng html trong python?

Vẫn còn một chút lộn xộn, nhưng chúng tôi có một bộ các đối tượng sẵn sàng biến thành JSON.

Lưu ý: Như một bài kiểm tra, chúng tôi đã in chiều dài

http://api.scraperapi.com?api_key={Your_API_KEY}&amp;amp;amp;amp;amp;url={TARGET_URL}
9 và nó đã trả lại 57, đây là số lượng các hàng chính xác mà chúng tôi đã cạo (các hàng hiện là đối tượng trong mảng). As a test, we printed the length of
http://api.scraperapi.com?api_key={Your_API_KEY}&amp;amp;amp;amp;amp;url={TARGET_URL}
9 and it returned 57, which is the correct number of rows we scraped (rows now being objects within the array).

Nhập danh sách vào JSON chỉ yêu cầu hai dòng mã:

url = 'https://datatables.net/examples/styling/stripe.html'</p><p>response = requests.get(url)</p><p>print(response.status_code)
3
  • Đầu tiên, chúng tôi mở một tệp mới truyền trong tên chúng tôi muốn cho tệp
    import requests<br />from bs4 import BeautifulSoup</p><p>url = 'http://api.scraperapi.com?api_key=51e43be283e4db2a5afbxxxxxxxxxxxx&amp;amp;amp;amp;amp;url=https://datatables.net/examples/styling/stripe.html'</p><p>response = requests.get(url)</p><p>print(response.status_code)
    0 và ‘W, vì chúng tôi muốn viết dữ liệu cho nó.
  • Tiếp theo, chúng tôi sử dụng chức năng
    import requests<br />from bs4 import BeautifulSoup</p><p>url = 'http://api.scraperapi.com?api_key=51e43be283e4db2a5afbxxxxxxxxxxxx&amp;amp;amp;amp;amp;url=https://datatables.net/examples/styling/stripe.html'</p><p>response = requests.get(url)</p><p>print(response.status_code)
    1 để hủy dữ liệu từ mảng
    import requests<br />from bs4 import BeautifulSoup</p><p>url = 'http://api.scraperapi.com?api_key=51e43be283e4db2a5afbxxxxxxxxxxxx&amp;amp;amp;amp;amp;url=https://datatables.net/examples/styling/stripe.html'</p><p>response = requests.get(url)</p><p>print(response.status_code)
    2
    http://api.scraperapi.com?api_key={Your_API_KEY}&amp;amp;amp;amp;amp;url={TARGET_URL}
    9
    import requests<br />from bs4 import BeautifulSoup</p><p>url = 'http://api.scraperapi.com?api_key=51e43be283e4db2a5afbxxxxxxxxxxxx&amp;amp;amp;amp;amp;url=https://datatables.net/examples/styling/stripe.html'</p><p>response = requests.get(url)</p><p>print(response.status_code)
    4 và
    import requests<br />from bs4 import BeautifulSoup</p><p>url = 'http://api.scraperapi.com?api_key=51e43be283e4db2a5afbxxxxxxxxxxxx&amp;amp;amp;amp;amp;url=https://datatables.net/examples/styling/stripe.html'</p><p>response = requests.get(url)</p><p>print(response.status_code)
    5 để mọi đối tượng có dòng riêng của nó thay vì mọi thứ trong một dòng không thể đọc được.

6. Chạy tập lệnh và mã đầy đủ

Nếu bạn đã theo dõi, cơ sở mã của bạn sẽ trông như thế này:your codebase should look like this:

url = 'https://datatables.net/examples/styling/stripe.html'</p><p>response = requests.get(url)</p><p>print(response.status_code)
4

Lưu ý: Chúng tôi đã thêm một số ý kiến ​​cho bối cảnh. We added some comments for context.

Và ở đây, một cái nhìn về ba đối tượng đầu tiên từ tệp JSON:

Hướng dẫn how do you scrape an html table in python? - làm thế nào để bạn cạo một bảng html trong python?

Lưu trữ dữ liệu được cạo ở định dạng JSON cho phép chúng tôi tái sử dụng thông tin cho các ứng dụng mới hoặc

Cạo bảng HTML bằng gấu trúc bằng cách sử dụng gấu trúc

Trước khi bạn rời khỏi trang, chúng tôi muốn khám phá một cách tiếp cận thứ hai để cạo các bảng HTML. Trong một vài dòng mã, chúng ta có thể xóa tất cả dữ liệu bảng từ tài liệu HTML và lưu trữ nó vào một dataFrame bằng gấu trúc.

Tạo một thư mục mới bên trong thư mục dự án (chúng tôi đặt tên nó là Pandas-HTML-Table-SCRAPER) và tạo một tên tệp mới pandas_table_scraper.py.

Hãy để mở một thiết bị đầu cuối mới và điều hướng đến thư mục chúng tôi vừa tạo (CD PANDAS-HTML-Table-SCRAPER) và từ đó cài đặt Pandas:

url = 'https://datatables.net/examples/styling/stripe.html'</p><p>response = requests.get(url)</p><p>print(response.status_code)
5

Và chúng tôi nhập nó ở đầu tệp.

url = 'https://datatables.net/examples/styling/stripe.html'</p><p>response = requests.get(url)</p><p>print(response.status_code)
6

Pandas có một hàm gọi là read_html () về cơ bản xóa URL mục tiêu cho chúng tôi và trả về tất cả các bảng HTML dưới dạng danh sách các đối tượng DataFrame.

Tuy nhiên, để hoạt động này, bảng HTML cần được cấu trúc ít nhất là phần nào, vì hàm sẽ tìm kiếm các yếu tố muốn xác định các bảng trên tệp.

Để sử dụng chức năng, hãy để Lôi tạo một biến mới và truyền URL mà chúng tôi đã sử dụng trước đây cho nó:

url = 'https://datatables.net/examples/styling/stripe.html'</p><p>response = requests.get(url)</p><p>print(response.status_code)
7

Khi in nó, nó sẽ trả về một danh sách các bảng HTML trong trang.

Hướng dẫn how do you scrape an html table in python? - làm thế nào để bạn cạo một bảng html trong python?

Nếu chúng ta so sánh ba hàng đầu tiên trong DataFrame, chúng là một kết hợp hoàn hảo với những gì chúng ta đã cạo với súp đẹp.

Để làm việc với JSON, Pandas có thể có một kết thúc .to_json () tích hợp. Nó sẽ chuyển đổi một danh sách các đối tượng DataFrame thành chuỗi JSON

Tất cả những gì chúng ta cần làm là gọi phương thức trên DataFrame của chúng tôi và vượt qua đường dẫn, định dạng (chia, dữ liệu, hồ sơ, chỉ mục, v.v.) và thêm thụt lề để làm cho nó dễ đọc hơn:

url = 'https://datatables.net/examples/styling/stripe.html'</p><p>response = requests.get(url)</p><p>print(response.status_code)
8

Nếu chúng tôi chạy mã của chúng tôi ngay bây giờ, thì đây là tệp kết quả:

Hướng dẫn how do you scrape an html table in python? - làm thế nào để bạn cạo một bảng html trong python?

Lưu ý rằng chúng tôi cần chọn bảng của mình từ chỉ mục ([0]) vì .read_html () trả về danh sách không phải là một đối tượng.

Tại đây, mã đầy đủ cho tài liệu tham khảo của bạn:

url = 'https://datatables.net/examples/styling/stripe.html'</p><p>response = requests.get(url)</p><p>print(response.status_code)
9

Được trang bị kiến ​​thức mới này, bạn đã sẵn sàng để bắt đầu cạo hầu như bất kỳ bảng HTML nào trên web. Chỉ cần nhớ rằng nếu bạn hiểu cách cấu trúc trang web và logic đằng sau nó, thì không có gì bạn có thể cạo.

Điều đó nói rằng, các phương pháp này sẽ chỉ hoạt động miễn là dữ liệu nằm trong tệp HTML. Nếu bạn gặp phải một bảng được tạo động, bạn sẽ cần tìm một cách tiếp cận mới. Đối với các loại bảng này, chúng tôi đã tạo ra một hướng dẫn từng bước để cạo các bảng JavaScript bằng Python mà không cần các trình duyệt không đầu.

Cho đến lần sau, hạnh phúc cào!

Làm thế nào trích xuất bảng HTML từ Python?

Để trích xuất một bảng từ HTML, trước tiên bạn cần mở các công cụ nhà phát triển của mình để xem HTML trông như thế nào và xác minh xem nó có thực sự là một bảng chứ không phải một số yếu tố khác.Bạn mở các công cụ của nhà phát triển bằng khóa F12, xem tab Phần tử trực tuyến và làm nổi bật phần tử mà bạn quan tâm.open developer tools with the F12 key, see the “Elements” tab, and highlight the element you're interested in.

Web có được cào với Python hợp pháp không?

Từ tất cả các cuộc thảo luận trên, có thể kết luận rằng việc cạo web thực sự không phải là bất hợp pháp nhưng một người nên có đạo đức trong khi làm điều đó.Nếu được thực hiện theo một cách tốt, việc cạo web có thể giúp chúng tôi sử dụng tốt nhất web, ví dụ lớn nhất là công cụ tìm kiếm của Google.Web Scraping is actually not illegal on its own but one should be ethical while doing it. If done in a good way, Web Scraping can help us to make the best use of the web, the biggest example of which is Google Search Engine.