利用selenium和BeautifulSoup库爬取携程的机票信息。比直接用request库请求的方式简单很多被禁的概率也低了很多。
运行平台: Windows
Python版本: Python 3.8
IDE: Pycharm
基本思路:打开携程首页点击机票页,再输入城市和时间点击搜索,再在搜索的详情页把机票的详细信息爬取出来。
遇到的问题
时间输入后无法搜索
问题:在输入出发城市和到达城市后,把时间也输入后无法点击搜索按键。
解决方法:先输入时间再输入城市就可以点击搜索按键。
# 选择日期
inputTag = driver.find_element_by_id('FD_StartDate')
inputTag.send_keys('2020-01-01')
time.sleep(1)
# 选择出发城市
inputTag = driver.find_element_by_id('FD_StartCity')
inputTag.send_keys('北京')
time.sleep(1)
# 选择到达城市
inputTag = driver.find_element_by_id('FD_DestCity')
inputTag.send_keys('上海')
机票信息不完全
问题:在一开始爬虫的网页中发现,直接爬取的机票信息并不全,会漏掉下面的几条航班信息。后来发现携程使用了滚动加载,即一开始不会加载完成全部信息只有当滚动条到下面才会下面后面的信息
解决方法:用selenium模拟一个滚动条向下滚动的动作。range(5)是让网页下拉5次的意思,因为我还没找到更好的解决办法只有多模拟下拉几次要是不够的话,可以将range内的值改大。要是后续有更好的改进方法我会贴在后面
# 模拟下拉,针对懒加载
for i in range(5):
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(3)
代码
# 利用selenium爬取携程
import time
from selenium import webdriver
from bs4 import BeautifulSoup
def main():
driver_path = r'E:\PythonProject\Spider\chromedriver.exe'
driver = webdriver.Chrome(executable_path=driver_path)
driver.get('https://www.ctrip.com/')
time.sleep(1)
# 从首页选择进入机票页面
inputTag = driver.find_element_by_class_name('s_tab_nocurrent')
inputTag.click()
time.sleep(2)
# 选择日期
inputTag = driver.find_element_by_id('FD_StartDate')
inputTag.send_keys('2020-01-01')
time.sleep(1)
# 选择出发城市
inputTag = driver.find_element_by_id('FD_StartCity')
inputTag.send_keys('重庆')
time.sleep(1)
# 选择到达城市
inputTag = driver.find_element_by_id('FD_DestCity')
inputTag.send_keys('上海')
time.sleep(1)
# 开始搜索
inputTag = driver.find_element_by_id('FD_StartSearch')
inputTag.click()
time.sleep(1)
# 模拟下拉,针对懒加载
for i in r