Hướng dẫn how do you scrape a dynamic web page in python? - làm thế nào để bạn tìm kiếm một trang web động trong python?


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 http://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('http://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('http://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 = 'http://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('http://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

Làm thế nào để bạn cạo dữ liệu từ một trang web động?

Có hai cách tiếp cận để cạo một trang web động: Xóa nội dung trực tiếp từ JavaScript. Quét trang web khi chúng tôi xem nó trong trình duyệt của chúng tôi - sử dụng các gói Python có khả năng thực hiện JavaScript.Scrape the content directly from the JavaScript. Scrape the website as we view it in our browser — using Python packages capable of executing the JavaScript.

Đẹp có thể quét nội dung động?

Đó là lý tưởng là không thể vì BeautifulSoup chỉ là một trình phân tích cú pháp HTML.Vì vậy, trong các kịch bản đó, tốt hơn là sử dụng selenium để kéo nội dung động.Có nếu chúng ta không thể nhìn thấy các bảng trong thân HTML thì chúng được tạo động thông qua các tập lệnh. because BeautifulSoup is just an HTML parser. So in those scenarios it is better to use Selenium to pull dynamic content. Yes if we cant see tables in the HTML body then those are dynamically generated through scripts.

Làm thế nào để bạn cạo một bảng động trong Python?

Cạo các bảng động trong Python với các yêu cầu..
Tìm API ẩn để truy cập dữ liệu JSON.Chúng tôi đã biết bảng trên trang này được tạo động.....
Gửi yêu cầu HTTP ban đầu của chúng tôi.....
Đọc và cạo dữ liệu JSON.....
Xuất dữ liệu của chúng tôi vào một tệp CSV.....
Chạy tập lệnh của chúng tôi [Mã đầy đủ].

Chúng ta có thể tạo trang web năng động bằng Python không?

Khám phá các khái niệm tạo các trang web động (HTML) với Python.Cuốn sách này xem xét một số phương pháp có sẵn để phục vụ HTML động bao gồm CGI, SSI, Django và Flask.Bạn sẽ bắt đầu bằng cách bao gồm các trang HTML và CSS nói chung và sau đó chuyển sang tạo các trang qua CGI.. This book reviews several methods available to serve up dynamic HTML including CGI, SSI, Django, and Flask. You will start by covering HTML pages and CSS in general and then move on to creating pages via CGI.