Hướng dẫn can you scrape data with php? - bạn có thể quét dữ liệu bằng php không?
Bạn có thể đã thấy một trong những hướng dẫn khác của chúng tôi về cách quét các trang web, ví dụ với Ruby, JavaScript hoặc Python, và tự hỏi: Điều gì về ngôn ngữ lập trình phía máy chủ được sử dụng rộng rãi nhất cho các trang web, đồng thời là Một trong những điều đáng sợ nhất? Tự hỏi không còn nữa - Hôm nay đã đến lúc PHP!PHP 🥳! Show
Dù bạn có tin hay không, nhưng php và web Scraping có nhiều điểm chung: giống như PHP, việc cạo web có thể được sử dụng một cách nhanh chóng và bẩn thỉu, hoặc theo kiểu công phu hơn và được hỗ trợ với sự trợ giúp của các công cụ và dịch vụ bổ sung. Trong bài viết này, chúng tôi sẽ xem xét một số cách để cạo web với PHP. Xin lưu ý rằng không có "cách tốt nhất" chung - mỗi cách tiếp cận có trường hợp sử dụng, tùy thuộc vào những gì bạn cần, cách bạn muốn làm mọi việc và những gì bạn muốn đạt được. Ví dụ, chúng tôi sẽ cố gắng có được một danh sách những người có cùng ngày sinh nhật, như bạn có thể thấy, ví dụ, trên Nổi tiếngBirthDays.com. Nếu bạn muốn mã theo, vui lòng đảm bảo rằng bạn đã cài đặt phiên bản hiện tại của PHP và nhà soạn nhạc. Tạo một thư mục mới và chạy các lệnh sau từ nó:
Chúng tôi sắn sàng! 1. Yêu cầu HTTPKhi nói đến việc duyệt web, một giao thức giao tiếp quan trọng, bạn cần phải quen thuộc, là HTTP, giao thức vận chuyển siêu văn bản. Nó xác định cách người tham gia trên web trên toàn thế giới giao tiếp với nhau. Có các máy chủ lưu trữ tài nguyên và khách hàng yêu cầu tài nguyên từ họ. Trình duyệt của bạn là một máy khách như vậy và khi chúng tôi mở bảng điều khiển nhà phát triển (nhấn 6), chọn tab "Mạng" và mở ví dụ nổi tiếng.com, chúng ta có thể thấy yêu cầu đầy đủ được gửi đến máy chủ, cũng như phản hồi đầy đủ : Tab mạng của bảng điều khiển nhà phát triển trình duyệt của bạnĐó là một số tiêu đề yêu cầu và phản hồi, nhưng ở dạng cơ bản nhất, một yêu cầu trông như thế này:
Chúng ta hãy cố gắng tái tạo với PHP, những gì trình duyệt vừa làm cho chúng ta! GET / HTTP/1.1 Host: www.example.com 7Thông thường, chúng tôi sẽ không sử dụng nhiều giao tiếp "cấp thấp" như vậy, nhưng chỉ vì lợi ích của nó, hãy tạo yêu cầu này với công cụ cơ bản nhất mà PHP phải cung cấp, 7:
Và thực sự, nếu bạn đặt đoạn mã này vào một tệp 9 và chạy nó với 0, bạn sẽ thấy cùng một HTML mà bạn nhận được khi mở http://example.com trong trình duyệt của bạn.Bước tiếp theo: Thực hiện yêu cầu HTTP với trình biên dịch ... Đùa thôi! Nhưng trong tất cả các mức độ nghiêm trọng: 7 thường không được sử dụng để thực hiện các yêu cầu HTTP trong PHP; Tôi chỉ muốn cho bạn thấy rằng điều đó là có thể, sử dụng ví dụ dễ nhất có thể. Mặc dù người ta có thể xử lý các tác vụ HTTP với nó, nhưng nó không thú vị và đòi hỏi nhiều mã nồi hơi mà chúng ta không cần phải viết - thực hiện các yêu cầu HTTP là một vấn đề được giải quyết và trong PHP (và nhiều ngôn ngữ khác) được giải quyết bởiXoănNhập Curl (một máy khách cho URL)!client for URLs)! Hãy nhảy ngay vào mã, nó khá thẳng về phía trước:
Bây giờ, điều này đã có vẻ ít thấp hơn so với ví dụ trước của chúng tôi, phải không? Không cần phải soạn thảo thủ công yêu cầu HTTP, thiết lập và quản lý kết nối TCP hoặc xử lý phản hồi byte-byte. Thay vào đó, chúng tôi chỉ khởi tạo tay cầm Curl, vượt qua URL thực tế và thực hiện yêu cầu bằng 2.Ví dụ, nếu chúng tôi muốn Curl tự động xử lý mã chuyển hướng HTTP 30X, chúng tôi chỉ cần thêm 3. Thêm vào đó, có khá nhiều tùy chọn và cờ bổ sung để hỗ trợ các trường hợp sử dụng khác.Tuyệt quá! Bây giờ chúng ta hãy đến thực tế! 2. Chuỗi, biểu thức thường xuyên và WikipediaHãy xem Wikipedia là nhà cung cấp dữ liệu đầu tiên của chúng tôi. Mỗi ngày trong năm có trang riêng cho các sự kiện lịch sử, bao gồm cả ngày sinh nhật! Ví dụ, khi chúng tôi mở, trang cho ngày 10 tháng 12 (đó là sinh nhật của tôi), chúng tôi có thể kiểm tra HTML trong bảng điều khiển nhà phát triển và xem phần "Sinh" được cấu trúc như thế nào: Điều này trông đẹp và có tổ chức! Chúng tôi có thể thấy điều đó:
Đây là một cái gì đó chúng ta có thể làm việc với, phải không? Đi nào!
Chờ những gì? Bất ngờ! Có, 9 sử dụng các trình bao bọc fopen của PHP và (miễn là chúng được bật) có thể được sử dụng để tìm nạp các URL HTTP. Mặc dù, chủ yếu thực sự có ý nghĩa đối với các tệp cục bộ, có lẽ là cách dễ nhất và nhanh nhất để thực hiện các yêu cầu HTTP cơ bản và tốt cho ví dụ của chúng tôi ở đây hoặc cho các tập lệnh một lần nhanh chóng, miễn là bạn sử dụng nó một cách cẩn thận.Đầu ra tập lệnhBạn đã đọc tất cả các HTML mà tập lệnh đã in ra chưa? Tôi hy vọng là không, bởi vì nó rất nhiều! Điều quan trọng là chúng ta biết nơi chúng ta nên bắt đầu tìm kiếm: Chúng tôi chỉ quan tâm đến phần bắt đầu bằng 0 và kết thúc ngay trước 4 tiếp theo:
Chúng tôi đang tiến gần hơn! Kết quả sạch hơnĐây không phải là HTML hợp lệ nữa, nhưng ít nhất chúng ta có thể thấy những gì chúng ta đang làm việc! Chúng ta hãy sử dụng một biểu thức thông thường để tải tất cả các mục trong danh sách vào một mảng để chúng ta có thể xử lý từng mục một:
{A Trong những năm và tên, chúng ta có thể thấy từ đầu ra rằng số đầu tiên là năm sinh. Nó được theo sau là một thực thể HTML 2 (một dấu gạch ngang). Cuối cùng, tên được đặt trong phần tử 3 sau đây. Hãy lấy tất cả, và chúng tôi đã hoàn thành. Kết quả cuối cùngHoàn hảo, phải không? Nó hoạt động và chúng tôi quản lý để có được dữ liệu chúng tôi muốn, phải không? Vâng, nó hoạt động, nhưng chúng tôi không chọn một cách tiếp cận đặc biệt thanh lịch. Thay vì xử lý cây Dom, chúng tôi đã sử dụng phân tích chuỗi "vũ lực" của mã HTML và, trong đó, đã bỏ lỡ hầu hết những gì phân tích cú pháp DOM đã cung cấp ngoài hộp. Không lý tưởng. Chúng ta có thể làm tốt hơn! Khi? Hiện nay! 3. GUZLE, XML, XPATH và IMDBGuzzle là một máy khách HTTP phổ biến cho PHP giúp dễ dàng và thú vị khi gửi các yêu cầu HTTP. Nó cung cấp cho bạn một API trực quan, xử lý lỗi rộng rãi và thậm chí khả năng mở rộng chức năng của nó với các plugin/phần mềm trung gian bổ sung. Điều này làm cho Guzz trở thành một công cụ mạnh mẽ mà bạn không muốn bỏ lỡ. Bạn có thể cài đặt Guzz từ thiết bị đầu cuối của bạn với 4.Chúng ta hãy cắt theo đuổi và xem HTML của https://www.imdb.com/search/name/?birth_monthday=12-10 (URL của Wikipedia chắc chắn đẹp hơn) Cấu trúc IMDB HTMLChúng ta có thể thấy ngay rằng chúng ta sẽ cần một công cụ tốt hơn các hàm chuỗi và các biểu thức thông thường ở đây. Thay vì một danh sách với các mục danh sách, chúng tôi thấy các 5 lồng nhau. Không có 6 mà chúng ta có thể sử dụng để nhảy vào nội dung có liên quan. Nhưng tồi tệ nhất trong tất cả: năm sinh được chôn cất trong đoạn trích tiểu sử hoặc không thể nhìn thấy được! 😱Chúng tôi sẽ cố gắng tìm một giải pháp cho các vị trí năm sau, nhưng bây giờ, ít nhất chúng ta hãy lấy tên của Jubilees của chúng tôi với XPath, một ngôn ngữ truy vấn để chọn các nút từ tài liệu DOM. Trong tập lệnh mới của chúng tôi, trước tiên chúng tôi sẽ tìm nạp trang bằng guzzle, chuyển đổi chuỗi HTML được trả về thành đối tượng 7 và khởi tạo trình phân tích cú pháp XPath với nó:
Chúng ta hãy xem xét kỹ hơn về HTML trong cửa sổ trên:
Nếu chúng ta nhìn gần hơn, chúng ta có thể làm cho nó thậm chí đơn giản hơn và bỏ qua các div và tên lớp con: chỉ có một 6 trong một mục danh sách, vì vậy hãy nhắm mục tiêu trực tiếp đó:
Hãy phá vỡ điều đó một cách nhanh chóng.
Tôi hy vọng tôi đã giải thích nó đủ tốt cho trường hợp sử dụng này, nhưng trong mọi trường hợp, bài viết của chúng tôi "Xpath thực tế cho việc quét web" ở đây trên blog giải thích XPath tốt hơn nhiều và đi sâu hơn nhiều so với tôi có thể, vì vậy chắc chắn hãy kiểm tra nó (nhưng Hoàn thành đọc cái này trước! 💪)
Guzzle là một ứng dụng khách HTTP tuyệt vời, nhưng nhiều người khác cũng tuyệt vời như nhau - nó chỉ là một trong những ứng dụng trưởng thành và được tải xuống nhiều nhất. PHP có một cộng đồng rộng lớn, tích cực; Bất cứ điều gì bạn cần, có một cơ hội tốt người khác đã viết thư viện hoặc khung cho nó và việc cạo web cũng không ngoại lệ. 4. Goutte và IMDBGoutte là một ứng dụng khách HTTP được tạo ra để cạo web. Nó được tạo ra bởi Fabien Potencier, người tạo ra khung Symfony và kết hợp một số thành phần Symfony để làm cho việc quét web rất thoải mái:
Hãy cài đặt Goutte với 6 và tạo lại ví dụ XPath trước đó với nó: 0Điều này một mình đã khá tốt - chúng tôi đã lưu bước mà chúng tôi phải vô hiệu hóa rõ ràng các cảnh báo XML và không cần phải tự khởi tạo một đối tượng 7. Bây giờ, chúng ta hãy sử dụng bộ chọn CSS "gốc" thay vì đánh giá XPath thủ công (nhờ thành phần CSSSselector được tích hợp vào Goutte): 1Tôi thích nơi này là đi; Kịch bản của chúng tôi ngày càng trông giống như một cuộc trò chuyện mà ngay cả một người không lập trình cũng có thể hiểu được, không chỉ là mã. Tuy nhiên, bây giờ là lúc để tìm hiểu xem bạn có mã hóa hay không 🤨: Tập lệnh này có trả về kết quả khi chạy nó không? Bởi vì đối với tôi, lúc đầu không - tôi đã dành một giờ để gỡ lỗi tại sao và cuối cùng đã phát hiện ra một giải pháp: 2Hóa ra, lý do tại sao Goutte (chính xác hơn: Domcrawler) không báo cáo cảnh báo XML là nó chỉ vứt bỏ các phần mà nó không thể phân tích được. Thư viện bổ sung giúp HTML5 cụ thể và sau khi cài đặt nó, tập lệnh chạy như mong đợi. Chúng ta sẽ nói nhiều hơn về điều này sau, nhưng bây giờ, chúng ta hãy nhớ rằng chúng ta vẫn còn thiếu những năm sinh của Jubilees. Đây là nơi một thư viện quét web như Goutte thực sự tỏa sáng: chúng ta có thể nhấp vào liên kết! Và thực sự: nếu chúng ta nhấp vào một trong các tên trong danh sách sinh nhật để truy cập hồ sơ của một người, chúng ta có thể thấy một dòng "Sinh ra:" và trong phần tử HTML A 8 trong DIV với ID 9: IMDB HTML StactureLần này, tôi sẽ không giải thích các bước duy nhất mà chúng tôi sẽ thực hiện trước đó, nhưng chỉ trình bày cho bạn kịch bản cuối cùng; Tôi tin rằng nó có thể nói cho chính nó: 3
Nhìn vào đầu ra sạch nàyVì có 50 người trên trang, phải thực hiện 50 yêu cầu nhận thêm, vì vậy việc chạy kịch bản sẽ mất nhiều thời gian hơn một chút, nhưng bây giờ chúng tôi cũng có ngày sinh nhật cho mỗi năm mươi người này. Tuyệt vời, nhưng những gì về những người khác mà bạn nói? Và bạn đã đúng, có hơn 1.000 người được liệt kê trên IMDB, những người chia sẻ ngày 10 tháng 12 là sinh nhật của họ và chúng ta không nên bỏ qua họ. Hãy bước vào thế giới vui vẻ đẹp đẽ với phân trang 😳. Khi nội dung được chia thành các trang khác nhau, nó luôn có một chút khó khăn, vì bạn cũng cần xử lý quản lý trang và thay đổi sang trang tiếp theo, một khi bạn đã truy cập tất cả dữ liệu trên trang hiện tại. Điều này có thể đặc biệt khó khăn trong bối cảnh cuộn vô tận, nhưng may mắn thay, IMDB tuân theo cách tiếp cận truyền thống với các nút 0.Vì vậy, hãy mở rộng ví dụ mã trước đây của chúng tôi theo một cách nào đó, nó không chỉ thu thập dữ liệu trang đầu tiên mà còn tất cả các trang. Để làm như vậy, chúng tôi sẽ giới thiệu một biến 1 mới, chúng tôi sẽ khởi tạo với URL bắt đầu của chúng tôi, sau đó di chuyển mã trình thu thập thông tin chính của chúng tôi vào vòng lặp 2 và cuối cùng - kiểm tra xem mỗi lần lặp xem có liên kết tiếp theo hay không. Nếu không có, chúng tôi đã đến trang cuối cùng và có thể gọi nó một ngày sau khi đã tổng hợp một danh sách dài những người mà chúng tôi phải gửi thiệp chúc mừng sinh nhật. Tuy nhiên, nếu chúng tôi thực sự tìm thấy một liên kết tiếp theo, chúng tôi sẽ biết rằng chúng tôi chưa hoàn thành, lưu trữ URL của liên kết trong 1 và bắt đầu thêm một lần lặp lại vòng lặp của chúng tôi.Ở đây chúng tôi đi. 4Bản tóm tắtTại thời điểm này, mã của chúng tôi vẫn còn khá ngắn gọn và thực hiện chính xác tất cả những gì chúng tôi đã đi làm. Nó bắt đầu tại liên kết IMDB đã cho, thu thập các hồ sơ được liệt kê cùng với ngày sinh từ các trang mà các tác nhân riêng lẻ và tiếp tục đến bộ diễn viên tiếp theo, miễn là có thêm dữ liệu. Khi Guzle xử lý mọi thứ theo yêu cầu mặc định, chắc chắn sẽ mất một chút thời gian để tìm nạp tất cả hơn 1.000 hồ sơ và đó chính xác là cơ hội để xây dựng để cải tiến thêm:
5. Trình duyệt không đầuĐây là một điều: Khi chúng tôi nhìn vào cây HTML DOM trong bảng điều khiển nhà phát triển, chúng tôi đã không thấy mã HTML thực tế đã được gửi từ máy chủ đến trình duyệt, nhưng kết quả cuối cùng của cách giải thích của Trình duyệt về cây Dom. Nếu một trang web không sử dụng JavaScript, đầu ra đó sẽ không khác nhau nhiều, nhưng JavaScript càng chạy, thì càng có nhiều khả năng nó sẽ thay đổi cây DOM từ những gì máy chủ đã gửi ban đầu. Khi một trang web sử dụng AJAX để tải nội dung động hoặc khi ngay cả HTML hoàn chỉnh cũng được tạo động với JavaScript, chúng tôi không thể truy cập nó chỉ bằng cách tải xuống tài liệu HTML gốc từ máy chủ. Các công cụ như Goutte có thể mô phỏng rất nhiều khi nói đến hành vi của trình duyệt, nhưng chúng vẫn có giới hạn của chúng. Đây là nơi mà các trình duyệt không đầu được gọi là phát huy tác dụng. Một trình duyệt không đầu chạy một công cụ trình duyệt chính thức mà không có giao diện người dùng đồ họa và nó có thể được điều khiển theo chương trình theo cách tương tự như trước đây với trình duyệt mô phỏng. Symfony Panther là một thư viện độc lập cung cấp các API giống như Goutte - điều này có nghĩa là bạn có thể sử dụng nó như một sự thay thế thả vào trong các tập lệnh Goutte trước đây của chúng tôi. Một tính năng hay là nó có thể sử dụng cài đặt Chrome hoặc Firefox hiện có trên máy tính của bạn để bạn không cần cài đặt phần mềm bổ sung. Vì chúng tôi đã đạt được mục tiêu nhận được ngày sinh nhật từ IMDB, hãy kết thúc hành trình của chúng tôi với việc lấy ảnh chụp màn hình từ trang mà chúng tôi rất siêng năng phân tích cú pháp. Sau khi cài đặt Panther với 5, chúng tôi có thể viết tập lệnh của mình chẳng hạn như sau: 5Sự kết luậnChúng tôi đã tìm hiểu về một số cách để loại bỏ web với PHP ngày hôm nay. Tuy nhiên, có một vài chủ đề mà chúng tôi chưa nói đến - ví dụ, chủ sở hữu trang web thường thích các trang web của họ chỉ được truy cập bởi người dùng cuối và không quá hạnh phúc nếu chúng được truy cập theo bất kỳ kiểu tự động nào.
Đó là nơi các dịch vụ như ScrapingBee có thể giúp đỡ: Bạn có thể sử dụng API Bee Scraping để ủy thác hàng ngàn yêu cầu mỗi giây mà không sợ bị giới hạn hoặc thậm chí bị chặn để bạn có thể tập trung vào những gì quan trọng: nội dung. Tôi hy vọng bạn thích bài viết này, nếu bạn là trường học cũ hơn, hãy xem trang web này với bài viết của Perl Nếu bạn muốn sử dụng một cái gì đó miễn phí, chúng tôi cũng đã đánh giá triệt để nhà cung cấp proxy miễn phí được sử dụng nhiều nhất. Nếu bạn muốn đọc thêm về việc quét web mà không bị chặn, chúng tôi đã viết một hướng dẫn đầy đủ, nhưng chúng tôi vẫn sẽ rất vui mừng nếu bạn quyết định thử con ong cào, 1.000 yêu cầu đầu tiên đang ở trên chúng tôi!give Scraping Bee a try, the first 1,000 requests are on us! Nó có hợp pháp để quét dữ liệu không?Mặc dù nó hoàn toàn hợp pháp để loại bỏ dữ liệu có sẵn công khai, có hai loại thông tin mà bạn nên thận trọng. Đó là: dữ liệu có bản quyền. Thông tin cá nhân.it's completely legal to scrape publicly available data, there are two types of information that you should be cautious about. These are: Copyrighted data. Personal information.
Có hợp pháp để cạo dữ liệu từ các trang web công cộng không?Đó là một quan niệm sai lầm phổ biến rằng việc cạo web là bất hợp pháp, không phải, nó cũng không phải là hack hoặc trộm cắp dữ liệu.Không có luật cụ thể nào cấm lấy dữ liệu.Những người phế liệu chuyên nghiệp tuân theo các quy tắc bảo vệ dữ liệu và chỉ truy cập dữ liệu có sẵn công khai.There are no specific laws that prohibit data scraping. Professional scrapers follow data protection rules and access only publicly available data.
HTML có hợp pháp không?Cào và bò không phải là bất hợp pháp.Rốt cuộc, bạn có thể cạo hoặc bò trang web của riêng bạn, mà không gặp trở ngại.Các công ty khởi nghiệp thích nó bởi vì đó là một cách rẻ tiền và mạnh mẽ để thu thập dữ liệu mà không cần quan hệ đối tác.. After all, you could scrape or crawl your own website, without a hitch. Startups love it because it's a cheap and powerful way to gather data without the need for partnerships.
Làm thế nào tôi có thể lấy dữ liệu từ một trang web khác trong PHP?Trong JavaScript, bạn có thể sử dụng AJAX để gửi yêu cầu của mình và đăng/nhận dữ liệu.Trong PHP, bạn có thể sử dụng [url = Hồi http://www.php.net/manual/en/book.curl.php,] curl hoặc phần mở rộng PECL [url = Hồi http://www.php.net/Hướng dẫn sử dụng/en/book.http.php]] http để gửi yêu cầu và nhận phản hồi.[URL=“http://www.php.net/manual/en/book.curl.php”]cURL or the PECL extension [URL=“http://www.php.net/manual/en/book.http.php”]HTTP to send requests and receive responses. |