Python yêu cầu danh sách các URL

Trong bài viết này, tôi sẽ chỉ cho bạn ba cách để cạo dữ liệu từ nhiều URL. Cụ thể hơn, tôi sẽ trình bày cách lặp qua số trang, lặp qua danh sách URL được tạo thủ công và cuối cùng, lặp qua danh sách URL đã loại bỏ

Tôi giả định rằng trong hướng dẫn này, bạn đã có một số kiến ​​thức siêu cơ bản về quét web. Nếu bạn cần xem lại nhanh về cách kiểm tra và cạo một trang web, hãy xem phần này

Hướng dẫn về những gì Kaggle sẽ không dạy cho bạn. Quét web, làm sạch dữ liệu và hơn thế nữa

Bởi vì Khoa học dữ liệu không chỉ là EDA và các mô hình đào tạo

hướng tới khoa học dữ liệu. com

Tôi sẽ thu thập dữ liệu từ các ký túc xá ở thành phố Barcelona xinh đẹp từ Hostelworld, trang web tốt nhất để tìm ký túc xá ở bất kỳ đâu trên thế giới. Được rồi, bây giờ chúng ta hãy bắt đầu

Vòng qua số trang

Đây là cách đơn giản nhất, đơn giản nhất để cạo nhiều trang. Hãy bắt đầu bằng cách xem phần cuối của URL mà chúng tôi đang tìm kiếm các ký túc xá [URL đầy đủ có sẵn ở cuối bài viết]

Chúng tôi thấy rằng đối với trang đầu tiên, chúng tôi có page=1. Đối với trang thứ hai, chúng tôi sẽ có trang = 2, v.v.

Do đó, tất cả những gì chúng ta cần làm là tạo một vòng lặp “for” trong đó chúng ta thay đổi số cuối cùng. Đối với mỗi trang, vòng lặp sẽ thu thập thông tin chúng tôi đã chỉ định

Đây là mã để thu thập khoảng cách từ trung tâm thành phố, giá giường tập thể, giá phòng riêng và xếp hạng trung bình do khách hàng trước đưa ra cho tất cả các nhà trọ được tìm thấy trong 2 trang đầu tiên của trang web

  • Tôi sử dụng selen ở đây vì các trang của thế giới ký túc xá được hiển thị bằng JavaScript, điều mà BeautifulSoup không thể xử lý
  • Tôi đã loại bỏ phần tử “price-title 5” vì phần tử này cho phép chúng tôi biết giá dành cho ký túc xá hay phòng riêng
  • Chức năng ngủ rất hữu ích để kiểm soát tốc độ chúng tôi đưa ra yêu cầu đến máy chủ trang web [để tránh làm chậm máy chủ], nhưng cũng hữu ích để đảm bảo Selenium đã tìm thấy thông tin chúng tôi muốn trước khi nó tiếp tục

Thông thường, chúng tôi sẽ chuyển sang làm sạch dữ liệu để làm cho dữ liệu có thể sử dụng được, nhưng tôi sẽ làm điều này ở phần cuối cùng với phương pháp cuối cùng. Hãy chuyển sang phương pháp tiếp theo

Lặp lại danh sách URL được tạo thủ công

Điều đó thật tuyệt, nhưng nếu các URL khác nhau mà bạn muốn thu thập không có số trang mà bạn có thể duyệt qua thì sao?

Chà, cách đầu tiên để thực hiện việc này là tạo danh sách URL theo cách thủ công và lặp qua danh sách đó. Đây là mã để tạo danh sách URL cho hai ký túc xá đầu tiên

url = ['//www.hostelworld.com/pwa/hosteldetails.php/Casa-Gracia-Barcelona-Hostel/Barcelona/45620?from=2020-07-03&to=2020-07-05&guests=1' ,
'//www.hostelworld.com/pwa/hosteldetails.php/Itaca-Hostel/Barcelona/1279?from=2020-07-03&to=2020-07-05&guests=1']

Sau đó, bạn có thể tạo một vòng lặp “for” mới đi qua mọi thành phần của danh sách và thu thập thông tin bạn muốn, theo cách chính xác như được minh họa trong phương pháp đầu tiên

