#爲了實時獲取車輛信息,以及爲了後面進行行使軌跡繪圖,寫了一個基於selelnium的爬蟲爬取了車輛gps數據。html
#在這裏發現selenium能夠很好的實現網頁解析和處理js處理web
#導包canvas
import time
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWaitdom
#如下兩個包是爲了設置顯示等待(從網上覆制的)
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By函數
class Car_Lines():
def __init__(self):
self.driver = webdriver.Chrome()網站
#登陸網站
def login_web(self):
self.driver.get('http://www.gpsoo.net/index.shtml')
time.sleep(0.5)
while 1:
try:
self.driver.find_element_by_id('loginToggle').click()
self.driver.find_element_by_class_name('first').click()
self.driver.find_element_by_id('txtUserName').send_keys('***')
self.driver.find_element_by_id('txtPwd').send_keys('***')
self.driver.find_element_by_class_name('login_btn').click()
print('已成功登陸')
break
except:
print('未登陸成功,繼續登陸')ui
# 點擊 下載軌跡
def download_data(self):
self.driver.find_element_by_xpath("//div[@id='dl-gps-data']/span").click()
self.clear_js()url
#清楚原始輸入框的信息
self.driver.find_element_by_id('dl-from').clear()spa
#此處傳入下載起始時間
self.driver.find_element_by_id('dl-from').send_keys(self.seven_day())
time.sleep(2)
self.driver.find_element_by_id("dl-data-btn").click()
self.driver.back().net
#車輛信息
def info(self,x):
#此處url是一個iframe框裏的url地址,能夠進入頁面時刷新頁面會出現
self.driver.get(url)
time.sleep(1)
#給xpath傳入變量,解析三種車輛,此處用format傳入
info = self.driver.find_elements_by_xpath("//div[@groupid={}]/div[@class='group_canvas']/div".format(x))
time.sleep(0.5)
return info
#消除input框的readonly屬性
def clear_js(self):
try:
#首先由於id爲dl-from的標籤在網頁源碼中是不存在的,此處是經過js加載出來,因此設置顯示等待等待dl-from標籤加載出來
#顯示等待能夠按頻率一直等到標籤出現,此處合適,有利於時間利用
WebDriverWait(self.driver, 20, 0.5).until(EC.presence_of_element_located((By.ID, "dl-from")))
except Exception as e:
print(e)
#同時這個標籤是一個只讀標籤,由於此處是個日期控件,須要設置js消除標籤的只讀屬性
js = 'document.getElementById("dl-from").removeAttribute("readonly");'
return self.driver.execute_script(js)
#時間間隔爲7天
def seven_day(self):
#用datetime包算出七天前的日期時間
t1 = time.time()
t2 = t2 = t1 - 86400 * 7
t2_1 = time.localtime(t2)
t3 = time.strftime("%Y-%m-%d %H:%M:%S", t2_1)
return t3
#獲取車輛ID和username並下載軌跡
def get_id_username(self,x):
#默認的id及用戶
id = '***'
username = "***"
#遍歷全部車輛
for i in range(99):
#這裏並非遍歷了99次,由於每一類型車輛數量不足99,也爲了節省時間和處理不肯定狀況,因此while循環是在最後一輛結束後再10次爬取後中止爬取
j = 10
while j > 0:
try:
#遍歷獲取每一輛車的id和username
id = self.info(x)[i].get_attribute('id')
username = self.info(x)[i].get_attribute('username')
print('id獲取成功')
break
except:
print('繼續獲取id')
j -= 1
if j == 0:
break
#傳入url車輛id和username構建url地址獲取每輛車信息
self.driver.get('http://mapoo.10010care.com/user/playback.shtml? v=20190401.1357&lang=cn&mds=&requestSource=web&custid=233257382459121121&loginUrl=http://www1.gpsoo1.net/&logout=http://www1.gpsoo1.net/?ip&psip=in1.gpsoo1.net/&custname=' + username + '&random=232423452784459&objectid=' + id)
time.sleep(1)
self.download_data()
print(username + '已下載成功')
time.sleep(1)
#這裏有三類因此分三種爬取
#爬取默認組的
def onLine(self, l1):
#l1 = [a, b, c]三個參數是三種狀況
for i in l1:
print('開始爬取正在使用的'+i+'車輛')
self.get_id_username(i)
print('爬取完畢')
#退出
def close_web(self):
self.driver.quit()
#主函數
def main(self):
self.login_web()
self.onLine(l1)
self.close_web()
if __name__ == '__main__':
c = Car_Lines()
c.main()
#能夠發現已經下載成功間隔爲7天的車輛信息