HomeLập trìnhPythonQuét web tốt...

Quét web tốt hơn bằng Python với Selenium, Beautiful Soup và pandas


bởi Dave Grey

Rút trích nội dung trang web

Sử dụng ngôn ngữ lập trình Python, có thể “cạo” dữ liệu từ trang web một cách nhanh chóng và hiệu quả.

Quét web được định nghĩa là:

một công cụ để biến dữ liệu phi cấu trúc trên web thành dữ liệu có cấu trúc, có thể đọc được bằng máy và sẵn sàng để phân tích. (nguồn)

Quét web là một công cụ có giá trị trong bộ kỹ năng của nhà khoa học dữ liệu.

Bây giờ, những gì để cạo?

1*PFcYTwR35sTl2we1WhUuFg
“Tìm kiếm các tùy chọn chi tiết” == Tiếp tục nhấp cho đến khi bạn tìm thấy thứ mình muốn.

Dữ liệu có sẵn công khai

Trang web KanView hỗ trợ “Minh bạch trong Chính phủ”. Đó cũng là khẩu hiệu của trang web. Trang web cung cấp dữ liệu bảng lương cho Bang Kansas. Và điều đó thật tuyệt!

Tuy nhiên, giống như nhiều trang web của chính phủ, nó chôn dữ liệu trong các liên kết và bảng truy sâu xuống. Điều này thường yêu cầu “điều hướng đoán tốt nhất” để tìm dữ liệu cụ thể mà bạn đang tìm kiếm. Tôi muốn sử dụng dữ liệu công khai được cung cấp cho các trường đại học ở Kansas trong một dự án nghiên cứu. Cạo dữ liệu bằng Python và lưu nó dưới dạng JSON là điều tôi cần làm để bắt đầu.

Quét web bằng Python thường không yêu cầu nhiều hơn việc sử dụng mô-đun Beautiful Soup để đạt được mục tiêu. Beautiful Soup là một thư viện Python phổ biến giúp việc quét web bằng cách duyệt qua DOM (mô hình đối tượng tài liệu) dễ thực hiện hơn.

Tuy nhiên, trang web KanView sử dụng liên kết JavaScript. Do đó, các ví dụ sử dụng Python và Beautiful Soup sẽ không hoạt động nếu không có một số bổ sung bổ sung.

1*Xw5kfdCZT3ndmQiK6gFpDA
https://pypi.python.org/pypi/selenium

Selenium để giải cứu

Gói Selenium được sử dụng để tự động hóa tương tác trình duyệt web từ Python. Với Selenium, có thể lập trình tập lệnh Python để tự động hóa trình duyệt web. Sau đó, các liên kết JavaScript phiền phức đó không còn là vấn đề nữa.

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
import re
import pandas as pd
import os

Selenium bây giờ sẽ bắt đầu một phiên trình duyệt. Để Selenium hoạt động, nó phải truy cập trình điều khiển trình duyệt. Theo mặc định, nó sẽ tìm trong cùng thư mục với tập lệnh Python. Liên kết đến trình điều khiển Chrome, Firefox, Edge và Safari có tại đây. Mã ví dụ dưới đây sử dụng Firefox:

#launch url
url = "http://kanview.ks.gov/PayRates/PayRates_Agency.aspx"

# create a new Firefox session
driver = webdriver.Firefox()
driver.implicitly_wait(30)
driver.get(url)

python_button = driver.find_element_by_id('MainContent_uxLevel1_Agencies_uxAgencyBtn_33') #FHSU
python_button.click() #click fhsu link

Các python_button.click() ở trên đang yêu cầu Selenium nhấp vào liên kết JavaScript trên trang. Sau khi đến trang Chức danh công việc, Selenium chuyển nguồn trang cho Beautiful Soup.

Đọc thêm  Cách cài đặt Python 3 trên máy Mac – Hướng dẫn cập nhật cài đặt bia
1*_jcqKfi3H0vETIPeGhiAfg
https://www.crummy.com/software/BeautifulSoup/

Chuyển sang món súp đẹp mắt

Beautiful Soup vẫn là cách tốt nhất để duyệt qua DOM và thu thập dữ liệu. Sau khi xác định một danh sách trống và một biến đếm, đã đến lúc yêu cầu Beautiful Soup lấy tất cả các liên kết trên trang khớp với biểu thức chính quy:

