简单的携程用车接送机数据爬虫

python菜鸡一枚.  因为之前的学习得到很多善良的博主的推荐.在网上没有看到关于携程用车数据的爬虫(估计没人会关注这个).

所以抛砖引玉,写一个非常非常粗糙的爬虫来爬取单个页面携程用车的供应商+评分+价格.  希望记录一下自己写代码的过程,以及能够帮助到那些可能会有需求的朋友,谢谢~~

思路是   获取单个链接>>>>使用selenium手动登录>>>>selenium进行爬取价格...

from selenium import webdriver  
from selenium.common.exceptions import NoSuchElementException  
from selenium.webdriver.common.keys import Keys  
import time  
from bs4 import BeautifulSoup
import tkinter as tk  
from tkinter import filedialog  
import datetime
from lxml import etree
import re
#验证标题,判断是登录页面还是用车页面
def assert_title(text):
    while True:
        try :
            assert text in browser.title 
            break
        except:
            time.sleep(5)
            assert_title(text)

#获取供应商信息
def get_supplier():
    html = browser.page_source
    soup= BeautifulSoup(html,'html.parser')
    car_num = 0
    
    #创建车型的list,方便下方引用
    car_type=[]
    html = browser.page_source
    soup= BeautifulSoup(html,'html.parser')
    car_type=[]
    tree = etree.HTML(html)
    result = tree.xpath('//p[@class="name fl"]/big')
    for i in result:
        car_type.append(i.text.strip())
        
    #读取供应商的价格/评分.再引入车型号        \
    for soup2 in soup.find_all("dl",{"class":"clt_det"}):
        list= []
        t=0
        times = 1 
        for soup3 in soup2.find_all("dd",{"class":"clearfix bb"}):
            fuhao=''
            supplier = soup3.find("b").string
            price = re.search('<big>(\d+)</big>',str(soup3.find_all("dfn"))).group(1)
            score = re.search('<big>(\d+.\d)</big>',str(soup3.find_all("span",{"class":"score fl"}))).group(1)
            count= 10 - 2* len(supplier)  #方便对齐评分.看起来美观
            print(car_type[car_num],supplier,count*' ','评分:',score,'价格:',price,'元',)
            times +=1
            list=[]
            if times ==4:   #只打印单个车型前三个产品.到了4时直接结束该车型的打印
                break
        car_num +=1
        print('- - - - - - - - - - - - - ')
browser = webdriver.Chrome() # Get local session of chrome
#登录携程的登录页面.获取携程的登录cookie. 保证后续无需登录.
time1= datetime.datetime.now()
#试了很久,还是无法用cookie绕开携程的登录验证.因此每次运行的时候,都需要重新登录
browser.get('https://passport.ctrip.com/user/login?BackUrl=http%3A%2F%2Fwww.ctrip.com%2F')
assert_title('登录首页')
username = browser.find_element_by_id("nloginname") 
password = browser.find_element_by_id("npwd") 
username.send_keys("你的账号") 
password.send_keys("你的密码") 
#以上自动输入账号+密码,并且自动点击登录
browser.find_element_by_id("nsubmit").click()


assert_title('携程')
browser.implicitly_wait(20) # Let the page load

print('登录完成\n')

接下来只需要弄一个携程用车链接的list,就可以直接开始打印啦~~

我是用Excel记录携程的链接的.

for row in excel_value[1:]:
    url = row[1]
    browser.get(url)
    time.sleep(5)  #这里显性等待和隐性等待都用了一遍哈~~ 因为我也不差这5s.就是这么任性
    browser.implicitly_wait(60)
    print(row[2],'  ')
    print('- - - - - - - - - - - - - ')
    try:
        get_supplier()
    except:
        time.sleep(5)
        get_supplier()
    print('\n\n')
print('ALL DONE')
print('总共耗时',(datetime.datetime.now()-time1).seconds,'seconds')
browser.close()

打印出来大概是


这样的.






猜你喜欢

转载自blog.csdn.net/xueaalei1/article/details/80376430
今日推荐