วิธีใดดีที่สุดในการดึงข้อมูลจากเว็บไซต์ [ปิด]


107

ฉันต้องการแยกเนื้อหาจากเว็บไซต์ แต่แอปพลิเคชันไม่มีอินเทอร์เฟซการเขียนโปรแกรมแอปพลิเคชันหรือกลไกอื่นในการเข้าถึงข้อมูลนั้นโดยใช้โปรแกรม

ฉันพบเครื่องมือของบุคคลที่สามที่มีประโยชน์ที่เรียกว่าImport.ioซึ่งมีฟังก์ชันคลิกแล้วไปสำหรับการขูดหน้าเว็บและสร้างชุดข้อมูลสิ่งเดียวคือฉันต้องการเก็บข้อมูลไว้ในเครื่องและฉันไม่ต้องการสมัครแผนการสมัครสมาชิกใด ๆ .

บริษัท นี้ใช้เทคนิคอะไรในการคัดลอกหน้าเว็บและสร้างชุดข้อมูล ฉันพบกรอบการขูดเว็บpjscrape & Scrapyพวกเขาสามารถให้คุณสมบัติดังกล่าวได้


4
PHP ไม่ได้อยู่ในคำถามอย่างแน่นอนนั่นเป็นสิ่งที่ผิดอย่างชัดเจน gist.github.com/krakjoe/b1526fcc828621e840cb
Joe Watkins

@JoeWatkins ที่ดูดีจริงๆต้องมีการกำหนดค่า PHP พิเศษเพื่อเรียกใช้หรือไม่? และประสิทธิภาพในการเปรียบเทียบกับเครื่องมือ / ภาษาที่ให้ไว้ด้านล่างเป็นอย่างไร?
0x1ad2

1
ต้องมีการสร้างเธรดที่ปลอดภัยของ PHP และ pthreads อ่านgithub.com/krakjoe/pthreads/blob/master/README.mdคุณสามารถหาฉันได้ในแชทถ้าคุณต้องการความช่วยเหลือฉันหรือใครก็ได้ :)
Joe Watkins

@ 0x1ad2 หากคุณต้องการเก็บข้อมูลไว้ในเครื่องคุณควรลองใช้ซอฟต์แวร์ ( datascraping.co ) แทน Web API เครื่องมือส่วนใหญ่ใช้ Xpath, CSS selector และ REGEX เพื่อดึงข้อมูลจากเว็บไซต์และ Data Scraping Studio รองรับคุณสมบัติทั้ง 3 นี้
Vikash Rathee

มีสองวิธีวิธีหนึ่งคือการเปิดตัวของคุณเองโดยใช้ไลบรารีฟรี / โอเพ่นซอร์สซึ่งใช้ความพยายามอย่างมาก คุณสามารถสร้างโปรแกรมรวบรวมข้อมูลเว็บ ajax สำหรับไซต์ใดก็ได้โดยใช้scrape.itมันเป็นเครื่องมือที่ต้องชำระเงิน แต่ใช้งานได้เมื่อไม่มีเครื่องมือฟรีเช่น import.io หรือกิโมโนไม่สามารถแสดงผลได้
I Love Python

คำตอบ:


271

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

ฉันเคยเขียนระบบซอฟต์แวร์ป้องกันการรวบรวมข้อมูลที่ประสบความสำเร็จเช่นกัน เป็นเรื่องง่ายมากที่จะเขียนเว็บไซต์ที่ไม่สามารถถอดรหัสได้หากคุณต้องการหรือระบุและทำลายล้างบอทที่คุณไม่ชอบ

ฉันชอบเขียนโปรแกรมรวบรวมข้อมูลเครื่องขูดและตัวแยกวิเคราะห์มากกว่าซอฟต์แวร์ประเภทอื่น ๆ มันท้าทายสนุกและสามารถใช้เพื่อสร้างสิ่งที่น่าอัศจรรย์


4
ฉันเคยเห็นด้วยกับคุณเกี่ยวกับ PHP เป็นตัวเลือกที่ไม่ดี แต่ด้วยไลบรารีที่เหมาะสมก็ไม่เลว การจัดการ Regex และ array / sting นั้นเงอะงะ แต่ในด้านบวกมันรวดเร็วและทุกที่
pguardiario

3
ในสภาพแวดล้อมที่มีห้องสมุดไม่กี่แห่งที่ทำให้สิ่งนี้มีความสุขและมีจำนวนมากที่ทำให้มันค่อนข้างง่ายและค่อนข้างง่าย ... ทำไมคุณถึงเลือกที่ "ไม่เลวร้ายเกินไป" ฉันยอมรับมันทำได้ใน PHP (และ FORTRAN, C, VB และอื่น ๆ ) แต่ถ้าปัญหาของคุณง่ายมากก็ควรใช้เครื่องมือที่เหมาะสมกับงานนั้นดีกว่ามาก และอีกครั้งเว้นแต่คุณจะมีปัญหาที่ง่ายอย่างไม่น่าเชื่อในการแก้ไข ... regex มีความสำคัญอย่างไร? การติดตั้งไลบรารีนั้นง่ายกว่าปัญหาการขูดเกือบทุกอย่าง และจริงๆแล้ว regex มักจะค่อนข้างช้าสำหรับปัญหานี้
Jesse Sherlock

