selenuim自動化爬取汽車在線谷米愛車網車輛GPS數據爬蟲
#為了實時獲取車輛信息,以及為了後面進行行使軌跡繪圖,寫了一個基於selelnium的爬蟲爬取了車輛gps數據。
#在這裏發現selenium可以很好的實現網頁解析和處理js處理
#導包
import time
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
#以下兩個包是為了設置顯示等待(從網上復制的)
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_id(‘txtUserName‘).send_keys(‘***‘)
self.driver.find_element_by_id(‘txtPwd‘).send_keys(‘***‘)
self.driver.find_element_by_class_name(‘login_btn‘).click()
break
except:
print(‘未登錄成功,繼續登錄‘)
# 點擊 下載軌跡
def download_data(self):
self.driver.find_element_by_xpath("//div[@id=‘dl-gps-data‘]/span").click()
self.clear_js()
#清楚原始輸入框的信息
self.driver.find_element_by_id(‘dl-from‘).clear()
#此處傳入下載起始時間
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()
#車輛信息
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天的車輛信息
selenuim自動化爬取汽車在線谷米愛車網車輛GPS數據爬蟲