การขูดเว็บไซต์แบบไดนามิกโดยใช้ Python และ Selenium
บทนำ
เมื่อก่อนฉันได้รับมอบหมายงานให้รวบรวมข้อมูลการจองโรงแรมจากเว็บไซต์ภาษาสเปน เรามีตัวเลือกสองสามอย่างเมื่อเราเจองานประเภทนี้ ได้แก่ ซุปสวย ของเสีย และซีลีเนียม ซุปที่สวยงามไม่ทำงานได้ดีกับเว็บไซต์ไดนามิก และฉันไม่ชอบวิธีการทำงานของสแครปสคริปต์ ซึ่งแตกต่างจากวิธีอื่น ๆ ที่คุณเริ่มวางลิงก์ทันที ในซีลีเนียม คุณจะต้องได้รับ Webdriver สำหรับเบราว์เซอร์ที่คุณต้องการใช้สำหรับงานนี้ก่อน
การวางระบบสำหรับโครงการ
ขั้นตอนที่สำคัญที่สุดก่อนที่เราจะเริ่มต้นโครงการคือการจัดเตรียมระบบของคุณให้พร้อมสำหรับโครงการ ต่อไปนี้เป็นขั้นตอนในการตั้งค่าโครงการ:
- Python - คุณสามารถดาวน์โหลด python ได้จากที่นี่ ตรวจสอบให้แน่ใจว่าคุณได้เพิ่ม python ในเส้นทางเมื่อทำการติดตั้ง
- สร้างสภาพแวดล้อมเสมือนจริงในไดเร็กทอรีโครงการของคุณ คุณสามารถสร้างสภาพแวดล้อมเสมือนจริงโดยใช้
python -m venv [name you want to give to your environment]. - เปิดใช้งานสภาพแวดล้อมเสมือนจริงของคุณ ฉันถือว่าคุณอยู่ในไดเร็กทอรีโครงการแล้วและ
[environment name]\Scripts\activateจะเปิดใช้งานสภาพแวดล้อมเสมือนจริงของคุณ - ตอนนี้ ในสภาพแวดล้อมนี้ คุณจะติดตั้งซีลีเนียม
pip install selenium==<required version>จะติดตั้งซีลีเนียมเวอร์ชันที่คุณต้องการ ฉันใช้เวอร์ชัน 3 สำหรับโครงการ - รับไดรเวอร์ Chrome โดยขึ้นอยู่กับเวอร์ชันของ Chrome ที่คุณใช้ คุณสามารถรับไดรเวอร์ของคุณได้จากที่นี่
ข้อมูลที่แยกออกมาจะอยู่ภายในไดเร็กทอรี "ข้อมูล" และไดรเวอร์ที่เราดาวน์โหลดจะอยู่ในไดเร็กทอรี "ไดรเวอร์"
ตอนนี้ ภายในไดเร็กทอรีหลัก คุณจะสร้างไฟล์ python ซึ่งคุณจะเขียนสคริปต์เพื่อขูดข้อมูลออกจากเว็บไซต์
เราจะเริ่มต้นด้วยการนำเข้าไลบรารีที่จำเป็น:
ในการเริ่มสคริปต์ ก่อนอื่นเราจะสร้างวัตถุไดรเวอร์ด้วยselenium.webdriverวิธีต่อไปนี้:
driver = webdriver.Chrome(executable_path ='data/chromedriver.exe')
เว็บไซต์ที่เราต้องการรวบรวมข้อมูลคือ rentaldia และสามารถพบได้ตามที่อยู่นี้ “https://es.rentalia.com/”
เราจะให้คนขับเข้าเว็บไซต์ก่อนโดยใช้คำสั่งdriver.get('https://es.rentalia.com/')
ตอนนี้เมื่อไดรเวอร์อยู่ในเว็บไซต์ก็สามารถเข้าถึงองค์ประกอบ html ทั้งหมดที่ปรากฏบนหน้าเว็บที่เปิดอยู่ คุณสามารถอ้างอิงลิงค์นี้เพื่อทราบเกี่ยวกับฟังก์ชันที่เราสามารถใช้เพื่อเข้าถึงองค์ประกอบต่างๆ ที่แสดงอยู่บนหน้าเว็บ -”https://iqss.github.io/dss-webscrape/finding-web-elements.html".
คุณน่าจะคุ้นเคยกับฟังก์ชั่นตัวเลือกองค์ประกอบใน selenium webdriver ในตอนนี้ และขั้นตอนต่อไปคือการรับการอ้างอิงขององค์ประกอบที่คุณต้องการรับข้อมูล เพื่อที่คุณจะต้องเปิดตัวเลือกสำหรับนักพัฒนาซอฟต์แวร์ในเบราว์เซอร์ของคุณ คุณเพียงแค่กดF12หรือคลิกขวาบนองค์ประกอบที่คุณต้องการเลือก แล้วคุณจะพบตัวเลือกในการตรวจสอบเมื่อคลิก ซึ่งคุณจะถูกนำไปยังโค้ด html สำหรับสิ่งนั้น จากโค้ดนั้น คุณจะได้ชื่อคลาส, html, id หรือ X-path สามารถรับ X-path ได้ในเมนูที่ปรากฏขึ้นเมื่อคลิกองค์ประกอบโค้ด html
นี่คือวิธีที่คุณจะได้รับ X-path:
เริ่มต้นด้วยกระบวนการ:
ประเด็นแรกและสำคัญที่สุดคือการเปิดเว็บไซต์บนเบราว์เซอร์ที่คุณจะทำให้ไดรเวอร์เว็บของคุณทำงานด้วยและเริ่มสังเกตกระบวนการต่างๆ
ตัวอย่างเช่น มีปุ่มสำหรับยอมรับคุกกี้ทันทีที่หน้าโหลด คุณจะสามารถโต้ตอบกับเนื้อหาภายในได้ก็ต่อเมื่อคุณคลิกปุ่มนั้นแล้ว
ตอนนี้เมื่อคุณผ่านขั้นตอนนี้แล้ว คุณจะต้องกรอกข้อมูลเพื่อให้ได้ผลลัพธ์สำหรับพื้นที่ที่คุณต้องการข้อมูล หน้าผลลัพธ์จะมีรายชื่อโรงแรมพร้อมข้อมูลเกี่ยวกับห้องพัก เช่น ราคาต่อคืน ที่ตั้ง คำอธิบายสั้น ๆ ฯลฯ สิ่งหนึ่งที่ไม่มีในหน้านั้นคือหมายเลขติดต่อที่คุณสามารถใช้เพื่อสอบถามเกี่ยวกับห้องพัก ดังนั้นเราจะต้องไปที่หน้ารายละเอียดห้องพักแต่ละโรงแรมเพื่อรับหมายเลข
ฉันได้แบ่งการสร้างสคริปต์ออกเป็นขั้นตอนต่อไปนี้:
- การเข้าถึงปุ่มยอมรับเงื่อนไขเพื่อเข้าสู่หน้าเว็บ
#clicking the accepting button
cookies_btn = driver.find_element('xpath', '//*[@id="didomi-host"]/div/div/div/div//div[2]/button[2]')
cookies_btn.click()
# we used xpath to access the element and once we get the object made for the element we can click simply by adding click() method.
# inputing the locations from the given list
input_field.send_keys(loc)
ActionChains(driver).send_keys(Keys.DOWN).send_keys(Keys.ENTER).perform()
# we replicated the interaction we make to input and submit the query in the input bar using action chains
ในการรับข้อมูลสำหรับแต่ละไซต์ ฉันได้รวมการวนซ้ำไว้ในคำสั่งเขียนเพื่อสร้างตารางที่มีเฉพาะส่วนหัวที่เกี่ยวกับตัวแปรที่เรามี และจากนั้นในขณะที่การวนซ้ำดำเนินต่อไป โค้ดจะเติมแถวด้วยข้อมูลจากตัวยึดตำแหน่งที่เรากำหนดและใช้สำหรับการแยก มีอีกสองสามอย่างที่ฉันเพิ่มเข้าไปเพื่อให้มันทำงานได้ดีและมีประสิทธิภาพในการรวบรวมข้อมูล คุณสามารถหาโค้ดที่เสร็จแล้วได้ที่นี่ ตัวอย่างเช่น ฉันได้สร้างสคริปต์เพื่อรับอินพุตจากผู้ใช้เป็นอาร์กิวเมนต์ คุณจะได้รับข้อมูลที่จำเป็นทั้งหมดในพื้นที่เก็บข้อมูลนั้น แต่ก่อนที่จะรับโค้ดจากที่นั่น ฉันต้องการให้คุณดำเนินการนี้ด้วยตัวคุณเอง
นอกจากนี้ ไม่มีกฎมาตรฐานในการรับข้อมูลในไฟล์ csv ดังนั้นทำในสิ่งที่คุณคิดว่าน่าสนใจ
ฉันหวังว่านี่จะเป็นประโยชน์!





































![รายการที่เชื่อมโยงคืออะไร? [ส่วนที่ 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)