แพคเกจนี้มีคลาสในการรวบรวมข้อมูลลิงก์บนเว็บไซต์ ภายใต้ประทุน Guzzle สัญญาจะใช้ในการรวบรวมข้อมูลหลาย URL พร้อมกัน
เนื่องจากโปรแกรมรวบรวมข้อมูลสามารถเรียกใช้ JavaScript จึงสามารถรวบรวมข้อมูลไซต์ที่แสดงผล JavaScript ได้ ภายใต้ประทุน Chrome และ Puppeteer ถูกใช้เพื่อขับเคลื่อนฟีเจอร์นี้
เราลงทุนทรัพยากรจำนวนมากเพื่อสร้างแพ็คเกจโอเพ่นซอร์สที่ดีที่สุดในระดับเดียวกัน คุณสามารถสนับสนุนเราได้โดยการซื้อหนึ่งในผลิตภัณฑ์ที่ต้องชำระเงินของเรา
เราขอขอบคุณอย่างยิ่งที่คุณส่งโปสการ์ดจากบ้านเกิดของคุณถึงเรา โดยระบุว่าคุณใช้แพ็คเกจใดของเรา คุณจะพบที่อยู่ของเราในหน้าติดต่อของเรา เราเผยแพร่โปสการ์ดที่ได้รับทั้งหมดบนวอลล์โปสการ์ดเสมือนของเรา
แพ็คเกจนี้สามารถติดตั้งผ่าน Composer:
ผู้แต่งต้องการ spatie/crawler
โปรแกรมรวบรวมข้อมูลสามารถสร้างอินสแตนซ์ได้เช่นนี้
ใช้ SpatieCrawlerCrawler; โปรแกรมรวบรวมข้อมูล::สร้าง() ->setCrawlObserver(<คลาสที่ขยาย SpatieCrawlerCrawlObserversCrawlObserver>) ->startCrawling($url);
อาร์กิวเมนต์ที่ส่งผ่านไปยัง setCrawlObserver
จะต้องเป็นอ็อบเจ็กต์ที่ขยายคลาสนามธรรม SpatieCrawlerCrawlObserversCrawlObserver
:
เนมสเปซ SpatieCrawlerCrawlObservers; ใช้ GuzzleHttpExceptionRequestException; ใช้ PsrHttpMessageResponseInterface; ใช้ PsrHttpMessageUriInterface; CrawlObserver คลาสนามธรรม {/* * เรียกว่าเมื่อโปรแกรมรวบรวมข้อมูลจะรวบรวมข้อมูล URL */ฟังก์ชันสาธารณะ willCrawl(UriInterface $url, ?string $linkText): เป็นโมฆะ{ }/* * ถูกเรียกเมื่อโปรแกรมรวบรวมข้อมูลรวบรวมข้อมูล URL ที่กำหนดได้สำเร็จ */บทคัดย่อฟังก์ชันสาธารณะรวบรวมข้อมูล (UriInterface $url,ResponseInterface $response, ?UriInterface $foundOnUrl = null, ?สตริง $linkText, ): void;/* * ถูกเรียกเมื่อโปรแกรมรวบรวมข้อมูลมีปัญหาในการรวบรวมข้อมูล URL ที่กำหนด */บทคัดย่อฟังก์ชันสาธารณะ crawlFailed (UriInterface $url,RequestException $requestException, ?UriInterface $foundOnUrl = null, ?สตริง $linkText = null, ): void;/** * ถูกเรียกเมื่อการรวบรวมข้อมูลสิ้นสุดลง */ ฟังก์ชั่นสาธารณะเสร็จสิ้นการรวบรวมข้อมูล (): เป็นโมฆะ { - -
คุณสามารถตั้งค่าผู้สังเกตการณ์หลายคนด้วย setCrawlObservers
:
โปรแกรมรวบรวมข้อมูล::สร้าง() -> setCrawlObservers ([ <คลาสที่ขยาย SpatieCrawlerCrawlObserversCrawlObserver>, <คลาสที่ขยาย SpatieCrawlerCrawlObserversCrawlObserver>, - - ->startCrawling($url);
หรือคุณสามารถตั้งค่าผู้สังเกตการณ์หลายคนทีละคนด้วย addCrawlObserver
:
โปรแกรมรวบรวมข้อมูล::สร้าง() ->addCrawlObserver(<คลาสที่ขยาย SpatieCrawlerCrawlObserversCrawlObserver>) ->addCrawlObserver(<คลาสที่ขยาย SpatieCrawlerCrawlObserversCrawlObserver>) ->addCrawlObserver(<คลาสที่ขยาย SpatieCrawlerCrawlObserversCrawlObserver>) ->startCrawling($url);
ตามค่าเริ่มต้น โปรแกรมรวบรวมข้อมูลจะไม่เรียกใช้ JavaScript นี่คือวิธีที่คุณสามารถเปิดใช้งานการทำงานของ JavaScript:
โปรแกรมรวบรวมข้อมูล::สร้าง() ->รันจาวาสคริปต์() -
เพื่อให้สามารถรับเนื้อหา html หลังจากเรียกใช้งานจาวาสคริปต์แล้ว แพ็คเกจนี้ขึ้นอยู่กับแพ็คเกจ Browsershot ของเรา แพ็คเกจนี้ใช้ Puppeteer ภายใต้ประทุน ต่อไปนี้คือคำแนะนำบางประการเกี่ยวกับวิธีการติดตั้งลงในระบบของคุณ
Browsershot จะทำการคาดเดาอย่างมีหลักการว่าการติดตั้งการพึ่งพานั้นอยู่ที่ใดในระบบของคุณ ตามค่าเริ่มต้น โปรแกรมรวบรวมข้อมูลจะสร้างอินสแตนซ์ Browsershot ใหม่ คุณอาจพบว่าจำเป็นต้องตั้งค่าอินสแตนซ์ที่สร้างขึ้นเองโดยใช้เมธอด setBrowsershot(Browsershot $browsershot)
โปรแกรมรวบรวมข้อมูล::สร้าง() ->setBrowsershot($เบราว์เซอร์ช็อต) ->รันจาวาสคริปต์() -
โปรดทราบว่าโปรแกรมรวบรวมข้อมูลจะยังคงทำงานแม้ว่าคุณจะไม่มีระบบที่ Browsershot กำหนดก็ตาม การขึ้นต่อกันของระบบเหล่านี้จำเป็นเฉพาะในกรณีที่คุณเรียก executeJavaScript()
คุณสามารถบอกโปรแกรมรวบรวมข้อมูลไม่ให้เข้าชมบาง URL ได้โดยใช้ setCrawlProfile
-function ฟังก์ชั่นนั้นคาดว่าวัตถุที่ขยาย SpatieCrawlerCrawlProfilesCrawlProfile
:
/* * พิจารณาว่าควรรวบรวมข้อมูล URL ที่ระบุหรือไม่ */ฟังก์ชั่นสาธารณะ shouldCrawl(UriInterface $url): bool;
แพ็คเกจนี้มาพร้อมกับ CrawlProfiles
สามรายการในกล่อง:
CrawlAllUrls
: โปรไฟล์นี้จะรวบรวมข้อมูล URL ทั้งหมดในทุกหน้า รวมถึง URL ที่ไปยังไซต์ภายนอก
CrawlInternalUrls
: โปรไฟล์นี้จะรวบรวมข้อมูลเฉพาะ URL ภายในบนหน้าเว็บของโฮสต์เท่านั้น
CrawlSubdomains
: โปรไฟล์นี้จะรวบรวมข้อมูลเฉพาะ URL ภายในและโดเมนย่อยบนหน้าเว็บของโฮสต์เท่านั้น
คุณสามารถกำหนดวิธีการแยกลิงก์จากเพจได้โดยการส่ง UrlParser
แบบกำหนดเองไปยังโปรแกรมรวบรวมข้อมูล
โปรแกรมรวบรวมข้อมูล::สร้าง() ->setUrlParserClass(<คลาสที่ใช้ SpatieCrawlerUrlParsersUrlParser>::คลาส) -
ตามค่าเริ่มต้น LinkUrlParser
จะถูกใช้ parser นี้จะแยกลิงก์ทั้งหมดออกจากแอตทริบิวต์ href
ของ a
ก
นอกจากนี้ยังมี SitemapUrlParser
ในตัวที่จะแยกและรวบรวมข้อมูลลิงก์ทั้งหมดจากแผนผังเว็บไซต์ รองรับไฟล์ดัชนีแผนผังเว็บไซต์
โปรแกรมรวบรวมข้อมูล::สร้าง() ->setUrlParserClass(SitemapUrlParser::คลาส) -
ตามค่าเริ่มต้น โปรแกรมรวบรวมข้อมูลจะเคารพข้อมูลโรบ็อต คุณสามารถปิดการใช้งานการตรวจสอบเหล่านี้ได้ดังนี้:
โปรแกรมรวบรวมข้อมูล::สร้าง() -> ละเว้นหุ่นยนต์ () -
ข้อมูลโรบ็อตอาจมาจากไฟล์ robots.txt
เมตาแท็ก หรือส่วนหัวการตอบกลับ ข้อมูลเพิ่มเติมเกี่ยวกับข้อมูลจำเพาะสามารถพบได้ที่นี่: http://www.robotstxt.org/
การแยกวิเคราะห์ข้อมูลโรบ็อตทำได้โดยแพ็คเกจ spatie/robots-txt ของเรา
ตามค่าเริ่มต้น โปรแกรมรวบรวมข้อมูลจะปฏิเสธลิงก์ทั้งหมดที่มีแอตทริบิวต์ rel="nofollow" คุณสามารถปิดการใช้งานการตรวจสอบเหล่านี้ได้ดังนี้:
โปรแกรมรวบรวมข้อมูล::สร้าง() -> ยอมรับ NofollowLinks() -
เพื่อให้เป็นไปตามกฎของ robots.txt สำหรับ User Agent ที่กำหนดเอง คุณสามารถระบุ User Agent ที่คุณกำหนดเองได้
โปรแกรมรวบรวมข้อมูล::สร้าง() ->setUserAgent('ตัวแทนของฉัน')
คุณสามารถเพิ่มกลุ่มกฎการรวบรวมข้อมูลเฉพาะสำหรับ 'my-agent' ใน robots.txt ตัวอย่างนี้ไม่อนุญาตให้รวบรวมข้อมูลทั้งเว็บไซต์สำหรับโปรแกรมรวบรวมข้อมูลที่ระบุโดย 'my-agent'
// ไม่อนุญาตให้รวบรวมข้อมูลสำหรับ my-agent ตัวแทนผู้ใช้: my-agent ไม่อนุญาต: /
เพื่อปรับปรุงความเร็วของการรวบรวมข้อมูล แพ็คเกจจะรวบรวมข้อมูล 10 URL ไปพร้อมๆ กันตามค่าเริ่มต้น หากคุณต้องการเปลี่ยนตัวเลขนั้น คุณสามารถใช้เมธอด setConcurrency
ได้
โปรแกรมรวบรวมข้อมูล::สร้าง() ->setConcurrency(1) // ตอนนี้ URL ทั้งหมดจะถูกรวบรวมข้อมูลทีละรายการ
ตามค่าเริ่มต้น โปรแกรมรวบรวมข้อมูลจะดำเนินต่อไปจนกว่าจะรวบรวมข้อมูลทุกหน้าที่ค้นหาได้ ลักษณะการทำงานนี้อาจทำให้เกิดปัญหาหากคุณกำลังทำงานในสภาพแวดล้อมที่มีข้อจำกัด เช่น สภาพแวดล้อมแบบไร้เซิร์ฟเวอร์
พฤติกรรมการรวบรวมข้อมูลสามารถควบคุมได้ด้วยสองตัวเลือกต่อไปนี้:
ขีดจำกัดการรวบรวมข้อมูลรวม ( setTotalCrawlLimit
): ขีดจำกัดนี้กำหนดจำนวน URL สูงสุดที่จะรวบรวมข้อมูล
ขีดจำกัดการรวบรวมข้อมูลปัจจุบัน ( setCurrentCrawlLimit
): สิ่งนี้จะกำหนดจำนวน URL ที่ได้รับการประมวลผลในระหว่างการรวบรวมข้อมูลปัจจุบัน
ลองมาดูตัวอย่างบางส่วนเพื่อชี้แจงความแตกต่างระหว่างทั้งสองวิธีนี้
เมธอด setTotalCrawlLimit
ช่วยให้คุณจำกัดจำนวน URL ทั้งหมดที่จะรวบรวมข้อมูล ไม่ว่าคุณจะเรียกใช้โปรแกรมรวบรวมข้อมูลบ่อยแค่ไหนก็ตาม
$queue = <การเลือกของคุณ/การใช้งานคิว>;// รวบรวมข้อมูล 5 URL และสิ้นสุดCrawler::create() ->setCrawlQueue($คิว) -> setTotalCrawlLimit (5) ->startCrawling($url);// ไม่รวบรวมข้อมูลเพิ่มเติมเมื่อถึงขีดจำกัดทั้งหมดแล้วCrawler::create() ->setCrawlQueue($คิว) -> setTotalCrawlLimit (5) ->startCrawling($url);
setCurrentCrawlLimit
จะกำหนดขีดจำกัดจำนวน UR ที่จะถูกรวบรวมข้อมูลต่อการดำเนินการ โค้ดชิ้นนี้จะประมวลผล 5 หน้าในการดำเนินการแต่ละครั้ง โดยไม่จำกัดจำนวนหน้าในการรวบรวมข้อมูล
$queue = <การเลือกของคุณ/การใช้งานคิว>;// รวบรวมข้อมูล 5 URL และสิ้นสุดCrawler::create() ->setCrawlQueue($คิว) -> setCurrentCrawLLimit (5) ->startCrawling($url);// รวบรวมข้อมูล 5 URL ถัดไปและสิ้นสุดCrawler::create() ->setCrawlQueue($คิว) -> setCurrentCrawLLimit (5) ->startCrawling($url);
ขีดจำกัดทั้งสองสามารถรวมกันเพื่อควบคุมโปรแกรมรวบรวมข้อมูล:
$queue = <การเลือกของคุณ/การใช้งานคิว>;// รวบรวมข้อมูล 5 URL และสิ้นสุดCrawler::create() ->setCrawlQueue($คิว) -> setTotalCrawlLimit (10) -> setCurrentCrawLLimit (5) ->startCrawling($url);// รวบรวมข้อมูล 5 URL ถัดไปและสิ้นสุดCrawler::create() ->setCrawlQueue($คิว) -> setTotalCrawlLimit (10) -> setCurrentCrawLLimit (5) ->startCrawling($url);// ไม่รวบรวมข้อมูลเพิ่มเติมเมื่อถึงขีดจำกัดทั้งหมดแล้วCrawler::create() ->setCrawlQueue($คิว) -> setTotalCrawlLimit (10) -> setCurrentCrawLLimit (5) ->startCrawling($url);
คุณสามารถใช้ setCurrentCrawlLimit
เพื่อแยกการรวบรวมข้อมูลที่ใช้เวลานาน ตัวอย่างต่อไปนี้แสดงให้เห็นถึงแนวทาง (แบบง่าย) ประกอบด้วยคำขอเริ่มแรกและคำขอติดตามผลจำนวนเท่าใดก็ได้ที่ดำเนินการรวบรวมข้อมูลต่อไป
หากต้องการเริ่มรวบรวมข้อมูลในคำขอต่างๆ คุณจะต้องสร้างคิวใหม่ของไดรเวอร์คิวที่คุณเลือก เริ่มต้นด้วยการส่งอินสแตนซ์คิวไปยังโปรแกรมรวบรวมข้อมูล โปรแกรมรวบรวมข้อมูลจะเริ่มเติมคิวในขณะที่เพจได้รับการประมวลผลและมีการค้นพบ URL ใหม่ ทำให้เป็นอนุกรมและจัดเก็บการอ้างอิงคิวหลังจากที่โปรแกรมรวบรวมข้อมูลเสร็จสิ้น (โดยใช้ขีดจำกัดการรวบรวมข้อมูลปัจจุบัน)
// สร้างคิวโดยใช้ Queue-driver.$queue = <การเลือก/การนำคิวของคุณไปใช้>;// รวบรวมข้อมูล URLsCrawler ชุดแรก::create() ->setCrawlQueue($คิว) -> setCurrentCrawLLimit (10) ->startCrawling($url);// ทำให้เป็นอนุกรมและจัดเก็บคิวของคุณ$serializedQueue = ทำให้เป็นอนุกรม($queue);
สำหรับคำขอต่อไปนี้ คุณจะต้องยกเลิกซีเรียลไลซ์คิวเดิมของคุณ และส่งต่อไปยังโปรแกรมรวบรวมข้อมูล:
// Unserialize Queue$queue = unserialize($serializedQueue);// รวบรวมข้อมูลชุดถัดไปของ URLsCrawler::create() ->setCrawlQueue($คิว) -> setCurrentCrawLLimit (10) ->startCrawling($url);// ทำให้เป็นอนุกรมและจัดเก็บคิวของคุณ$serialized_queue = ทำให้เป็นอนุกรม($queue);
ลักษณะการทำงานจะขึ้นอยู่กับข้อมูลในคิว เฉพาะเมื่อมีการส่งผ่านอินสแตนซ์คิวเดียวกันในลักษณะการทำงานตามที่อธิบายไว้ เมื่อมีการส่งคิวใหม่ทั้งหมด ขีดจำกัดของการรวบรวมข้อมูลครั้งก่อน (แม้จะเป็นเว็บไซต์เดียวกันก็ตาม) จะไม่มีผล
สามารถดูตัวอย่างพร้อมรายละเอียดเพิ่มเติมได้ที่นี่
ตามค่าเริ่มต้น โปรแกรมรวบรวมข้อมูลจะดำเนินต่อไปจนกว่าจะรวบรวมข้อมูลทุกหน้าของ URL ที่ให้มา หากคุณต้องการจำกัดความลึกของโปรแกรมรวบรวมข้อมูล คุณสามารถใช้เมธอด setMaximumDepth
ได้
โปรแกรมรวบรวมข้อมูล::สร้าง() ->ตั้งค่าความลึกสูงสุด(2)
หน้า html ส่วนใหญ่มีขนาดค่อนข้างเล็ก แต่โปรแกรมรวบรวมข้อมูลอาจรับไฟล์ขนาดใหญ่ เช่น PDF และ MP3 โดยไม่ได้ตั้งใจ เพื่อรักษาการใช้หน่วยความจำให้ต่ำในกรณีเช่นนี้ โปรแกรมรวบรวมข้อมูลจะใช้เฉพาะการตอบสนองที่มีขนาดเล็กกว่า 2 MB เท่านั้น เมื่อสตรีมการตอบสนอง หากมีขนาดใหญ่กว่า 2 MB โปรแกรมรวบรวมข้อมูลจะหยุดสตรีมการตอบสนอง ระบบจะถือว่าเนื้อหาการตอบกลับว่างเปล่า
คุณสามารถเปลี่ยนขนาดการตอบสนองสูงสุดได้
// ลองใช้ขนาดสูงสุด 3 MB.Crawler::create() ->setMaximumResponseSize(1024 * 1024 * 3)
ในบางกรณี คุณอาจถูกจำกัดอัตราเมื่อรวบรวมข้อมูลมากเกินไป เพื่อหลีกเลี่ยงปัญหานี้ คุณสามารถใช้เมธอด setDelayBetweenRequests()
เพื่อเพิ่มการหยุดชั่วคราวระหว่างทุกคำขอ ค่านี้แสดงเป็นมิลลิวินาที
โปรแกรมรวบรวมข้อมูล::สร้าง() ->setDelayBetweenRequests(150) // หลังจากที่ทุกเพจรวบรวมข้อมูลแล้ว โปรแกรมรวบรวมข้อมูลจะรอเป็นเวลา 150ms
ตามค่าเริ่มต้น ทุกหน้าที่ค้นพบจะถูกดาวน์โหลด (มีขนาดไม่เกิน setMaximumResponseSize()
) และแยกวิเคราะห์สำหรับลิงก์เพิ่มเติม คุณสามารถจำกัดประเภทเนื้อหาที่ควรดาวน์โหลดและแยกวิเคราะห์ได้โดยการตั้งค่า setParseableMimeTypes()
ด้วยอาร์เรย์ประเภทที่อนุญาต
โปรแกรมรวบรวมข้อมูล::สร้าง() ->setParseableMimeTypes(['ข้อความ/html', 'ข้อความ/ธรรมดา'])
วิธีนี้จะป้องกันการดาวน์โหลดเนื้อหาของหน้าที่มีประเภท MIME ที่แตกต่างกัน เช่น ไฟล์ไบนารี เสียง/วิดีโอ ... ที่ไม่น่าจะมีลิงก์ฝังอยู่ในหน้าเหล่านั้น คุณลักษณะนี้จะช่วยประหยัดแบนด์วิธเป็นส่วนใหญ่
เมื่อรวบรวมข้อมูลไซต์ โปรแกรมรวบรวมข้อมูลจะใส่ URL ที่จะรวบรวมข้อมูลไว้ในคิว ตามค่าเริ่มต้น คิวนี้จะถูกจัดเก็บไว้ในหน่วยความจำโดยใช้ ArrayCrawlQueue
ในตัว
เมื่อไซต์มีขนาดใหญ่มาก คุณอาจต้องการจัดเก็บคิวนั้นไว้ที่อื่น อาจเป็นฐานข้อมูล ในกรณีเช่นนี้ คุณสามารถเขียนคิวการรวบรวมข้อมูลของคุณเองได้
คิวการรวบรวมข้อมูลที่ถูกต้องคือคลาสใดๆ ที่ใช้อินเทอร์เฟซ SpatieCrawlerCrawlQueuesCrawlQueue
คุณสามารถส่งคิวการรวบรวมข้อมูลที่กำหนดเองผ่านเมธอด setCrawlQueue
บนโปรแกรมรวบรวมข้อมูลได้
โปรแกรมรวบรวมข้อมูล::สร้าง() ->setCrawlQueue(<การใช้งาน SpatieCrawlerCrawlerQueuesCrawlQueue>)
ที่นี่
ArrayCrawlQueue
RedisCrawlQueue (แพ็คเกจบุคคลที่สาม)
CacheCrawlQueue สำหรับ Laravel (แพ็คเกจบุคคลที่สาม)
Laravel Model as Queue (แอปตัวอย่างบุคคลที่สาม)
ตามค่าเริ่มต้น โปรแกรมรวบรวมข้อมูลจะตั้งค่ารูปแบบ URL พื้นฐานเป็น http
หากไม่มี คุณมีความสามารถในการเปลี่ยนแปลงสิ่งนั้นด้วย setDefaultScheme
โปรแกรมรวบรวมข้อมูล::สร้าง() ->setDefaultScheme('https')
โปรดดู CHANGELOG สำหรับข้อมูลเพิ่มเติมว่ามีอะไรเปลี่ยนแปลงเมื่อเร็วๆ นี้
โปรดดูการมีส่วนร่วมเพื่อดูรายละเอียด
ขั้นแรก ให้ติดตั้งการพึ่งพา Puppeteer ไม่เช่นนั้นการทดสอบของคุณจะล้มเหลว
npm install puppeteer
หากต้องการรันการทดสอบ คุณจะต้องเริ่มเซิร์ฟเวอร์ที่ใช้โหนดที่รวมไว้ก่อนในหน้าต่างเทอร์มินัลที่แยกต่างหาก
การทดสอบซีดี / เซิร์ฟเวอร์ ติดตั้ง npm โหนดเซิร์ฟเวอร์.js
เมื่อเซิร์ฟเวอร์ทำงาน คุณสามารถเริ่มการทดสอบได้
การทดสอบผู้แต่ง
หากคุณพบข้อบกพร่องเกี่ยวกับการรักษาความปลอดภัย โปรดส่งอีเมลไปที่ [email protected] แทนการใช้ตัวติดตามปัญหา
คุณใช้แพ็คเกจนี้ได้ฟรี แต่ถ้าเหมาะกับสภาพแวดล้อมการใช้งานจริงของคุณ เราขอขอบคุณอย่างยิ่งที่คุณส่งโปสการ์ดจากบ้านเกิดของคุณมาให้เรา โดยระบุว่าคุณกำลังใช้แพ็คเกจใดของเรา
ที่อยู่ของเราคือ: Spatie, Kruikstraat 22, 2018 แอนต์เวิร์ป, เบลเยียม
เราเผยแพร่ไปรษณียบัตรที่ได้รับทั้งหมดบนเว็บไซต์ของบริษัทของเรา
ฟรีค ฟาน เดอร์ แฮร์เทน
ผู้ร่วมให้ข้อมูลทั้งหมด
ใบอนุญาตเอ็มไอที (MIT) โปรดดูไฟล์ใบอนุญาตสำหรับข้อมูลเพิ่มเติม