แพคเกจนี้มีคลาสในการรวบรวมข้อมูลลิงก์บนเว็บไซต์ ภายใต้ประทุน 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) โปรดดูไฟล์ใบอนุญาตสำหรับข้อมูลเพิ่มเติม