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) + '秒')
点击运行之后就可以放心的出去玩了
python随机生成车牌_使用Python自动化获取全国每个城市的车牌代码相关推荐
- python随机生成红包_自制Python随机红包
1.部署Python 首先从Python.org下载Python3.9,然后安装就行了 Win10建议在安装一下UWP版的哈,因为命令行里要下载命令行专用的 安装步骤:Windows徽标键+R 打开运 ...
- 用python随机生成数字_如何实现python随机生成数字?
今天小编就生成随机数,整理了多个方式,方便大家在项目时,根据自己的需求,直接拿来套用即可,以下内容相当详细,具体来看看吧~ 说明:python中生成随机数主要用到random模块,方法主要包括:ran ...
- python随机生成字符串_如何随机生成大写字母和数字组成的字符串
需求 随机生成定长的大写字母和数字组合. 实现#!/usr/bin/env python # -*- coding:utf-8 -*- import random def getRandomSet(b ...
- python turtle随机生成图形_用 Python Turtle 模块做小游戏 (1) - 随机移动,万花筒和点图...
最近接触到 Python的一个绘图模块 Turtle,学习以后,发现这是一个很有趣的模块.我们可以利用这个模块进行画图,甚至做一些怀旧的小游戏.这个模块的文档链接如下. 简单的说,可以把画板想象成一个 ...
- python随机生成正态分布_随机生成正态分布数据
http://www.petroleumcloud.cn/pages/620.html 正态分布,又名高斯分布,是一个非常重要的概率分布.在数学.物理及工程等领域以及统计学的许多方面有着重大的影响力. ...
- python随机生成正态分布_正态分布数据随机生成工具
http://www.petroleumcloud.cn/pages/620.html 正态分布,又名高斯分布,是一个非常重要的概率分布.在数学.物理及工程等领域以及统计学的许多方面有着重大的影响力. ...
- python随机生成正态分布_正态分布数据随机生成
http://www.petroleumcloud.cn/pages/620.html 正态分布,又名高斯分布,是一个非常重要的概率分布.在数学.物理及工程等领域以及统计学的许多方面有着重大的影响力. ...
- python随机抽号_使用python的random编写抽奖程序
python代码的random模块,常用函数是random.random,random.randint,random.randrange,random.choice,random.shuffle. ① ...
- python批量生成图_利用Python批量生成任意尺寸的图片
实现效果 通过源图片,在当前工作目录的/img目录下生成1000张,分别从1*1到1000*1000像素的图片. 效果如下: 目录结构 实现示例 # -*- coding: utf-8 -*- imp ...
最新文章
- LeetCode 674. Longest Continuous Increasing Subsequence--python,Java,C++解法
- cp复制文件和目录的使用举例
- HTML的checkbox和radio的美化
- redis(12)--事件,客户端,服务器
- C语言高级编程:二级指针的赋值
- JAVA的方法的定义和调用
- php重度写如何优化,win10玩游戏掉帧严重怎么处理
- 运算除法的计算机函数,2、Python基础--除法、常用数学函数(示例代码)
- [hashmap|空间换时间] leetcode 1 两数之和
- css两列等高,实现一个两列等高布局,讲讲思路
- zookeeper保证单一视图
- 如何保护前端JS代码?前端js代码混淆加密
- 自己仿的一个网页,比较适合小白入门
- 云技术:弹性计算ECS
- 点击换图 秀米的svg_时隔五年再用秀米,我发现了这个超强玩法。
- 头脑极度开放:前额皮层大战杏仁核
- Unbuntu22.04安装教程以及Unbuntu下C++环境的配置
- 滚动交互引导界面的Ouroboros
- MSE、RMSE、MAE、R方等指标整理
- 持久续航蓝牙耳机推荐,即使音质再好电量不足又有什么用?
热门文章
- 36条网络安全术语盘点——Vecloud
- QString和string类型相互转换
- Linux(二)各种实用命令
- 2014年百度之星程序设计大赛 - 资格赛 1004 Labyrinth(Dp)
- B1230 [Usaco2008 Nov]lites 开关灯 线段树
- 安装go语言开发环境
- osm2pgsql windows “illegal option -W” error
- xcode4自定义文件模板(Creating Custom Xcode 4 File Templates)
- 多维数组(C# 编程指南)
- 用XMLHTTP获取动态页生成的HTML内容