1. 程式人生 > >selenuim自動化爬取汽車在線谷米愛車網車輛GPS數據爬蟲

selenuim自動化爬取汽車在線谷米愛車網車輛GPS數據爬蟲

con objectid 正在 attr pla locate return url common

#為了實時獲取車輛信息,以及為了後面進行行使軌跡繪圖,寫了一個基於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_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(‘未登錄成功,繼續登錄‘)


# 點擊 下載軌跡
  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數據爬蟲