Không may mắn là, script này có một vài nhược điểm:
1. Nó thu thập ít dữ liệu
2. Nó không thu thập dữ liệu động
3. Nó không sử dụng proxies
4. Nó không thực hiện bất cứ hành động nào trên trang
5. Nó không giải quyết captcha.
Hãy viết một script mới dựa trên thư viện Selenium để giải quyết các vấn đề này.
Sử dụng trình duyệt headless để nhận dữ liệu từ các kết quả tìm kiếm
Một trình duyệt headless có thể là ưu điểm khi giải quyết các websites cái sử dụng nội dung động, thách thức
CAPTCHA, hay yêu cầu duyệt Javascript. Selenium, một công cụ tự động hóa web mạnh mẽ, cho phép chúng ta tương tác
với các trang web sử dụng một headless browser và rút ra dữ liệu từ chúng.
Tạo một file mới và kết nối các thư viện:
from selenium import webdriver
from selenium.webdriver.common.by import By
Bây giờ hãy chỉ ra nơi web driver được download trước kia nằm ở:
DRIVER_PATH = ‘C:\chromedriver.exe’
driver = webdriver.Chrome(executable_path=DRIVER_PATH)
Trong script trước, chúng ta chỉ ra truy vấn với một link. Nhưng chúng ta đã thấy rằng tất cả các truy vấn nhìn
giống nhau. Nên, hãy cải tiến cái đó và làm nó có thể khởi tạo một link dựa trên một truy vấn text:
search_query = “cafe in new york”
base_url = “https://www.google.com/search?q=”
search_url = base_url + search_query.replace(” “, “+”)
Bây giờ chúng ta có thể đi đến trang chúng ta cần:
driver.get(search_url)
Hãy rút dữ liệu sử dụng các CSS selectors từ script trước:
results = []
result_divs = driver.find_elements(By.CSS_SELECTOR, “div.g”)
for result_div in result_divs:result = {}
anchor = result_div.find_elements(By.CSS_SELECTOR, “a”)
link = anchor[0].get_attribute(“href”)
title = result_div.find_element(By.CSS_SELECTOR, “h3”).text
description_element = result_div.find_element(By.XPATH, “//div[@data-sncf=’2′]”)
description = description_element.text if description_element else “-”
results.append(str(title)+”;”+str(link)+’;’+str(description))
Đóng trình duyệt:
driver.quit()
Và sau đó lưu dữ liệu vào một file:
with open(“serp.csv”, “w”) as f:
f.write(“Title; Link; Description\n”)
for result in results:
with open(“serp.csv”, “a”, encoding=”utf-8″) as f:
f.write(str(result)+”\n”)
Sử dụng Selenium, chúng ta giải quyết một vài vấn đề liên quan đến scraping. Ví dụ, chúng ta đã giảm đáng kể nguy
cơ bị block vì headless browser hoàn toàn mô phỏng công việc của một người dùng thực, vì vậy làm script không
phân biệt được với con người.
Cũng là, cách tiếp cận này cho phép chúng ta làm việc với các phần tử khác nhau trên trang và scrape các trang
động.
Tuy nhiên, chúng ta vẫn không thể kiểm soát vị trí của chúng ta, chúng ta không thể giải quyết captcha trong
trường hợp nó xảy ra, và chúng ta không sử dụng proxies. Hãy di chuyển tới thư viện sau để giải quyết các vấn
đề này.