Xây dựng trình thu thập dữ liệu web bằng Python
Thu thập dữ liệu web là một kỹ thuật mạnh mẽ để thu thập dữ liệu từ web bằng cách tìm tất cả các URL cho một hoặc nhiều miền. Python có một số thư viện và khung thu thập dữ liệu web phổ biến Show
Trong bài viết này, trước tiên chúng tôi sẽ giới thiệu các chiến lược thu thập thông tin khác nhau và các trường hợp sử dụng. Sau đó, chúng ta sẽ xây dựng một trình thu thập dữ liệu web đơn giản từ đầu bằng Python bằng hai thư viện. Yêu cầu và súp đẹp. Tiếp theo, chúng ta sẽ xem tại sao nên sử dụng khung thu thập dữ liệu web như Scrapy. Cuối cùng, chúng ta sẽ xây dựng một ví dụ về trình thu thập dữ liệu với Scrapy để thu thập siêu dữ liệu phim từ IMDb và xem cách Scrapy chia tỷ lệ cho các trang web có vài triệu trang Trình thu thập dữ liệu web là gì?Thu thập dữ liệu web và quét web là hai khái niệm khác nhau nhưng có liên quan. Thu thập dữ liệu web là một thành phần của quét web, logic của trình thu thập thông tin tìm thấy các URL sẽ được xử lý bằng mã trình quét Trình thu thập dữ liệu web bắt đầu với một danh sách các URL để truy cập, được gọi là hạt giống. Đối với mỗi URL, trình thu thập thông tin sẽ tìm các liên kết trong HTML, lọc các liên kết đó dựa trên một số tiêu chí và thêm các liên kết mới vào hàng đợi. Tất cả HTML hoặc một số thông tin cụ thể được trích xuất để được xử lý bởi một đường dẫn khác
Chiến lược thu thập dữ liệu webTrong thực tế, trình thu thập dữ liệu web chỉ truy cập vào một tập hợp con các trang tùy thuộc vào ngân sách của trình thu thập thông tin, có thể là số trang tối đa trên mỗi miền, độ sâu hoặc thời gian thực hiện Nhiều trang web cung cấp một robot. txt để cho biết đường dẫn nào của trang web có thể được thu thập thông tin và đường dẫn nào bị cấm. Ngoài ra còn có sơ đồ trang web. xml, rõ ràng hơn một chút so với robot. txt và hướng dẫn cụ thể các bot nên thu thập dữ liệu đường dẫn nào và cung cấp siêu dữ liệu bổ sung cho mỗi URL Các trường hợp sử dụng trình thu thập dữ liệu web phổ biến bao gồm
Tiếp theo, chúng ta sẽ so sánh ba chiến lược khác nhau để xây dựng trình thu thập dữ liệu web bằng Python. Đầu tiên, chỉ sử dụng các thư viện tiêu chuẩn, sau đó là các thư viện của bên thứ ba để thực hiện các yêu cầu HTTP và phân tích cú pháp HTML, và cuối cùng là khung thu thập dữ liệu web Xây dựng trình thu thập dữ liệu web đơn giản bằng Python từ đầuĐể xây dựng trình thu thập dữ liệu web đơn giản bằng Python, chúng tôi cần ít nhất một thư viện để tải xuống HTML từ một URL và một thư viện khác để trích xuất các liên kết. Python cung cấp các thư viện chuẩn urllib để thực hiện các yêu cầu HTTP và html. trình phân tích cú pháp để phân tích cú pháp HTML. Có thể tìm thấy một ví dụ về trình thu thập thông tin Python chỉ được xây dựng với các thư viện tiêu chuẩn trên Github Ngoài ra còn có các thư viện phổ biến khác, chẳng hạn như Yêu cầu và Súp đẹp, có thể cung cấp trải nghiệm nhà phát triển được cải thiện khi soạn yêu cầu HTTP và xử lý tài liệu HTML. Nếu bạn muốn tìm hiểu thêm, bạn có thể xem hướng dẫn này về ứng dụng khách Python HTTP tốt nhất Bạn có thể cài đặt hai thư viện cục bộ
Trình thu thập thông tin cơ bản có thể được xây dựng theo sơ đồ kiến trúc trước đó
Bot của chúng tôi ở đây định nghĩa một lớp 6 với một vài phương thức trợ giúp ( 7 sử dụng thư viện Yêu cầu, 8 sử dụng thư viện Beautiful Soup và 9 để lọc URL) và sau đó tiếp tục bằng cách khởi tạo lớp với URL bắt đầu IMDb của chúng tôi và gọi phương thức 0 của nó 1 sẽ chạy miễn là có các URL đang chờ xử lý trong 2, sẽ chuyển từng URL tới 3, trích xuất bất kỳ liên kết nào và thêm chúng vào 2 - rửa sạch và lặp lạiĐể chạy trình thu thập thông tin của chúng tôi, chỉ cần nhập lệnh này trên dòng lệnh của bạn
Trình thu thập thông tin ghi lại một dòng cho mỗi URL đã truy cập
Mã này rất đơn giản nhưng có nhiều vấn đề về hiệu suất và khả năng sử dụng cần giải quyết trước khi thu thập dữ liệu thành công một trang web hoàn chỉnh
Tiếp theo, chúng ta sẽ xem cách Scrapy cung cấp tất cả các chức năng này và giúp dễ dàng mở rộng cho các lần thu thập thông tin tùy chỉnh của bạn Thu thập dữ liệu web với ScrapyScrapy là khung Python thu thập và quét web phổ biến nhất với gần 50 nghìn sao trên Github. Một trong những ưu điểm của Scrapy là các yêu cầu được lên lịch và xử lý không đồng bộ. Điều này có nghĩa là Scrapy có thể gửi một yêu cầu khác trước khi yêu cầu trước đó hoàn thành hoặc thực hiện một số công việc khác ở giữa. Scrapy có thể xử lý nhiều yêu cầu đồng thời nhưng cũng có thể được định cấu hình để tôn trọng các trang web bằng cài đặt tùy chỉnh, như chúng ta sẽ thấy sau Scrapy có kiến trúc đa thành phần. Thông thường, bạn sẽ triển khai ít nhất hai lớp khác nhau. Nhện và đường ống. Quét web có thể được coi là một ETL nơi bạn trích xuất dữ liệu từ web và tải nó vào bộ lưu trữ của riêng bạn. Nhện trích xuất dữ liệu và đường ống tải dữ liệu vào bộ lưu trữ. Quá trình chuyển đổi có thể xảy ra cả trong trình thu thập thông tin và quy trình, nhưng tôi khuyên bạn nên đặt một quy trình Scrapy tùy chỉnh để chuyển đổi từng mục một cách độc lập với nhau. Bằng cách này, việc không xử lý một mục sẽ không ảnh hưởng đến các mục khác Trên hết, bạn có thể thêm phần mềm trung gian trình tải xuống và trình tải xuống ở giữa các thành phần như có thể thấy trong sơ đồ bên dưới
Tổng quan về Kiến trúc Scrapy [] Nếu bạn đã sử dụng Scrapy trước đây, bạn sẽ biết rằng trình quét web được định nghĩa là một lớp kế thừa từ lớp Spider cơ sở và triển khai một phương thức phân tích cú pháp để xử lý từng phản hồi. Nếu bạn chưa quen với Scrapy, bạn có thể đọc bài viết này để cạo dễ dàng với Scrapy
Scrapy cũng cung cấp một số. CrawlSpider, XMLFeedSpider, CSVFeedSpider và Sơ đồ trang web. Lớp kế thừa từ lớp Spider cơ sở và cung cấp một thuộc tính quy tắc bổ sung để xác định cách thu thập dữ liệu trang web. Mỗi quy tắc sử dụng a để chỉ định liên kết nào được trích xuất từ mỗi trang. Tiếp theo, chúng ta sẽ xem cách sử dụng từng cái trong số chúng bằng cách xây dựng trình thu thập thông tin cho IMDb, Cơ sở dữ liệu phim trên Internet Xây dựng một ví dụ Scrapy crawler cho IMDbTrước khi thử thu thập dữ liệu IMDb, tôi đã kiểm tra robot IMDb. txt để xem đường dẫn URL nào được phép. Tệp rô bốt chỉ không cho phép 26 đường dẫn cho tất cả tác nhân người dùng. Scrapy đọc các robot. txt trước và tôn trọng nó khi cài đặt được đặt thành 6. Đây là trường hợp của tất cả các dự án được tạo bằng lệnh Scrapy 7
Lệnh này tạo một dự án mới với cấu trúc thư mục dự án Scrapy mặc định
Sau đó, bạn có thể tạo một con nhện trong 8 với quy tắc trích xuất tất cả các liên kết
Bây giờ, chỉ cần khởi chạy trình thu thập thông tin bằng lệnh 9
Bạn sẽ nhận được rất nhiều nhật ký, bao gồm một nhật ký cho mỗi yêu cầu. Khám phá nhật ký, tôi nhận thấy rằng ngay cả khi chúng tôi đặt 0 để chỉ thu thập dữ liệu các trang web dưới https. //www. imdb. com, đã có yêu cầu đối với các miền bên ngoài, chẳng hạn như amazon. com
IMDb chuyển hướng các đường dẫn bên dưới 1 và 2 sang các miền bên ngoài. Có một vấn đề mở về Scrapy Github cho thấy rằng các URL bên ngoài không được lọc ra khi 3 được áp dụng trước 4. Để khắc phục sự cố này, chúng tôi có thể định cấu hình trình trích xuất liên kết để bỏ qua các URL bắt đầu bằng hai biểu thức chính quy 0Các lớp 5 và 6 hỗ trợ một số đối số để lọc URL. Ví dụ: bạn có thể bỏ qua các phần mở rộng tệp cụ thể và giảm số lượng URL trùng lặp bằng cách sắp xếp hoặc thu gọn các chuỗi truy vấnNếu bạn không tìm thấy đối số cụ thể cho trường hợp sử dụng của mình, bạn có thể sử dụng tham số 7 của hoặc 9 của. Ví dụ: chúng tôi đã nhận được cùng một trang hai lần, một lần dưới dạng URL đơn giản, lần khác với các tham số chuỗi truy vấn bổ sung
Để giới hạn số lượng URL được thu thập thông tin, chúng tôi có thể xóa tất cả các chuỗi truy vấn khỏi URL bằng hàm từ thư viện 2 và sử dụng nó trong 9 1Bây giờ chúng tôi đã giới hạn số lượng yêu cầu để xử lý, chúng tôi có thể thêm một phương pháp 4 để trích xuất dữ liệu từ mỗi trang và chuyển nó đến một đường dẫn để lưu trữ nó. Ví dụ: chúng tôi có thể xử lý 5 trong một quy trình khác hoặc chọn siêu dữ liệu HTMLĐể chọn siêu dữ liệu HTML trong thẻ tiêu đề, chúng tôi có thể chỉ định các biểu thức XPath của riêng mình nhưng tôi thấy tốt hơn là sử dụng thư viện, trích xuất, trích xuất tất cả siêu dữ liệu từ trang HTML. Bạn có thể cài đặt nó với 6 2Tôi đặt thuộc tính 7 thành 8 để Scrapy vẫn theo dõi tất cả các liên kết từ mỗi phản hồi, ngay cả khi chúng tôi đã cung cấp phương pháp phân tích cú pháp tùy chỉnh. Tôi cũng đã định cấu hình giải nén để chỉ trích xuất siêu dữ liệu Open Graph và JSON-LD, một phương pháp phổ biến để mã hóa dữ liệu được liên kết bằng JSON trong Web, được IMDb sử dụng. Bạn có thể chạy trình thu thập thông tin và lưu trữ các mục ở định dạng dòng JSON vào một tệp 3Tệp đầu ra 9 chứa một dòng cho mỗi mục được tìm kéo. Ví dụ: siêu dữ liệu Open Graph được trích xuất, dành cho một bộ phim được lấy từ các thẻ 0 trong HTML, trông như thế này 4JSON-LD cho một mục quá dài để đưa vào bài viết, đây là một ví dụ về những gì Scrapy trích xuất từ thẻ 1 5Khi khám phá nhật ký, tôi nhận thấy một vấn đề phổ biến khác với trình thu thập dữ liệu. Bằng cách nhấp liên tục vào các bộ lọc, trình thu thập thông tin sẽ tạo các URL có cùng nội dung, chỉ có điều các bộ lọc được áp dụng theo một thứ tự khác
URL tìm kiếm và bộ lọc dài là một vấn đề khó có thể được giải quyết một phần bằng cách giới hạn độ dài của URL bằng cài đặt Scrapy, Tôi đã sử dụng IMDb làm ví dụ để hiển thị kiến thức cơ bản về xây dựng trình thu thập dữ liệu web bằng Python. Tôi đã không để trình thu thập thông tin chạy lâu vì tôi không có trường hợp sử dụng cụ thể cho dữ liệu. Trong trường hợp bạn cần dữ liệu cụ thể từ IMDb, bạn có thể kiểm tra dự án Bộ dữ liệu IMDb cung cấp khả năng xuất dữ liệu IMDb hàng ngày hoặc Cinemagoer, một gói Python dành riêng cho việc tìm nạp và xử lý dữ liệu IMDb Thu thập dữ liệu web trên quy mô lớnNếu bạn cố gắng thu thập dữ liệu một trang web lớn như IMDb, với hơn 130 triệu trang (ít nhất là theo Google), điều quan trọng là phải thu thập dữ liệu một cách có trách nhiệm bằng cách điều chỉnh trình thu thập dữ liệu của bạn và điều chỉnh cài đặt của nó cho phù hợp
Lưu ý rằng thu thập dữ liệu Scrapy được tối ưu hóa cho một miền theo mặc định. Nếu bạn đang thu thập dữ liệu trên nhiều miền, hãy kiểm tra các cài đặt này để tối ưu hóa cho thu thập dữ liệu rộng, bao gồm cả việc thay đổi thứ tự thu thập dữ liệu mặc định từ độ sâu trước thành hơi thở trước. Để giới hạn ngân sách thu thập dữ liệu của mình, bạn có thể giới hạn số lượng yêu cầu bằng cài đặt CLOSESPIDER_PAGECOUNT của Với cài đặt mặc định, Scrapy thu thập dữ liệu khoảng 600 trang mỗi phút cho một trang web như IMDb. Thu thập dữ liệu 130 triệu trang sẽ mất khoảng nửa năm với tốc độ đó chỉ bằng một robot. Nếu bạn cần thu thập dữ liệu nhiều trang web, tốt hơn là khởi chạy các trình thu thập dữ liệu riêng cho từng trang web lớn hoặc nhóm trang web. Nếu quan tâm đến việc thu thập dữ liệu web phân tán, bạn có thể đọc cách một nhà phát triển đã thu thập dữ liệu 250 triệu trang bằng Python trong vòng chưa đầy hai ngày bằng cách sử dụng 20 phiên bản máy Amazon EC2 Trong một số trường hợp, bạn có thể gặp phải các trang web yêu cầu bạn thực thi mã JavaScript để hiển thị tất cả HTML. Không làm như vậy và bạn không thể thu thập tất cả các liên kết trên trang web. Bởi vì ngày nay, việc các trang web hiển thị động nội dung trong trình duyệt là điều rất phổ biến, tôi đã viết một phần mềm trung gian Scrapy để hiển thị các trang JavaScript bằng cách sử dụng API của ScrapingBee Phần kết luậnChúng tôi đã so sánh mã của trình thu thập thông tin Python bằng thư viện của bên thứ ba để tải xuống URL và phân tích cú pháp HTML với trình thu thập thông tin được tạo bằng khung thu thập thông tin web phổ biến. Scrapy là một khung thu thập dữ liệu web rất hiệu quả và dễ dàng mở rộng bằng mã tùy chỉnh của bạn. Nhưng bạn cần biết tất cả những nơi bạn có thể móc mã của riêng mình và cài đặt cho từng thành phần Định cấu hình Scrapy đúng cách càng trở nên quan trọng hơn khi thu thập dữ liệu các trang web có hàng triệu trang. Nếu bạn muốn tìm hiểu thêm về cách thu thập dữ liệu web, tôi khuyên bạn nên chọn một trang web phổ biến và cố gắng thu thập dữ liệu trang web đó. Bạn chắc chắn sẽ gặp những vấn đề mới, điều này làm cho chủ đề trở nên hấp dẫn
nguồn
Ari là một Kỹ sư dữ liệu lão luyện và là một nhà văn kỹ thuật tài năng. Anh ấy đã viết toàn bộ phần tích hợp Scrapy cho ScrapingBee và bài báo tuyệt vời này. Python có thể được sử dụng cho trình thu thập dữ liệu web không?Thu thập dữ liệu web là một kỹ thuật hiệu quả để thu thập dữ liệu từ web bằng cách tìm tất cả các URL cho một hoặc nhiều miền. Python có một số thư viện và khung thu thập dữ liệu web phổ biến .
Bạn có thể xây dựng một công cụ quét web bằng Python không?Xây dựng Trình quét web đầu tiên của bạn
. Đặc biệt, urllib. mô-đun yêu cầu chứa một hàm gọi là urlopen() mà bạn có thể sử dụng để mở một URL trong một chương trình. One useful package for web scraping that you can find in Python's standard library is urllib , which contains tools for working with URLs. In particular, the urllib. request module contains a function called urlopen() that you can use to open a URL within a program.
Làm cách nào để tạo trình thu thập URL để ánh xạ trang web bằng Python?Làm cách nào để tạo trình thu thập URL để ánh xạ trang web bằng Python? . Ghé thăm một trang web Quét tất cả các URL duy nhất được tìm thấy trên trang web và thêm chúng vào hàng đợi Đệ quy xử lý từng URL một cho đến khi chúng tôi sử dụng hết hàng đợi In kết quả Python có tốt hơn cho việc quét web không?Python là lựa chọn tốt nhất cho bạn . Các thư viện như yêu cầu hoặc HTTPX giúp dễ dàng loại bỏ các trang web không yêu cầu JavaScript hoạt động chính xác. Python cung cấp rất nhiều ứng dụng khách HTTP dễ sử dụng. Và một khi bạn nhận được phản hồi, bạn cũng rất dễ dàng phân tích cú pháp HTML bằng BeautifulSoup chẳng hạn. |