python随机生成车牌_使用Python自动化获取全国每个城市的车牌代码
最近有這樣一需求,需要獲取12123交管查詢網站上的全國每個城市對應的城市id和車牌代碼。最初的想法是直接用Python寫個爬蟲,遍歷每個城市,然后用Xpath提取DOM節點數據就好了。然而在實際操作中發現城市id的DOM節點如果用簡單的獲取網頁數據的爬蟲是取不到id值的,這個城市id值必須用瀏覽器打開的方式去訪問,然后網站的js腳本再動態的將城市id插入DOM節點。于是乎想到了用自動化測試工具來做,使用selenium庫來操作webdriver,驅動Chrome瀏覽器進行自動化操作。
由于這個網站有一點特殊,并沒有在同一個頁面中有全部城市的id和車牌代碼,每個城市都是一個單獨的二級域名鏈接。并且城市id使用js動態加載,所以這里就用蠢一點的方法,自動獲取到每個城市的鏈接,然后用瀏覽器自動化模式去逐個訪問再Xpath提取出內容。
當然,這里的重復勞動力交給計算機就好,我們只需要把程序寫好。
使用Chrome瀏覽器打開12123的城市列表選擇頁面 http://m.12123.com/city.html
右鍵,審查元素,發現所有的城市都在ul 的 li標簽下。
只需要把li的元素Xpath拷貝出來,提取到城市列表后遍歷每個列表的鏈接,再用瀏覽器自動化去訪問每個城市的鏈接,最后用相同的方法提取出數據即可。
拷貝出來的Xpath如下
1/html/body/div[2]/div[3]/ul/li
用Xpath的方式有個好處就是不需要寫復雜的正則表達式就可以快速提取到DOM元素的數據。
我要實現的功能:
自動獲取全國所有的城市對應的id和車牌代碼
將獲取到的數據寫入到文件,輸出為SQL的insert語句
全部代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62"""
12123.com 交管查詢助手
獲取所有的 城市名稱+城市車牌代碼+城市id
生成SQL insert語句
create by 藍士欽 2018-06-10
"""
import requests
from lxml import etree
from selenium import webdriver
import datetime
# 12123.com 交管查詢網站移動版網址
HOST_URL = 'http://m.12123.com'
def get_city_info(file_name):
# 請求城市列表頁面,并用xpath提取所有的城市列表集合
html = requests.get(HOST_URL + '/city.html')
select = etree.HTML(html.text)
content = select.xpath('/html/body/div[2]/div[3]/ul/li')
# 打開指定文件,準備將請求到的數據寫入到文件中
file = open(file_name, 'w')
# 遍歷所有的城市列表集合
for index, value in enumerate(content):
# 提取當前城市列表中的a標簽的城市鏈接
item = value.xpath('/html/body/div[2]/div[3]/ul/li[' + str(index) + ']/a/@href')
for city_path in item:
city_url = HOST_URL + city_path
print('當前城市鏈接:' + city_url)
try:
# 打開Chrome瀏覽器,自動化訪問城市鏈接
browser = webdriver.Chrome()
browser.get(url=city_url)
# 提取城市名稱、城市車牌代碼、城市id
city_name = browser.find_element_by_xpath('/html/body/div[4]/div[1]/a/span').text
car_num_pre = browser.find_element_by_xpath('//*[@id="txtAbbr"]').text + browser.find_element_by_xpath(
'//*[@id="txtInitial"]').text
city_id = browser.find_element_by_xpath('//*[@id="cityId"]').get_attribute('value')
print('城市名稱:' + city_name + ' 車牌代碼:' + car_num_pre + ' 城市id:' + city_id)
# 寫入文件
file.writelines("insert into city_info ('city_name','car_num_pre','city_id') "
+ "values ('" + city_name + "','" + car_num_pre + "','" + city_id + "');\n")
# 刷新緩沖區,將緩沖區數據寫入文件,防止緩沖區有大量待寫入數據時突然斷電造成數據丟失
file.flush()
# 關閉瀏覽器
browser.close()
except:
print('獲取城市信息時發生異常')
continue
# 關閉文件流
file.close()
if __name__ == '__main__':
start_time = datetime.datetime.now()
# 獲取城市名稱、車牌代碼、城市id,并寫入指定的sql文件中
get_city_info("city_info.sql")
end_time = datetime.datetime.now()
print('總用時:' + str((end_time - start_time).seconds) + '秒')
點擊運行之后就可以放心的出去玩了😋
控制臺這邊對每個鏈接的訪問情況做了輸出,如果有異常(網絡超時)可以等全部結束后單獨把異常的城市再跑一邊即可。
最后輸出的SQL文件如下圖:
注: 使用WebDriver前,需要將對應平臺的webdriver驅動復制到系統環境變量中。
總結
以上是生活随笔為你收集整理的python随机生成车牌_使用Python自动化获取全国每个城市的车牌代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 模拟浏览器登录获取cook
- 下一篇: shell 登录mysql 然后quit