Python Web Scraping - Trích xuất dữ liệu

Phân tích một trang web có nghĩa là hiểu cấu trúc của nó. Bây giờ, câu hỏi được đặt ra là tại sao nó lại quan trọng đối với việc quét web? Trong chương này, chúng ta hãy hiểu chi tiết điều này.

Phân tích trang web

Phân tích trang web rất quan trọng vì nếu không phân tích, chúng ta không thể biết chúng ta sẽ nhận dữ liệu từ dạng nào (có cấu trúc hoặc không có cấu trúc) trang web đó sau khi trích xuất. Chúng tôi có thể phân tích trang web theo những cách sau:

Xem nguồn trang

Đây là một cách để hiểu cách một trang web được cấu trúc bằng cách kiểm tra mã nguồn của nó. Để thực hiện điều này, chúng ta cần nhấp chuột phải vào trang và sau đó phải chọnView page sourceLựa chọn. Sau đó, chúng tôi sẽ lấy dữ liệu mà chúng tôi quan tâm từ trang web đó dưới dạng HTML. Nhưng mối quan tâm chính là về khoảng trắng và định dạng mà chúng tôi khó định dạng.

Kiểm tra nguồn trang bằng cách nhấp vào tùy chọn kiểm tra phần tử

Đây là một cách khác để phân tích trang web. Nhưng sự khác biệt là nó sẽ giải quyết vấn đề định dạng và khoảng trắng trong mã nguồn của trang web. Bạn có thể thực hiện điều này bằng cách nhấp chuột phải và sau đó chọnInspect hoặc là Inspect elementtùy chọn từ menu. Nó sẽ cung cấp thông tin về khu vực hoặc phần tử cụ thể của trang web đó.

Các cách khác nhau để trích xuất dữ liệu từ trang web

Các phương pháp sau chủ yếu được sử dụng để trích xuất dữ liệu từ một trang web:

Biểu hiện thông thường

Chúng là ngôn ngữ lập trình chuyên biệt cao được nhúng trong Python. Chúng ta có thể sử dụng nó thông quaremô-đun của Python. Nó còn được gọi là RE hoặc regexes hoặc các mẫu regex. Với sự trợ giúp của biểu thức chính quy, chúng ta có thể chỉ định một số quy tắc cho tập hợp các chuỗi có thể mà chúng ta muốn đối sánh từ dữ liệu.

Nếu bạn muốn tìm hiểu thêm về biểu thức chính quy nói chung, hãy truy cập liên kết https://www.tutorialspoint.com/automata_theory/regular_expressions.htmvà nếu bạn muốn biết thêm về mô-đun re hoặc biểu thức chính quy trong Python, bạn có thể theo liên kết https://www.tutorialspoint.com/python/python_reg_expressions.htm .

Thí dụ

Trong ví dụ sau, chúng tôi sẽ thu thập dữ liệu về Ấn Độ từ http://example.webscraping.com sau khi khớp nội dung của <td> với sự trợ giúp của biểu thức chính quy.

import re
import urllib.request
response =
   urllib.request.urlopen('http://example.webscraping.com/places/default/view/India-102')
html = response.read()
text = html.decode()
re.findall('<td class="w2p_fw">(.*?)</td>',text)

Đầu ra

Đầu ra tương ứng sẽ được hiển thị ở đây -

[
   '<img src="/places/static/images/flags/in.png" />',
   '3,287,590 square kilometres',
   '1,173,108,018',
   'IN',
   'India',
   'New Delhi',
   '<a href="/places/default/continent/AS">AS</a>',
   '.in',
   'INR',
   'Rupee',
   '91',
   '######',
   '^(\\d{6})$',
   'enIN,hi,bn,te,mr,ta,ur,gu,kn,ml,or,pa,as,bh,sat,ks,ne,sd,kok,doi,mni,sit,sa,fr,lus,inc',
   '<div>
      <a href="/places/default/iso/CN">CN </a>
      <a href="/places/default/iso/NP">NP </a>
      <a href="/places/default/iso/MM">MM </a>
      <a href="/places/default/iso/BT">BT </a>
      <a href="/places/default/iso/PK">PK </a>
      <a href="/places/default/iso/BD">BD </a>
   </div>'
]

Quan sát rằng trong kết quả đầu ra ở trên, bạn có thể xem chi tiết về đất nước Ấn Độ bằng cách sử dụng biểu thức chính quy.

Súp đẹp