#Selenium hands the page source to Beautiful Soup
soup_level1=BeautifulSoup(driver.page_source, 'lxml')

datalist = [] #empty list
x = 0 #counter

for link in soup_level1.find_all('a', id=re.compile("^MainContent_uxLevel2_JobTitles_uxJobTitleBtn_")):
    ##code to execute in for loop goes here

Bạn có thể thấy từ ví dụ trên rằng Beautiful Soup sẽ lấy một liên kết JavaScript cho mỗi chức danh công việc tại cơ quan nhà nước. Bây giờ trong khối mã của vòng lặp for/in, Selenium sẽ nhấp vào từng liên kết JavaScript. Sau đó, Beautiful Soup sẽ truy xuất bảng từ mỗi trang.

#Beautiful Soup grabs all Job Title links
for link in soup_level1.find_all('a', id=re.compile("^MainContent_uxLevel2_JobTitles_uxJobTitleBtn_")):
    
    #Selenium visits each Job Title page
    python_button = driver.find_element_by_id('MainContent_uxLevel2_JobTitles_uxJobTitleBtn_' + str(x))
    python_button.click() #click link
    
    #Selenium hands of the source of the specific job page to Beautiful Soup
    soup_level2=BeautifulSoup(driver.page_source, 'lxml')

    #Beautiful Soup grabs the HTML table on the page
    table = soup_level2.find_all('table')[0]
    
    #Giving the HTML table to pandas to put in a dataframe object
    df = pd.read_html(str(table),header=0)
    
    #Store the dataframe in a list
    datalist.append(df[0])
    
    #Ask Selenium to click the back button
    driver.execute_script("window.history.go(-1)") 
    
    #increment the counter variable before starting the loop over
    x += 1
1*GB1VDH40BeSMPHcbTYVT9g
https://pandas.pydata.org/

gấu trúc: Thư viện phân tích dữ liệu Python

Beautiful Soup chuyển phát hiện cho gấu trúc. Pandas sử dụng nó read_html để đọc dữ liệu bảng HTML vào một khung dữ liệu. Khung dữ liệu được thêm vào danh sách trống được xác định trước đó.

Đọc thêm  Danh sách đảo ngược Python – Đảo ngược một mảng trong Python

Trước khi khối mã của vòng lặp hoàn tất, Selenium cần nhấp vào nút quay lại trong trình duyệt. Điều này là để liên kết tiếp theo trong vòng lặp sẽ có sẵn để nhấp vào trang danh sách công việc.

Khi vòng lặp for/in đã hoàn thành, Selenium đã truy cập mọi liên kết chức danh công việc. Beautiful Soup đã lấy bảng từ mỗi trang. Pandas đã lưu trữ dữ liệu từ mỗi bảng trong một khung dữ liệu. Mỗi khung dữ liệu là một mục trong datalist. Các khung dữ liệu bảng riêng lẻ hiện phải hợp nhất thành một khung dữ liệu lớn. Dữ liệu sau đó sẽ được chuyển đổi sang định dạng JSON với pandas.Dataframe.to_json:

#loop has completed

#end the Selenium browser session
driver.quit()

#combine all pandas dataframes in the list into one big dataframe
result = pd.concat([pd.DataFrame(datalist[i]) for i in range(len(datalist))],ignore_index=True)

#convert the pandas dataframe to JSON
json_records = result.to_json(orient="records")

Bây giờ Python tạo tệp dữ liệu JSON. Nó đã sẵn sàng để sử dụng!

#get current working directory
path = os.getcwd()

#open, write, and close the file
f = open(path + "\\fhsu_payroll_data.json","w") #FHSU
f.write(json_records)
f.close()

Quá trình tự động diễn ra nhanh chóng

Quá trình quét web tự động được mô tả ở trên hoàn tất nhanh chóng. Selenium mở một cửa sổ trình duyệt mà bạn có thể thấy đang hoạt động. Điều này cho phép tôi cho bạn xem video quay màn hình về tốc độ của quá trình này. Bạn thấy tốc độ mà tập lệnh đi theo một liên kết, lấy dữ liệu, quay lại và nhấp vào liên kết tiếp theo. Nó làm cho việc truy xuất dữ liệu từ hàng trăm liên kết chỉ trong vài phút một chữ số.

Mã Python đầy đủ

