Trong chương này, chúng ta hãy tìm hiểu cách thực hiện quét web trên các trang web động và các khái niệm liên quan đến chi tiết.
Giới thiệu
Quét web là một nhiệm vụ phức tạp và độ phức tạp nhân lên nếu trang web năng động. Theo kiểm toán toàn cầu của Liên hợp quốc về khả năng truy cập web, hơn 70% các trang web có bản chất năng động và họ dựa vào JavaScript cho các chức năng của họ.
Ví dụ trang web năng động
Chúng ta hãy xem xét một ví dụ về một trang web năng động và biết về lý do tại sao rất khó để cạo. Ở đây chúng tôi sẽ lấy ví dụ về việc tìm kiếm từ một trang web có tên //example.webscraping.com/places/default/search. Nhưng làm thế nào chúng ta có thể nói rằng trang web này có tính chất năng động? Nó có thể được đánh giá từ đầu ra của tập lệnh Python sau đây sẽ cố gắng xóa dữ liệu từ trang web đã đề cập ở trên -
import re import urllib.request response = urllib.request.urlopen['//example.webscraping.com/places/default/search'] html = response.read[] text = html.decode[] re.findall['[.*?]',text]
Đầu ra
[ ]
Đầu ra trên cho thấy rằng Scraper ví dụ không thể trích xuất thông tin vì phần tử chúng ta đang cố gắng tìm thấy trống.
Phương pháp tiếp cận dữ liệu từ các trang web động
Chúng tôi đã thấy rằng cái cào không thể xóa thông tin từ một trang web động vì dữ liệu được tải động với JavaScript. Trong những trường hợp như vậy, chúng ta có thể sử dụng hai kỹ thuật sau đây để lấy dữ liệu từ các trang web phụ thuộc JavaScript động -
- Kỹ thuật đảo ngược JavaScript
- Kết xuất JavaScript
Kỹ thuật đảo ngược JavaScript
Kết xuất JavaScript
Quá trình được gọi là Kỹ thuật đảo ngược sẽ hữu ích và cho phép chúng tôi hiểu cách dữ liệu được tải động bởi các trang web.inspect element tab for a specified URL. Next, we will click NETWORK tab to find all the requests made for that web page including search.json with a path of /ajax. Instead of accessing AJAX data from browser or via NETWORK tab, we can do it with the help of following Python script too −
import requests url=requests.get['//example.webscraping.com/ajax/search.json?page=0&page_size=10&search_term=a'] url.json[]
Để làm điều này, chúng tôi cần nhấp vào tab phần tử kiểm tra cho một URL được chỉ định. Tiếp theo, chúng tôi sẽ nhấp vào tab mạng để tìm tất cả các yêu cầu được thực hiện cho trang web đó bao gồm search.json với đường dẫn /ajax. Thay vì truy cập dữ liệu AJAX từ trình duyệt hoặc qua tab mạng, chúng ta có thể thực hiện điều đó với sự trợ giúp của việc theo dõi tập lệnh Python quá -
Thí dụ
import requests import string PAGE_SIZE = 15 url = '//example.webscraping.com/ajax/' + 'search.json?page={}&page_size={}&search_term=a' countries = set[] for letter in string.ascii_lowercase: print['Searching with %s' % letter] page = 0 while True: response = requests.get[url.format[page, PAGE_SIZE, letter]] data = response.json[] print['adding %d records from the page %d' %[len[data.get['records']],page]] for record in data.get['records']:countries.add[record['country']] page += 1 if page >= data['num_pages']: break with open['countries.txt', 'w'] as countries_file: countries_file.write['n'.join[sorted[countries]]]
Tập lệnh trên cho phép chúng tôi truy cập phản hồi JSON bằng cách sử dụng phương thức Python JSON. Tương tự, chúng ta có thể tải xuống Phản hồi chuỗi RAW và bằng cách sử dụng phương thức Python JSON JSON.LOADS, chúng ta cũng có thể tải nó. Chúng tôi đang làm điều này với sự giúp đỡ của Kịch bản Python. Về cơ bản, nó sẽ cạo tất cả các quốc gia bằng cách tìm kiếm chữ cái của bảng chữ cái ‘A, và sau đó lặp lại các trang kết quả của các phản hồi JSON.
Đầu ra
Searching with a adding 15 records from the page 0 adding 15 records from the page 1 ...
Kết xuất JavaScript
Quá trình được gọi là Kỹ thuật đảo ngược sẽ hữu ích và cho phép chúng tôi hiểu cách dữ liệu được tải động bởi các trang web.
Để làm điều này, chúng tôi cần nhấp vào tab phần tử kiểm tra cho một URL được chỉ định. Tiếp theo, chúng tôi sẽ nhấp vào tab mạng để tìm tất cả các yêu cầu được thực hiện cho trang web đó bao gồm search.json với đường dẫn /ajax. Thay vì truy cập dữ liệu AJAX từ trình duyệt hoặc qua tab mạng, chúng ta có thể thực hiện điều đó với sự trợ giúp của việc theo dõi tập lệnh Python quá -
Thí dụReact.js can make reverse engineering difficult by abstracting already complex JavaScript logic.
Tập lệnh trên cho phép chúng tôi truy cập phản hồi JSON bằng cách sử dụng phương thức Python JSON. Tương tự, chúng ta có thể tải xuống Phản hồi chuỗi RAW và bằng cách sử dụng phương thức Python JSON JSON.LOADS, chúng ta cũng có thể tải nó. Chúng tôi đang làm điều này với sự giúp đỡ của Kịch bản Python. Về cơ bản, nó sẽ cạo tất cả các quốc gia bằng cách tìm kiếm chữ cái của bảng chữ cái ‘A, và sau đó lặp lại các trang kết quả của các phản hồi JSON.
Để làm điều này, chúng tôi cần nhấp vào tab phần tử kiểm tra cho một URL được chỉ định. Tiếp theo, chúng tôi sẽ nhấp vào tab mạng để tìm tất cả các yêu cầu được thực hiện cho trang web đó bao gồm search.json với đường dẫn /ajax. Thay vì truy cập dữ liệu AJAX từ trình duyệt hoặc qua tab mạng, chúng ta có thể thực hiện điều đó với sự trợ giúp của việc theo dõi tập lệnh Python quá -
Thí dụ
Tập lệnh trên cho phép chúng tôi truy cập phản hồi JSON bằng cách sử dụng phương thức Python JSON. Tương tự, chúng ta có thể tải xuống Phản hồi chuỗi RAW và bằng cách sử dụng phương thức Python JSON JSON.LOADS, chúng ta cũng có thể tải nó. Chúng tôi đang làm điều này với sự giúp đỡ của Kịch bản Python. Về cơ bản, nó sẽ cạo tất cả các quốc gia bằng cách tìm kiếm chữ cái của bảng chữ cái ‘A, và sau đó lặp lại các trang kết quả của các phản hồi JSON.
from selenium import webdriver
Sau khi chạy tập lệnh trên, chúng tôi sẽ nhận được đầu ra sau và các bản ghi sẽ được lưu trong tệp có tên quốc gia.txt.
path = r'C:\\Users\\gaurav\\Desktop\\Chromedriver' driver = webdriver.Chrome[executable_path = path]
Trong phần trước, chúng tôi đã đảo ngược kỹ thuật trên trang web rằng API hoạt động như thế nào và cách chúng tôi có thể sử dụng nó để truy xuất kết quả trong một yêu cầu duy nhất. Tuy nhiên, chúng ta có thể gặp phải những khó khăn sau khi thực hiện kỹ thuật đảo ngược -
driver.get['//example.webscraping.com/search']
Đôi khi các trang web có thể rất khó khăn. Ví dụ: nếu trang web được tạo bằng công cụ trình duyệt nâng cao như Google Web Toolkit [GWT], thì mã JS kết quả sẽ được tạo ra và khó hiểu và kỹ sư đảo ngược.
driver.find_element_by_id['search_term'].send_keys['.']
Một số khung cấp cao hơn như React.js có thể làm cho kỹ thuật đảo ngược trở nên khó khăn bằng cách trừu tượng hóa logic JavaScript đã phức tạp.
js = "document.getElementById['page_size'].options[1].text = '100';" driver.execute_script[js]
Giải pháp cho những khó khăn trên là sử dụng công cụ kết xuất trình duyệt phân tích HTML, áp dụng định dạng CSS và thực thi JavaScript để hiển thị trang web.
[ ]0
Trong ví dụ này, để hiển thị tập lệnh Java, chúng tôi sẽ sử dụng một mô -đun Python quen thuộc. Mã Python sau đây sẽ hiển thị một trang web với sự trợ giúp của selen -
[ ]1
Đầu tiên, chúng ta cần nhập webdriver từ selen như sau -
[ ]2
Bây giờ, cung cấp đường dẫn của trình điều khiển web mà chúng tôi đã tải xuống theo yêu cầu của chúng tôi -
[ ]3