Giả sử chúng ta muốn thu thập tất cả các siêu liên kết từ một trang web, thì chúng ta có thể sử dụng một trình phân tích cú pháp tên là BeautifulSoup, có thể được biết chi tiết hơn tại https://www.crummy.com/software/BeautifulSoup/bs4/doc/.Nói một cách dễ hiểu, BeautifulSoup là một thư viện Python để kéo dữ liệu ra khỏi các tệp HTML và XML. Nó có thể được sử dụng với các yêu cầu, bởi vì nó cần một đầu vào (tài liệu hoặc url) để tạo một đối tượng súp vì nó không thể tự tìm nạp một trang web. Bạn có thể sử dụng tập lệnh Python sau để thu thập tiêu đề của trang web và các siêu liên kết.

Cài đặt Beautiful Soup

Sử dụng pip lệnh, chúng ta có thể cài đặt beautifulsoup trong môi trường ảo của chúng tôi hoặc trong cài đặt toàn cầu.

(base) D:\ProgramData>pip install bs4
Collecting bs4
   Downloading
https://files.pythonhosted.org/packages/10/ed/7e8b97591f6f456174139ec089c769f89
a94a1a4025fe967691de971f314/bs4-0.0.1.tar.gz
Requirement already satisfied: beautifulsoup4 in d:\programdata\lib\sitepackages
(from bs4) (4.6.0)
Building wheels for collected packages: bs4
   Running setup.py bdist_wheel for bs4 ... done
   Stored in directory:
C:\Users\gaurav\AppData\Local\pip\Cache\wheels\a0\b0\b2\4f80b9456b87abedbc0bf2d
52235414c3467d8889be38dd472
Successfully built bs4
Installing collected packages: bs4
Successfully installed bs4-0.0.1

Thí dụ

Lưu ý rằng trong ví dụ này, chúng tôi đang mở rộng ví dụ trên được triển khai với mô-đun python yêu cầu. chúng tôi đang sử dụngr.text để tạo một đối tượng súp sẽ tiếp tục được sử dụng để tìm nạp các chi tiết như tiêu đề của trang web.

Đầu tiên, chúng ta cần nhập các mô-đun Python cần thiết -

import requests
from bs4 import BeautifulSoup

Trong dòng mã sau, chúng tôi sử dụng các yêu cầu để thực hiện một yêu cầu GET HTTP cho url: https://authoraditiagarwal.com/ bằng cách đưa ra yêu cầu GET.

r = requests.get('https://authoraditiagarwal.com/')

Bây giờ chúng ta cần tạo một đối tượng Soup như sau:

soup = BeautifulSoup(r.text, 'lxml')
print (soup.title)
print (soup.title.text)

Đầu ra

Đầu ra tương ứng sẽ được hiển thị ở đây -

<title>Learn and Grow with Aditi Agarwal</title>
Learn and Grow with Aditi Agarwal

Lxml

Một thư viện Python khác mà chúng ta sẽ thảo luận để tìm kiếm web là lxml. Nó là một thư viện phân tích cú pháp HTML và XML hiệu suất cao. Nó tương đối nhanh và đơn giản. Bạn có thể đọc thêm về nó trênhttps://lxml.de/.

Cài đặt lxml

Sử dụng lệnh pip, chúng ta có thể cài đặt lxml trong môi trường ảo của chúng tôi hoặc trong cài đặt toàn cầu.

(base) D:\ProgramData>pip install lxml
Collecting lxml
   Downloading
https://files.pythonhosted.org/packages/b9/55/bcc78c70e8ba30f51b5495eb0e
3e949aa06e4a2de55b3de53dc9fa9653fa/lxml-4.2.5-cp36-cp36m-win_amd64.whl
(3.
6MB)
   100% |¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 3.6MB 64kB/s
Installing collected packages: lxml
Successfully installed lxml-4.2.5

Ví dụ: Trích xuất dữ liệu bằng lxml và các yêu cầu

Trong ví dụ sau, chúng tôi đang loại bỏ một phần tử cụ thể của trang web từ authoraditiagarwal.com bằng cách sử dụng lxml và các yêu cầu -

Đầu tiên, chúng ta cần nhập các yêu cầu và html từ thư viện lxml như sau:

import requests
from lxml import html

Bây giờ chúng tôi cần cung cấp url của trang web để tìm kiếm

url = 'https://authoraditiagarwal.com/leadershipmanagement/'

Bây giờ chúng ta cần cung cấp đường dẫn (Xpath) thành phần cụ thể của trang web đó -

path = '//*[@id="panel-836-0-0-1"]/div/div/p[1]'
response = requests.get(url)
byte_string = response.content
source_code = html.fromstring(byte_string)
tree = source_code.xpath(path)
print(tree[0].text_content())

Đầu ra

Đầu ra tương ứng sẽ được hiển thị ở đây -

The Sprint Burndown or the Iteration Burndown chart is a powerful tool to communicate
daily progress to the stakeholders. It tracks the completion of work for a given sprint
or an iteration. The horizontal axis represents the days within a Sprint. The vertical 
axis represents the hours remaining to complete the committed work.