Đây là mã Python đầy đủ. Tôi đã bao gồm một lần nhập để lập bảng. Nó yêu cầu một dòng mã bổ sung sẽ sử dụng lập bảng để in dữ liệu vào giao diện dòng lệnh của bạn:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
import re
import pandas as pd
from tabulate import tabulate
import os

#launch url
url = "http://kanview.ks.gov/PayRates/PayRates_Agency.aspx"

# create a new Firefox session
driver = webdriver.Firefox()
driver.implicitly_wait(30)
driver.get(url)

#After opening the url above, Selenium clicks the specific agency link
python_button = driver.find_element_by_id('MainContent_uxLevel1_Agencies_uxAgencyBtn_33') #FHSU
python_button.click() #click fhsu link

#Selenium hands the page source to Beautiful Soup
soup_level1=BeautifulSoup(driver.page_source, 'lxml')

datalist = [] #empty list
x = 0 #counter

#Beautiful Soup finds all Job Title links on the agency page and the loop begins
for link in soup_level1.find_all('a', id=re.compile("^MainContent_uxLevel2_JobTitles_uxJobTitleBtn_")):
    
    #Selenium visits each Job Title page
    python_button = driver.find_element_by_id('MainContent_uxLevel2_JobTitles_uxJobTitleBtn_' + str(x))
    python_button.click() #click link
    
    #Selenium hands of the source of the specific job page to Beautiful Soup
    soup_level2=BeautifulSoup(driver.page_source, 'lxml')

    #Beautiful Soup grabs the HTML table on the page
    table = soup_level2.find_all('table')[0]
    
    #Giving the HTML table to pandas to put in a dataframe object
    df = pd.read_html(str(table),header=0)
    
    #Store the dataframe in a list
    datalist.append(df[0])
    
    #Ask Selenium to click the back button
    driver.execute_script("window.history.go(-1)") 
    
    #increment the counter variable before starting the loop over
    x += 1
    
    #end loop block
    
#loop has completed

#end the Selenium browser session
driver.quit()

#combine all pandas dataframes in the list into one big dataframe
result = pd.concat([pd.DataFrame(datalist[i]) for i in range(len(datalist))],ignore_index=True)

#convert the pandas dataframe to JSON
json_records = result.to_json(orient="records")

#pretty print to CLI with tabulate
#converts to an ascii table
print(tabulate(result, headers=["Employee Name","Job Title","Overtime Pay","Total Gross Pay"],tablefmt="psql"))

#get current working directory
path = os.getcwd()

#open, write, and close the file
f = open(path + "\\fhsu_payroll_data.json","w") #FHSU
f.write(json_records)
f.close()
1*Pn_kqhr2-rqQ7yNV-ymn6Q
Ảnh của Artem Sapegin trên Bapt

Phần kết luận

rút trích nội dung trang web với con trăn súp đẹp là một công cụ tuyệt vời cần có trong bộ kỹ năng của bạn. Sử dụng tìm kiếm trên web khi dữ liệu bạn cần làm việc có sẵn cho công chúng, nhưng không nhất thiết phải có sẵn một cách thuận tiện. Khi JavaScript cung cấp hoặc “ẩn” nội dung, tự động hóa trình duyệt với selen sẽ đảm bảo mã của bạn “thấy” những gì bạn (với tư cách là người dùng) sẽ thấy. Và cuối cùng, khi bạn đang thu thập các bảng đầy dữ liệu, gấu trúc là thư viện phân tích dữ liệu Python sẽ xử lý tất cả.

Đọc thêm  Biến in Python – Cách in chuỗi và biến

Thẩm quyền giải quyết:

Bài viết sau đây là một tài liệu tham khảo hữu ích cho dự án này:

https://pythonprogramminglanguage.com/web-scraping-with-pandas-and-Beautifulsoup/

Liên hệ với tôi bất cứ lúc nào trên LinkedIn hoặc Twitter. Và nếu bạn thích bài viết này, hãy vỗ tay vài cái. Tôi sẽ chân thành đánh giá cao nó.

https://www.linkedin.com/in/davidagray/

Dave Grey (@yesdavidgray) | Twitter
Tweet mới nhất từ ​​Dave Gray (@yesdavidgray). Người hướng dẫn @FHSUInformatics * Nhà phát triển * Nhạc sĩ * Doanh nhân *…
twitter.com





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