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_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天的車輛信息

轉載于:https://www.cnblogs.com/wenzb/p/10709288.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/277939.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/277939.shtml
英文地址,請注明出處:http://en.pswp.cn/news/277939.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Teams Bot開發系列:Activity處理流程

上篇文章介紹了什么是Activity,Turn,TurnContext和BotAdapter,這篇文章我們看看這些東西是如何竄起來的,他們是如何處理用戶發給bot的消息的。 我們以一個最簡單的bot,echo bot為例子,所謂的echo bot就是用…

寫單元測試的好處(轉)

許多開發者都有個習慣,常常不樂意去寫個簡單的單元測試程序來驗證自己的代碼。對自己的程序一直非常有自信,或存在僥幸心理每次運行通過后就直接扔給測試組測試了。然而每次測試組的BUG提交過來后就會發現自己的程序還存在許多沒有想到的漏洞。但是每次修…

linux下搭建go環境--問題記錄

記錄自己在linux上搭建go環境的經歷。(因為各種版本,linux系統問題掙扎了幾天) 安裝vmware-tools,把我要運行代碼拷進來。這個網上方法很多,我的電腦抽風不能安裝,后面重裝的虛擬機確定Ubuntu版本、位數。很重要&#…

Teams Bot開發系列:Teams的Activity處理

上一篇文章講了activity處理的流程,我們bot的核心處理邏輯放在ActivityHandler的子類里,通過重載OnMessageActivityAsync()方法來實現。 這篇文章我來講一下對于Teams的bot來說,整個處理的邏輯會有哪些不同點。 通過之前的文章,…

取球博弈

兩個人玩取球的游戲。一共有N個球,每人輪流取球,每次可取集合{n1,n2,n3}中的任何一個數目。 如果無法繼續取球,則游戲結束。 此時,持有奇數個球的一方獲勝。 如果兩人都是奇數,則為平局。 假設雙方都采用最聰明的取法…

MySQL修改字符集

MySQL數據庫修改字符集,介紹一下修改的方法 1)系統工具iconv #file filename #mysqldump --default-character-setutf8 >20180523xxx.sql #file 20180523xxx.sql #iconv -t utf8mb4 -c 20180523xxx.sql>20180523xxxutf8mb4.sql #file 20180523xxxutf8mb4.sql…

Teams Bot開發系列:Bot驗證

我們今天來說一下authentication,authentication一直是一個復雜的問題。bot里的authentication也不簡單。我們先來看一個概念:Bot Framework Token Service,根據官方定義,這個token service主要是: Facilitating the u…

堆排序

目錄 一、定義二、算法分析三、代碼地址一、定義 1.1 堆 ? 此處的堆,指數據結構中的堆。而不是內存中的那種內存堆,內存堆是基于數據結構的一種實現。堆的數據結構是一棵完全二叉樹,它有如下特點:(具體參考下文鏈接&a…

Teams Bot開發系列:Middleware

middleware是目前一些framework比較流行的概念,通常一個開發框架需要提供一些可擴展可定制化的功能。所以middleware這種pattern就很實用。 熟悉asp.net core的開發可能第一個想到的就是asp.net core的middleware,如下圖: 當一個http reques…

如何獲取租戶中所有的Team

大家在使用Graph API開發Teams App的時候,有時候會需要獲取某個租戶Tenant的所有team,在寫這篇文章的時候Graph API并沒有提供這么一個功能,沒有一個類似于”GET /teams”的api。 在Micorsoft Graph官方文檔的已知問題中,也提到了…

mysql常用快速查詢修改操作

mysql常用快速查詢修改操作 一、查找并修改非innodb引擎為innodb引擎 # 通用操作 mysql> select concat(alter table ,table_schema,.,table_name, engineinnodb;) from information_schema.tables where table_schema not in (information_schema,mysql,performance_schem…

ElasticSearch教程——自定義分詞器(轉學習使用)

一、分詞器 Elasticsearch中,內置了很多分詞器(analyzers),例如standard(標準分詞器)、english(英文分詞)和chinese(中文分詞),默認是standard. s…

使用Azure Serverless來開發Teams App

Azure Function可以說比較早期的一個serverless服務,隨著這些年云服務的大行其道,Serverless在概念越來越火,什么叫serverless? Serverless computing (or serverless for short), is an execution model where the cloud provide…

Angular之RouterModule的forRoot與forChild

Angular 提供了一種方式來把服務提供商從模塊中分離出來,以便模塊既可以帶著 providers 被根模塊導入,也可以不帶 providers 被子模塊導入。 區別: forRoot creates a module that contains all the directives, the given routes, and the r…

關于 someone could be eavesdropping on you right now (man-in-the-middle attack) ssh的解決辦法

關于 someone could be eavesdropping on you right now (man-in-the-middle attack) ssh的解決辦法 記錄工作中遇到的問題 someone could be eavesdropping on you right now (man-in-the-middle attack) ssh  由于遠程機器或者重組或者更新了ssh server導致本地記錄的驗證信…

使用AzureFunction開發最簡單的Teams Outgoing Webhook

上篇文章講了teams app的serverless架構,這篇主要講如何真正使用Azure Function來開發一個最最簡單的Teams Outgoing Webhook。 我們先登入azure的portal,創建一個azure function。我這里創建了一個名字叫outgoing-webhook的azure function。完成后如下…

Java 基礎 之 標識符

www.verejava.com/?id1699254… /* 標識符的命名規則: 1. 是以字母,數字,下滑線_和美元符號$ 組成 2. 不能以數字開頭 3. 區分大小寫 4. 不能是java的保留關鍵字 5. 最好是見名思意 */ public class Identifier {public static void main(String[] args…

Ubuntu宿主機與VMware中其他系統虛擬機的互通

Ubuntu做宿主機,VMware中創建Windows10,并且通過三種模式實現兩系統互通,其實并非是件難事。在有線網卡未接網線的環境下,關閉兩系統防火墻,基本遵從下文便可實現。 轉載:https://note.youdao.com/ynotesha…

使用Azure輕松實現Teams App的全球合規性

我在之前的一篇博客里面講了合規性對于我們Teams app是非常重要的,因為office365平臺就是面向全世界用戶的,我們開發的teams app一旦發布后,立刻就會有各國各地區的用戶來進行安裝使用,所以符合用戶所在地區的要求是非常重要的。 …

【php復習之】php創建數組的幾種方式

1、array()函數 1.1無key值 $arrarray(1,2,3,4); 1.2鍵值對 $arrarray( name>myj,age>18,phone>1888888888);1.3空數組 $arrarray(); 2、compact()函數 compact函數可以把變量轉換為數組。 $a aaa;$b bbb;$c ccc;$arr3 compact(a,b,c);輸出:{"a&q…