Quét một trang web động bằng Python và Selenium.
Giới thiệu
Một thời gian trước, tôi được giao một nhiệm vụ mà tôi cần thu thập dữ liệu từ một trang web tiếng Tây Ban Nha về đặt phòng khách sạn. Chúng tôi có một số tùy chọn khi gặp các loại nhiệm vụ này, Món súp ngon, Phế liệu và selen. Súp đẹp không hoạt động tốt với các trang web động và tôi không thích cách hoạt động của tập lệnh phế liệu. Không giống như phương pháp phế liệu và các phương pháp khác mà bạn bắt đầu đặt liên kết ngay lập tức, trong Selenium, trước tiên bạn phải có Trình quản trị web cho trình duyệt mà bạn muốn sử dụng cho tác vụ.
Cài đặt hệ thống cho dự án
Bước quan trọng nhất trước khi chúng tôi bắt đầu bất kỳ dự án nào là chuẩn bị hệ thống của bạn cho dự án. Dưới đây là các bước để làm theo để thiết lập dự án:
- Python - Bạn có thể tải xuống python từ đây . Ngoài ra, hãy đảm bảo rằng bạn đã thêm python vào đường dẫn khi cài đặt nó.
- Tạo một môi trường ảo trong thư mục dự án của bạn. Bạn có thể tạo môi trường ảo bằng cách sử dụng
python -m venv [name you want to give to your environment]. - Kích hoạt môi trường ảo của bạn. Tôi giả sử bây giờ bạn đang ở trong thư mục dự án và
[environment name]\Scripts\activatesẽ kích hoạt môi trường ảo của bạn. - Bây giờ, trong môi trường này, bạn sẽ cài đặt Selenium.
pip install selenium==<required version>sẽ cài đặt phiên bản selen yêu cầu của bạn. Tôi đã sử dụng phiên bản 3 cho dự án. - Nhận trình điều khiển chrome tùy thuộc vào phiên bản chrome bạn đang sử dụng. Bạn có thể nhận được trình điều khiển của bạn từ đây .
Dữ liệu được trích xuất sẽ nằm trong thư mục “Dữ liệu” và trình điều khiển mà chúng tôi đã tải xuống sẽ nằm trong thư mục “trình điều khiển”.
Bây giờ, bên trong thư mục chính, bạn sẽ tạo một tệp python nơi bạn sẽ viết tập lệnh để loại bỏ dữ liệu khỏi trang web.
Chúng tôi sẽ bắt đầu bằng cách nhập các thư viện cần thiết:
Để bắt đầu tập lệnh, trước tiên chúng ta sẽ tạo một đối tượng trình điều khiển bằng cách sử dụng selenium.webdrivertheo cách sau:
driver = webdriver.Chrome(executable_path ='data/chromedriver.exe')
Trang web chúng tôi muốn thu thập dữ liệu từ cho thuê và nó có thể được tìm thấy tại địa chỉ này “https://es.rentalia.com/”
trước tiên chúng tôi sẽ làm cho trình điều khiển truy cập trang web bằng lệnhdriver.get('https://es.rentalia.com/')
Giờ đây, khi trình điều khiển có trên trang web, nó có thể truy cập tất cả các thành phần html có trên trang web. Bạn có thể tham khảo liên kết này để biết về các chức năng mà chúng tôi có thể sử dụng để truy cập các phần tử hiện có trên trang web-”https://iqss.github.io/dss-webscrape/finding-web-elements.html”.
Bây giờ bạn đã quen thuộc hơn với chức năng bộ chọn phần tử trong Selenium webdriver và bước tiếp theo là lấy các tham chiếu của các phần tử mà bạn muốn lấy dữ liệu của mình. Để làm được điều đó, bạn chỉ cần mở tùy chọn nhà phát triển trong trình duyệt của mình, bạn chỉ cần nhấn F12hoặc nhấp chuột phải vào phần tử bạn muốn chọn và bạn sẽ tìm thấy tùy chọn để kiểm tra khi nhấp vào, bạn sẽ được chuyển hướng đến mã html cho phần tử đó. Từ mã đó, bạn có thể lấy tên lớp, html, id hoặc đường dẫn X, có thể lấy đường dẫn X trong menu được hiển thị khi nhấp vào phần tử html mã.
Đây là cách bạn sẽ có được đường dẫn X:
Bắt đầu với quy trình:
Điểm đầu tiên và quan trọng nhất là mở trang web trên trình duyệt mà bạn sẽ làm cho webdriver của mình hoạt động và bắt đầu quan sát các quy trình.
Ví dụ: có một nút để chấp nhận cookie ngay khi tải trang. Bạn sẽ chỉ có thể tương tác với nội dung bên trong nếu bạn đã nhấp vào nút đó.
Bây giờ, khi đã hoàn thành, bạn sẽ phải điền thông tin đầu vào để nhận kết quả cho khu vực bạn cần dữ liệu. Trang kết quả sẽ có danh sách các khách sạn với thông tin về các phòng như, giá mỗi đêm, địa điểm, mô tả ngắn gọn, v.v. Một điều không có trên trang đó là số liên lạc mà bạn có thể sử dụng để hỏi về phòng. Vì vậy chúng ta sẽ phải vào trang chi tiết trên từng phòng khách sạn để lấy số.
Tôi đã chia việc hình thành kịch bản thành các bước sau:
- Truy cập vào nút chấp nhận các điều khoản để truy cập trang web.
#clicking the accepting button
cookies_btn = driver.find_element('xpath', '//*[@id="didomi-host"]/div/div/div/div//div[2]/button[2]')
cookies_btn.click()
# we used xpath to access the element and once we get the object made for the element we can click simply by adding click() method.
# inputing the locations from the given list
input_field.send_keys(loc)
ActionChains(driver).send_keys(Keys.DOWN).send_keys(Keys.ENTER).perform()
# we replicated the interaction we make to input and submit the query in the input bar using action chains
Để lấy dữ liệu cho từng trang web, tôi đã bao gồm vòng lặp bên trong câu lệnh ghi để tạo bảng chỉ có các tiêu đề liên quan đến các biến mà chúng tôi có và sau đó khi vòng lặp tiếp tục, mã sẽ điền vào các hàng có dữ liệu từ trình giữ chỗ mà chúng tôi đã xác định và sử dụng để trích xuất. Có một vài điều nữa mà tôi đã thêm vào để làm cho nó hoạt động tốt và hiệu quả trong việc thu thập dữ liệu, bạn có thể tìm thấy mã đã hoàn thành tại đây . Ví dụ: tôi đã tạo tập lệnh lấy đầu vào từ người dùng làm đối số, bạn sẽ nhận được tất cả thông tin cần thiết trong kho lưu trữ đó. Nhưng trước khi lấy mã từ đó, tôi muốn bạn tự thực hiện điều này.
Ngoài ra, không có quy tắc chuẩn nào để lấy dữ liệu trong tệp csv, vì vậy hãy làm những gì bạn cho là thú vị.
Tôi hy vọng nó sẽ có ích !

![Dù sao thì một danh sách được liên kết là gì? [Phần 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