5
คุณอาจจะพูดถูก แต่ฉันรู้ว่าฉันไม่สามารถทำได้อย่างง่ายดายใน PHP ก่อนที่ฉันจะย้ายออกจาก PHP ฉันมีประสบการณ์ PHP แบบมืออาชีพมาเกือบสิบปีแล้ว ฉันใช้เวลามากกว่าหนึ่งปีเต็มในการสร้างระบบการขูดตามขนาดใน Python และฉันนึกไม่ออกว่าจะทำอะไรได้บ้างหากไม่มีไลบรารีที่ดีที่ไม่มีใน PHP หรือทำโดยไม่มีเทคนิคการเขียนโปรแกรมเมตาที่รัดกุมใน Python . นั่นเป็นเหตุผลที่ฉันย้ายไปที่ Clojure เพื่อรับความสามารถในการเขียนโปรแกรมเมตาที่ทรงพลังยิ่งขึ้น
Jesse Sherlock

4
ทำให้มีชีวิตชีวาพร้อมกับพลังของ Clojure สำหรับโค้ดเฉพาะโครงการคือผู้ชนะที่ยิ่งใหญ่ที่สุด Schema เป็นไลบรารีการตรวจสอบความถูกต้องที่ยอดเยี่ยมซึ่งเป็นส่วนสำคัญของรหัสการสกัดข้อมูล ตอนนี้ฉันมีความสุขมากกับการทำงานร่วมกันที่ง่ายดายกับโลก Java สำหรับสิ่งต่างๆเช่น Mahout และ Nashorn / Rhino สำหรับการเรียกใช้ js บางประเภท และคน Clojure เป็นประเภทที่เขียน libs เช่นgithub.com/shriphani/subotaiนี้เพื่อที่คุณจะได้ไม่ต้องทำ ... มีต่อในความคิดเห็นถัดไป ...
Jesse Sherlock

3
ฉันยังพบว่าเมื่อคุณต้องการเบราว์เซอร์จริงและจำเป็นต้องใช้ phantomjs / casperjs การใช้ clojurescript (มักใช้รหัสร่วมกันระหว่าง clj และ cljs โดยใช้ cljx) เพื่อเขียน js ที่คุณฉีดเข้าไปในหน้าแทนที่จะเป็น clojurescript . Core.async นั้นยอดเยี่ยมสำหรับการประสานงานโค้ดการรวบรวมข้อมูลพร้อมกันบนเซิร์ฟเวอร์รวมถึงการออกจากนรกเรียกกลับภายในสภาพแวดล้อม js (การประสานการทำงานอัตโนมัติของเบราว์เซอร์กับโค้ด core.async cljs ภายใน phantomjs นั้นเป็นสวรรค์เมื่อเทียบกับทางเลือกอื่น)
Jesse Sherlock

21

ใช่คุณสามารถทำได้ด้วยตัวเอง เป็นเพียงเรื่องของการดึงแหล่งที่มาของหน้าเว็บและแยกวิเคราะห์ตามที่คุณต้องการ

มีความเป็นไปได้ที่หลากหลาย คำสั่งผสมที่ดีคือการใช้python-request (สร้างขึ้นที่ด้านบนของ urllib2 อยู่urllib.requestใน Python3) และBeautifulSoup4ซึ่งมีวิธีการเลือกองค์ประกอบและอนุญาตให้ใช้ตัวเลือก CSS :

import requests
from BeautifulSoup4 import BeautifulSoup as bs
request = requests.get("http://foo.bar")
soup = bs(request.text) 
some_elements = soup.find_all("div", class_="myCssClass")

บางคนจะชอบแยก XPath หรือ jQuery เหมือน pyquery, lxml หรือสิ่งอื่นใด

เมื่อข้อมูลที่คุณต้องการมาจากJavaScriptบางส่วนข้อมูลข้างต้นจะไม่ทำงาน คุณต้องใช้ python-ghost หรือ Selenium ฉันชอบรุ่นหลังรวมกับ PhantomJSเบากว่าและติดตั้งง่ายกว่ามากและใช้งานง่าย:

from selenium import webdriver
client = webdriver.PhantomJS()
client.get("http://foo")
soup = bs(client.page_source)

ฉันอยากจะแนะนำให้เริ่มแก้ปัญหาของคุณเอง คุณจะเข้าใจประโยชน์ของ Scrapy ในการทำเช่นนั้น

ps: ดูเรื่องที่สนใจ: https://github.com/scrapy/scrapely

pps: ดูที่ Portia เพื่อเริ่มดึงข้อมูลด้วยสายตาโดยไม่ต้องมีความรู้ด้านการเขียนโปรแกรม: https://github.com/scrapinghub/portia


ขอบคุณสำหรับ anwser ปัญหาเดียวคือ Python ไม่ได้อยู่ในชุดทักษะของฉัน มีภาษาโปรแกรมอื่น ๆ ที่สามารถทำงานเดียวกันได้หรือไม่? ฉันทำงานกับ PHP และ Javascript เป็นหลัก
0x1ad2

ขออภัยในความสับสน (ฉันพูดถึงกรอบ Python ในคำถามของฉัน) แต่ถ้า Python เป็นวิธีที่ดีที่สุดฉันสามารถเรียนรู้ได้
0x1ad2

Python ทำให้ scrapy ง่ายมาก นอกจากนี้ยังง่ายต่อการเรียนรู้ มีดโกนที่ดีที่สุดที่ทำงานได้ดีในขณะนี้คือมีดโกน พวกเขายังมีเอกสารที่ดีมาก
Abhishek
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.