Điều đó hiệu quả nếu bạn chỉ có một vài URL, nhưng hãy tưởng tượng nếu bạn có 100, 1.000 hoặc thậm chí 10.000 URL. Chắc chắn, việc tạo một danh sách theo cách thủ công không phải là điều bạn muốn làm [trừ khi bạn có quá nhiều thời gian rảnh rỗi]

Rất may, có một cách tốt hơn/thông minh hơn để làm mọi việc

Lặp lại danh sách các URL đã được loại bỏ

Đây là phương pháp cuối cùng được đề cập trong hướng dẫn này. Hãy xem kỹ trang Hostelworld mà chúng tôi đang tìm kiếm

Chúng tôi thấy rằng mọi danh sách ký túc xá đều có thuộc tính href, chỉ định liên kết đến trang ký túc xá riêng lẻ. Đó là thông tin chúng tôi muốn

Phương pháp diễn ra như sau

  1. Tạo một vòng lặp “for” cạo tất cả các thuộc tính href [và do đó là các URL] cho tất cả các trang chúng tôi muốn
  2. Làm sạch dữ liệu và tạo danh sách chứa tất cả các URL được thu thập
  3. Tạo một vòng lặp mới đi qua danh sách các URL để thu thập tất cả thông tin cần thiết
  4. Làm sạch dữ liệu và tạo khung dữ liệu cuối cùng

Điều quan trọng là phải chỉ ra rằng nếu mỗi trang được cạo có cấu trúc khác nhau thì phương pháp này sẽ không hoạt động bình thường. Các URL cần đến từ cùng một trang web

Đối với mỗi trang ký túc xá, tôi tìm kiếm tên của ký túc xá, giá giường rẻ nhất, số lượng đánh giá và điểm đánh giá cho 8 hạng mục [địa điểm, bầu không khí, an ninh, sạch sẽ, v.v.]. ]

Điều này làm cho phương pháp đầu tiên mà chúng tôi thấy trở nên vô dụng, vì với phương pháp này, chúng tôi có thể nhận được tất cả thông tin giống nhau và hơn thế nữa

Đây là mã để có được danh sách sạch các URL

  • Có khả năng các liên kết không mong muốn sẽ xuất hiện trong danh sách URL của bạn, như trường hợp ở đây. Nói chung, hầu như sẽ luôn có một mẫu rất khác biệt để phân biệt các URL bạn muốn với các URL khác [công khai, v.v. ]. Trong trường hợp này, tất cả các liên kết đến ký túc xá đều bắt đầu bằng /pwa/
  • Tôi đã thêm chuỗi 'https. //www. ký túc xá. com’ tới mọi phần tử của danh sách. Phần đó là cần thiết để các URL hoạt động trong vòng lặp sắp tới

Bây giờ chúng tôi có danh sách các URL sạch, chúng tôi có thể thu thập tất cả thông tin chúng tôi muốn trên mỗi trang ký túc xá bằng cách lặp qua danh sách

Vì mỗi lần lặp mất khoảng 15–20 giây nên mình sẽ chỉ làm cho 10 ký túc xá đầu tiên tại đây. Bạn có thể dễ dàng thay đổi điều đó bằng cách sửa đổi phạm vi

  • Khi tôi loại bỏ số lượng bài đánh giá, vì thông tin đó xuất hiện hai lần trên mỗi trang, tôi đã sử dụng [-1] để chỉ nhận số lượng bài đánh giá vào lần cuối cùng nó được tìm thấy
  • Nhìn chung có nhiều lựa chọn về giá [tùy thuộc vào loại ký túc xá]. Giá cuối cùng được đưa ra luôn là giá rẻ nhất, đó là giá mà tôi muốn giữ lại. Về cơ bản, vòng lặp thử/ngoại trừ giữ giá cuối cùng nếu tìm thấy nhiều giá và giữ nguyên giá nếu chỉ tìm thấy một giá

Loại vòng lặp này là một cách tuyệt vời để xử lý các lỗi tiềm ẩn

Với tất cả dữ liệu được thu thập, đây là mã để làm sạch dữ liệu và đưa dữ liệu vào khung dữ liệu

Đây là phần đầu của khung dữ liệu cuối cùng

Bạn đã có nó, ba cách khác nhau để tìm kiếm trên nhiều trang/URL. Tôi thực sự hy vọng điều này có ích và đừng quên cạo một cách có trách nhiệm

Chủ Đề