แน่นอนคุณจะต้องการเริ่มต้นด้วยกรอบการขูดเว็บที่ดี ในภายหลังคุณอาจตัดสินใจว่ามันมีข้อ จำกัด เกินไปและคุณสามารถรวบรวมไลบรารีของคุณเองไว้ด้วยกันได้ แต่การออกแบบของคุณจะแย่กว่า pjscrape หรือ scrapy
หมายเหตุ: ฉันใช้คำว่าการรวบรวมข้อมูลและการขูดโดยทั่วไปใช้แทนกันได้ที่นี่ นี่คือสำเนาคำตอบของฉันสำหรับคำถาม Quora ของคุณซึ่งค่อนข้างยาว
เครื่องมือ
ทำความคุ้นเคยกับเครื่องมือ Firebug หรือ Chrome dev ขึ้นอยู่กับเบราว์เซอร์ที่คุณต้องการ สิ่งนี้จำเป็นอย่างยิ่งเมื่อคุณเรียกดูไซต์ที่คุณกำลังดึงข้อมูลและแมปว่า URL ใดมีข้อมูลที่คุณกำลังค้นหาและรูปแบบข้อมูลใดที่ประกอบเป็นคำตอบ
คุณจะต้องมีความรู้เกี่ยวกับ HTTP และ HTML เป็นอย่างดีและอาจต้องการหาคนที่เหมาะสมในซอฟต์แวร์พร็อกซีระดับกลาง คุณจะต้องสามารถตรวจสอบคำขอและการตอบกลับ HTTP และทำความเข้าใจเกี่ยวกับวิธีการส่งผ่านข้อมูลคุกกี้และเซสชันและพารามิเตอร์การสืบค้น Fiddler ( http://www.telerik.com/fiddler ) และ Charles Proxy ( http://www.charlesproxy.com/ ) เป็นเครื่องมือยอดนิยม ฉันใช้ mitmproxy ( http://mitmproxy.org/ ) มากเพราะฉันเป็นคนชอบเล่นคีย์บอร์ดมากกว่าผู้ชายที่ใช้เมาส์
สภาพแวดล้อมประเภทคอนโซล / เชลล์ / REPL บางประเภทที่คุณสามารถลองใช้โค้ดต่างๆพร้อมข้อเสนอแนะแบบทันทีจะเป็นสิ่งล้ำค่า งานวิศวกรรมย้อนกลับเช่นนี้มีการลองผิดลองถูกมากมายดังนั้นคุณจะต้องการขั้นตอนการทำงานที่ทำให้ง่ายขึ้น
ภาษา
โดยพื้นฐานแล้ว PHP ไม่เหมาะสำหรับงานนี้และการสนับสนุนไลบรารี / เฟรมเวิร์กไม่ดีในพื้นที่นี้ Python (Scrapy เป็นจุดเริ่มต้นที่ยอดเยี่ยม) และ Clojure / Clojurescript (มีประสิทธิภาพและประสิทธิผลอย่างไม่น่าเชื่อ แต่เป็นช่วงการเรียนรู้ที่ยิ่งใหญ่) เป็นภาษาที่ยอดเยี่ยมสำหรับปัญหานี้ เนื่องจากคุณไม่ต้องการเรียนรู้ภาษาใหม่และคุณรู้จัก Javascript อยู่แล้วฉันขอแนะนำให้ใช้ JS ฉันไม่ได้ใช้ pjscrape แต่มันค่อนข้างดีจากการอ่านเอกสารของพวกเขาอย่างรวดเร็ว เหมาะอย่างยิ่งและใช้วิธีแก้ปัญหาที่ยอดเยี่ยมสำหรับปัญหาที่ฉันอธิบายไว้ด้านล่าง
หมายเหตุเกี่ยวกับนิพจน์ทั่วไป: ห้ามใช้นิพจน์ทั่วไปในการแยกส่วน HTML ผู้เริ่มต้นหลายคนทำเช่นนี้เพราะคุ้นเคยกับ regexes อยู่แล้ว เป็นความผิดพลาดอย่างมากใช้ตัวเลือก xpath หรือ css เพื่อนำทาง html และใช้เฉพาะนิพจน์ทั่วไปเพื่อดึงข้อมูลจากข้อความจริงภายในโหนด html สิ่งนี้อาจชัดเจนสำหรับคุณอยู่แล้วซึ่งจะเห็นได้ชัดอย่างรวดเร็วหากคุณลองใช้ แต่ผู้คนจำนวนมากเสียเวลาไปตามถนนเส้นนี้ด้วยเหตุผลบางประการ อย่ากลัว xpath หรือ css selectors พวกเขาเรียนรู้ได้ง่ายกว่า regexes และได้รับการออกแบบมาเพื่อแก้ปัญหานี้
ไซต์ Javascript-heavy
ในสมัยก่อนคุณต้องส่งคำขอ http และแยกวิเคราะห์การตอบกลับ HTML ตอนนี้คุณแทบจะต้องจัดการกับไซต์ที่ผสมผสานระหว่างคำขอ / การตอบกลับของ HTML มาตรฐานและการเรียก HTTP แบบอะซิงโครนัสที่ทำโดยส่วนจาวาสคริปต์ของไซต์เป้าหมาย นี่คือที่ซอฟต์แวร์พร็อกซีของคุณและแท็บเครือข่ายของ firebug / devtools มีประโยชน์มาก การตอบสนองต่อสิ่งเหล่านี้อาจเป็น html หรืออาจเป็น json ในบางกรณีที่เกิดขึ้นได้ยากจะเป็น xml หรืออย่างอื่น
มีสองวิธีในการแก้ไขปัญหานี้:
แนวทางระดับต่ำ:
คุณสามารถดูได้ว่า URL ของ ajax ที่จาวาสคริปต์เรียกใช้คืออะไรและคำตอบเหล่านั้นมีลักษณะอย่างไรและสร้างคำขอเดียวกันนั้นด้วยตัวคุณเอง ดังนั้นคุณอาจดึง html จากhttp://example.com/foobarและดึงข้อมูลชิ้นเดียวจากนั้นต้องดึงการตอบสนอง json จากhttp://example.com/api/baz?foo=b ... ไปที่ รับข้อมูลส่วนอื่น คุณจะต้องระวังการส่งคุกกี้หรือพารามิเตอร์เซสชันที่ถูกต้อง มันหายากมาก แต่บางครั้งพารามิเตอร์ที่จำเป็นสำหรับการโทร ajax จะเป็นผลมาจากการคำนวณที่บ้าคลั่งที่ทำในจาวาสคริปต์ของไซต์การทำวิศวกรรมย้อนกลับซึ่งอาจสร้างความรำคาญได้
วิธีการฝังเบราว์เซอร์:
ทำไมคุณต้องคำนวณว่าข้อมูลใดอยู่ใน html และข้อมูลใดมาจากการโทรของ ajax จัดการข้อมูลเซสชันและคุกกี้ทั้งหมดหรือไม่ คุณไม่จำเป็นต้องทำเมื่อคุณเรียกดูไซต์เบราว์เซอร์และจาวาสคริปต์ของไซต์จะทำเช่นนั้น นั่นคือประเด็นทั้งหมด
หากคุณเพิ่งโหลดหน้าลงในโปรแกรมเบราว์เซอร์ที่ไม่มีหัวเช่น phantomjs มันจะโหลดหน้าให้เรียกใช้จาวาสคริปต์และแจ้งให้คุณทราบเมื่อการเรียก ajax ทั้งหมดเสร็จสิ้น คุณสามารถฉีดจาวาสคริปต์ของคุณเองได้หากจำเป็นเพื่อให้เกิดการคลิกที่เหมาะสมหรืออะไรก็ตามที่จำเป็นเพื่อเรียกใช้จาวาสคริปต์ของไซต์เพื่อโหลดข้อมูลที่เหมาะสม
ตอนนี้คุณมีสองตัวเลือกให้ใช้เพื่อพ่น html ที่เสร็จแล้วและแยกวิเคราะห์หรือฉีดจาวาสคริปต์ลงในหน้าที่ทำการแยกวิเคราะห์และจัดรูปแบบข้อมูลและคายข้อมูลออก (อาจอยู่ในรูปแบบ json) คุณสามารถผสมสองตัวเลือกนี้ได้อย่างอิสระเช่นกัน
แนวทางใดดีที่สุด
ขึ้นอยู่กับว่าคุณจะต้องคุ้นเคยและสบายใจกับแนวทางระดับต่ำอย่างแน่นอน วิธีการเบราว์เซอร์แบบฝังใช้ได้กับทุกสิ่งมันจะง่ายกว่ามากในการนำไปใช้และจะทำให้ปัญหาที่ยุ่งยากที่สุดในการคัดลอกหายไป นอกจากนี้ยังค่อนข้างซับซ้อนของเครื่องจักรที่คุณจะต้องเข้าใจ ไม่ใช่แค่คำขอ HTTP และการตอบกลับ แต่เป็นคำขอการแสดงผลเบราว์เซอร์ที่ฝังไว้จาวาสคริปต์ไซต์จาวาสคริปต์ที่แทรกโค้ดของคุณเองและการโต้ตอบแบบ 2 ทางกับกระบวนการเบราว์เซอร์ที่ฝังไว้
เบราว์เซอร์แบบฝังยังช้ากว่ามากในระดับเนื่องจากค่าใช้จ่ายในการเรนเดอร์ แต่แทบจะไม่สำคัญอย่างแน่นอนเว้นแต่คุณจะขูดโดเมนที่แตกต่างกันจำนวนมาก ความต้องการของคุณในการ จำกัด อัตราการร้องขอของคุณจะทำให้เวลาในการแสดงผลน้อยมากในกรณีของโดเมนเดียว
การ จำกัด อัตรา / พฤติกรรมของบอท
คุณต้องตระหนักถึงเรื่องนี้ให้มาก คุณต้องส่งคำขอไปยังโดเมนเป้าหมายของคุณในอัตราที่เหมาะสม คุณต้องเขียนบ็อตที่มีพฤติกรรมดีเมื่อรวบรวมข้อมูลเว็บไซต์และนั่นหมายถึงการเคารพ robots.txt และไม่ตอกเซิร์ฟเวอร์ด้วยคำขอ ความผิดพลาดหรือความประมาทในที่นี้ถือเป็นการกระทำที่ผิดจรรยาบรรณเนื่องจากถือได้ว่าเป็นการโจมตีแบบปฏิเสธการให้บริการ อัตราที่ยอมรับได้จะแตกต่างกันไปขึ้นอยู่กับว่าคุณถามใคร 1req / s คือค่าสูงสุดที่โปรแกรมรวบรวมข้อมูลของ Google ทำงาน แต่คุณไม่ใช่ Google และคุณอาจไม่ได้รับการต้อนรับเท่า Google ให้ช้าที่สุดเท่าที่สมเหตุสมผล ฉันขอแนะนำ 2-5 วินาทีระหว่างคำขอแต่ละหน้า
ระบุคำขอของคุณด้วยสตริงตัวแทนผู้ใช้ที่ระบุบอทของคุณและมีหน้าเว็บสำหรับบอทของคุณเพื่ออธิบายวัตถุประสงค์ URL นี้ไปอยู่ในสตริงตัวแทน
คุณจะบล็อกได้ง่ายหากไซต์ต้องการบล็อกคุณ วิศวกรที่ชาญฉลาดในตอนท้ายของพวกเขาสามารถระบุบอทได้อย่างง่ายดายและการทำงานเพียงไม่กี่นาทีในตอนท้ายอาจทำให้หลายสัปดาห์ของการทำงานเปลี่ยนรหัสขูดของคุณในตอนท้ายของคุณหรือทำให้มันเป็นไปไม่ได้ หากความสัมพันธ์นั้นเป็นปฏิปักษ์กันวิศวกรที่ชาญฉลาดในไซต์เป้าหมายสามารถขัดขวางวิศวกรอัจฉริยะที่เขียนโปรแกรมรวบรวมข้อมูลได้อย่างสมบูรณ์ การขูดโค้ดมีความเปราะบางโดยเนื้อแท้และสามารถใช้ประโยชน์ได้ง่าย สิ่งที่กระตุ้นให้เกิดการตอบสนองนี้เกือบจะผิดจรรยาบรรณอยู่แล้วดังนั้นควรเขียนบอทที่ประพฤติตัวดีและอย่ากังวลกับเรื่องนี้
การทดสอบ
ไม่ใช่ผู้ทดสอบหน่วย / บูรณาการ? เลวร้ายเกินไป. ตอนนี้คุณจะต้องกลายเป็นหนึ่งเดียวกัน ไซต์มีการเปลี่ยนแปลงบ่อยและคุณจะเปลี่ยนรหัสของคุณบ่อยๆ นี่เป็นส่วนใหญ่ของความท้าทาย
มีชิ้นส่วนที่เคลื่อนไหวจำนวนมากที่เกี่ยวข้องกับการคัดลอกเว็บไซต์ที่ทันสมัยการทดสอบที่ดีจะช่วยได้มาก ข้อบกพร่องจำนวนมากที่คุณจะพบขณะเขียนโค้ดประเภทนี้จะเป็นประเภทที่ส่งคืนข้อมูลที่เสียหายโดยไม่โต้ตอบ หากไม่มีการทดสอบที่ดีเพื่อตรวจสอบการถดถอยคุณจะพบว่าคุณได้บันทึกข้อมูลที่เสียหายที่ไร้ประโยชน์ลงในฐานข้อมูลของคุณมาระยะหนึ่งแล้วโดยไม่สังเกตเห็น โครงการนี้จะทำให้คุณคุ้นเคยกับการตรวจสอบข้อมูล (ค้นหาไลบรารีที่ดีที่จะใช้) และการทดสอบ ไม่มีปัญหาอื่น ๆ อีกมากมายที่ต้องมีการทดสอบที่ครอบคลุมและยากมากที่จะทดสอบ
ส่วนที่สองของการทดสอบของคุณเกี่ยวข้องกับการแคชและการตรวจจับการเปลี่ยนแปลง ในขณะที่เขียนโค้ดของคุณคุณไม่ต้องการที่จะตอกเซิร์ฟเวอร์สำหรับหน้าเดิมซ้ำแล้วซ้ำเล่าโดยไม่มีเหตุผล ในขณะที่ทำการทดสอบหน่วยของคุณคุณต้องการทราบว่าการทดสอบของคุณล้มเหลวเนื่องจากคุณทำรหัสของคุณผิดหรือเนื่องจากเว็บไซต์ได้รับการออกแบบใหม่ เรียกใช้การทดสอบหน่วยของคุณกับสำเนาแคชของ URL ที่เกี่ยวข้อง พร็อกซีการแคชมีประโยชน์มากที่นี่ แต่การกำหนดค่าและใช้งานอย่างถูกต้องค่อนข้างยุ่งยาก
คุณต้องการทราบด้วยว่าไซต์มีการเปลี่ยนแปลงหรือไม่ หากพวกเขาออกแบบไซต์ใหม่และโปรแกรมรวบรวมข้อมูลของคุณใช้งานไม่ได้การทดสอบหน่วยของคุณจะยังคงผ่านเพราะพวกเขากำลังทำงานกับสำเนาแคช! คุณจะต้องมีการทดสอบการรวมชุดอื่นที่มีขนาดเล็กกว่าซึ่งใช้ไม่บ่อยกับไซต์ที่ใช้งานจริงหรือการบันทึกและการตรวจจับข้อผิดพลาดที่ดีในรหัสการรวบรวมข้อมูลของคุณซึ่งจะบันทึกปัญหาที่แน่นอนแจ้งเตือนคุณถึงปัญหาและหยุดการรวบรวมข้อมูล ตอนนี้คุณสามารถอัปเดตแคชเรียกใช้การทดสอบหน่วยของคุณและดูสิ่งที่คุณต้องเปลี่ยนแปลง
ประเด็นทางกฎหมาย
กฎหมายที่นี่อาจเป็นอันตรายเล็กน้อยหากคุณทำอะไรโง่ ๆ หากกฎหมายเข้ามาเกี่ยวข้องคุณกำลังติดต่อกับผู้ที่อ้างถึง wget และ curl เป็น "เครื่องมือแฮ็ก" เป็นประจำ คุณไม่ต้องการสิ่งนี้
ความเป็นจริงทางจริยธรรมของสถานการณ์คือไม่มีความแตกต่างระหว่างการใช้ซอฟต์แวร์เบราว์เซอร์เพื่อขอ url และดูข้อมูลบางส่วนและใช้ซอฟต์แวร์ของคุณเองเพื่อขอ url และดูข้อมูลบางส่วน Google เป็น บริษัท ขูดที่ใหญ่ที่สุดในโลกและเป็นที่ชื่นชอบของพวกเขา การระบุชื่อบอทของคุณใน User Agent และเปิดกว้างเกี่ยวกับเป้าหมายและความตั้งใจของโปรแกรมรวบรวมข้อมูลเว็บของคุณจะช่วยได้ที่นี่เนื่องจากกฎหมายเข้าใจว่า Google คืออะไร หากคุณกำลังทำสิ่งที่ไม่เหมาะสมเช่นการสร้างบัญชีผู้ใช้ปลอมหรือการเข้าถึงพื้นที่ของไซต์ที่คุณไม่ควร (ไม่ว่าจะถูก robots.txt "บล็อก" หรือเนื่องจากการแสวงหาประโยชน์จากการอนุญาตบางอย่าง) โปรดทราบว่าคุณกำลังทำสิ่งที่ผิดจรรยาบรรณ และความไม่รู้ของกฎหมายเกี่ยวกับเทคโนโลยีจะเป็นอันตรายอย่างยิ่งที่นี่ มันเป็นสถานการณ์ที่ไร้สาระ แต่มันเป็นเรื่องจริง
เป็นไปได้อย่างแท้จริงที่จะลองสร้างเครื่องมือค้นหาใหม่ในฐานะพลเมืองที่เข้มแข็งทำผิดพลาดหรือมีข้อบกพร่องในซอฟต์แวร์ของคุณและถูกมองว่าเป็นแฮ็กเกอร์ ไม่ใช่สิ่งที่คุณต้องการโดยพิจารณาจากความเป็นจริงทางการเมืองในปัจจุบัน
ฉันจะเขียนข้อความขนาดยักษ์นี้ให้ใคร
ฉันได้เขียนโค้ดที่เกี่ยวข้องกับการรวบรวมข้อมูลเว็บจำนวนมากในชีวิต ฉันพัฒนาซอฟต์แวร์ที่เกี่ยวข้องกับเว็บมานานกว่าทศวรรษในฐานะที่ปรึกษาพนักงานและผู้ก่อตั้งสตาร์ทอัพ ช่วงแรก ๆ กำลังเขียนโปรแกรมรวบรวมข้อมูล / เครื่องขูดและเว็บไซต์ php เมื่อเราฝัง iframe ที่ซ่อนไว้กำลังโหลดข้อมูล csv ลงในหน้าเว็บเพื่อทำ ajax ก่อนที่ Jesse James Garrett จะตั้งชื่อว่า ajax ก่อนที่ XMLHTTPRequest จะเป็นความคิด ก่อน jQuery ก่อน json ฉันอยู่ในช่วงกลางทศวรรษที่ 30 ซึ่งเห็นได้ชัดว่าเป็นของโบราณสำหรับธุรกิจนี้
ฉันเคยเขียนระบบรวบรวมข้อมูล / คัดลอกขนาดใหญ่สองครั้งครั้งเดียวสำหรับทีมขนาดใหญ่ที่ บริษัท สื่อ (ใน Perl) และเมื่อเร็ว ๆ นี้สำหรับทีมขนาดเล็กในฐานะ CTO ของการเริ่มต้นเครื่องมือค้นหา (ใน Python / Javascript) ปัจจุบันฉันทำงานเป็นที่ปรึกษาส่วนใหญ่เขียนโค้ดใน Clojure / Clojurescript (ภาษาผู้เชี่ยวชาญที่ยอดเยี่ยมโดยทั่วไปและมีห้องสมุดที่ทำให้ปัญหาของซอฟต์แวร์รวบรวมข้อมูล / เครื่องขูดเป็นเรื่องน่ายินดี)
ฉันเคยเขียนระบบซอฟต์แวร์ป้องกันการรวบรวมข้อมูลที่ประสบความสำเร็จเช่นกัน เป็นเรื่องง่ายมากที่จะเขียนเว็บไซต์ที่ไม่สามารถถอดรหัสได้หากคุณต้องการหรือระบุและทำลายล้างบอทที่คุณไม่ชอบ
ฉันชอบเขียนโปรแกรมรวบรวมข้อมูลเครื่องขูดและตัวแยกวิเคราะห์มากกว่าซอฟต์แวร์ประเภทอื่น ๆ มันท้าทายสนุกและสามารถใช้เพื่อสร้างสิ่งที่น่าอัศจรรย์