บทเรียนจาก Semalt: Web Scraping ใน Python

ฉันได้ไปเยี่ยมชม KinoPoisk (รุ่น IMDB ของรัสเซีย) เมื่อเร็ว ๆ นี้และพบว่าในช่วงหลายปีที่ผ่านมาฉันจัดการให้คะแนนภาพยนตร์มากกว่า 1,000 เรื่อง ฉันคิดว่ามันน่าสนใจที่จะศึกษาข้อมูลเหล่านี้ให้ละเอียดมากขึ้น: หนังของฉันเปลี่ยนไปตามกาลเวลาหรือไม่? ฉันจะดูหนังมากขึ้นในช่วงฤดูกาลใดของปี?

แต่ก่อนที่เราจะวิเคราะห์และสร้างกราฟิกที่สวยงามเราต้องได้รับข้อมูล น่าเสียดายที่บริการจำนวนมากไม่มี API สาธารณะดังนั้นคุณต้องพับแขนเสื้อและแยกวิเคราะห์หน้า html

บทความนี้มีไว้สำหรับผู้ที่ต้องการเรียนรู้วิธีการใช้ Web Scrapping อยู่เสมอ แต่ไม่เข้าใจและไม่ทราบว่าจะเริ่มต้นอย่างไร

งาน

หน้าที่ของเราคือการดึงข้อมูลเกี่ยวกับภาพยนตร์ที่ได้ดูไปแล้ว: ชื่อภาพยนตร์วันที่และเวลาที่รับชมการจัดอันดับของผู้ใช้

อันที่จริงงานของเราจะดำเนินการใน 2 ขั้นตอน:

ขั้นตอนที่ 1: ดาวน์โหลดและบันทึกหน้า html

ขั้นตอนที่ 2: แยกวิเคราะห์ HTML ในรูปแบบที่เหมาะสมสำหรับการวิเคราะห์เพิ่มเติม (csv, json, pandas dataframe เป็นต้น)

เครื่องดนตรี

python-libraries มีจำนวนมากสำหรับการส่งคำขอ HTTP สิ่งที่มีชื่อเสียงและมีประโยชน์มากที่สุดคือคำขอ

นอกจากนี้ยังจำเป็นต้องเลือกห้องสมุดสำหรับการแยกวิเคราะห์ HTML

BeatifulSoup, lxml

นี่เป็นสองห้องสมุดยอดนิยมสำหรับการแยกวิเคราะห์ HTML และการเลือกหนึ่งในนั้นเป็นเพียงการตั้งค่าส่วนตัว ยิ่งไปกว่านั้นไลบรารี่เหล่านี้เชื่อมโยงกันอย่างใกล้ชิด: BeautifulSoup เริ่มใช้ lxml เป็น parser ภายในสำหรับการเร่งความเร็วและใน lxml, โมดูล soupparser ถูกเพิ่มเข้ามา เพื่อเปรียบเทียบวิธีฉันจะแยกข้อมูลด้วย BeautifulSoup และใช้ตัวเลือก XPath ในโมดูล lxml.html

กำลังดาวน์โหลดข้อมูล

มาเริ่มดาวน์โหลดข้อมูลกัน ก่อนอื่นเรามาลองรับหน้าด้วย url และบันทึกเป็นไฟล์โลคอล

เราเปิดไฟล์ผลลัพธ์และดูว่ามันไม่ง่ายขนาดนั้น: ไซต์พิจารณาว่าเราเป็นหุ่นยนต์และจะไม่แสดงข้อมูล

มาดูกันว่าเว็บไซต์ทำงานอย่างไร

เบราว์เซอร์ไม่มีปัญหาในการรับข้อมูลจากเว็บไซต์ มาดูกันว่ามันส่งคำขออย่างไร ในการทำสิ่งนี้เราใช้พาเนล "เครือข่าย" ใน "เครื่องมือสำหรับนักพัฒนาซอฟต์แวร์" ในเบราว์เซอร์ (ฉันใช้ Firebug สำหรับสิ่งนี้) โดยทั่วไปคำขอที่เราต้องการนั้นยาวที่สุด

อย่างที่เราเห็นเบราว์เซอร์จะส่ง UserAgent ส่วนหัวคุกกี้และพารามิเตอร์อีกจำนวนหนึ่ง ขั้นแรกเราจะพยายามส่ง UserAgent ที่ถูกต้องไปยังส่วนหัว

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

ดาวน์โหลดราคาทั้งหมด

ขณะนี้เราสามารถบันทึกหน้าเว็บด้วยอัตรา แต่โดยปกติผู้ใช้จะมีอัตรามากและจำเป็นต้องทำซ้ำในทุกหน้า หมายเลขหน้าที่เราสนใจนั้นง่ายต่อการโอนไปยัง URL โดยตรง

การรวบรวมข้อมูลจาก Html

ตอนนี้เรามารวบรวมข้อมูลจาก html โดยตรง วิธีที่ง่ายที่สุดในการทำความเข้าใจวิธีการจัดโครงสร้างหน้า html คือการใช้ฟังก์ชัน "ตรวจสอบองค์ประกอบ" ในเบราว์เซอร์ ในกรณีนี้ทุกอย่างค่อนข้างง่าย: ทั้งตารางที่มีอัตราอยู่ในแท็ก เลือกโหนดนี้:

จาก bs4 นำเข้า BeautifulSoup

จาก lxml import html

# ซุปที่สวยงาม

soup = BeautifulSoup (ข้อความ)

film_list = soup.find ('div', ('class': 'profileFilmsList'))

# lxml

tree = html.fromstring (ข้อความ)

film_list_lxml = tree.xpath ('// div [@class =' 'profileFilmList' ']') [0]

มาเรียนรู้วิธีดึงชื่อรัสเซียของภาพยนตร์และลิงก์ไปยังหน้าของภาพยนตร์ (เช่นวิธีรับข้อความและค่าของแอตทริบิวต์)

หากคุณต้องการแยกชื่อเป็นภาษาอังกฤษเพียงเปลี่ยน "nameRus" เป็น "nameEng"

ผล

เราเรียนรู้วิธีแยกวิเคราะห์เว็บไซต์ทำความคุ้นเคยกับคำขอห้องสมุด, BeautifulSoup, และ lxml รวมถึงข้อมูลที่ได้รับที่เหมาะสมสำหรับการวิเคราะห์ภาพยนตร์ที่ได้รับชมบน KinoPoisk ต่อไป