最近有这样一需求,需要获取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自动化获取全国每个城市的车牌代码相关推荐

  1. python随机生成红包_自制Python随机红包

    1.部署Python 首先从Python.org下载Python3.9,然后安装就行了 Win10建议在安装一下UWP版的哈,因为命令行里要下载命令行专用的 安装步骤:Windows徽标键+R 打开运 ...

  2. 用python随机生成数字_如何实现python随机生成数字?

    今天小编就生成随机数,整理了多个方式,方便大家在项目时,根据自己的需求,直接拿来套用即可,以下内容相当详细,具体来看看吧~ 说明:python中生成随机数主要用到random模块,方法主要包括:ran ...

  3. python随机生成字符串_如何随机生成大写字母和数字组成的字符串

    需求 随机生成定长的大写字母和数字组合. 实现#!/usr/bin/env python # -*- coding:utf-8 -*- import random def getRandomSet(b ...

  4. python turtle随机生成图形_用 Python Turtle 模块做小游戏 (1) - 随机移动,万花筒和点图...

    最近接触到 Python的一个绘图模块 Turtle,学习以后,发现这是一个很有趣的模块.我们可以利用这个模块进行画图,甚至做一些怀旧的小游戏.这个模块的文档链接如下. 简单的说,可以把画板想象成一个 ...

  5. python随机生成正态分布_随机生成正态分布数据

    http://www.petroleumcloud.cn/pages/620.html 正态分布,又名高斯分布,是一个非常重要的概率分布.在数学.物理及工程等领域以及统计学的许多方面有着重大的影响力. ...

  6. python随机生成正态分布_正态分布数据随机生成工具

    http://www.petroleumcloud.cn/pages/620.html 正态分布,又名高斯分布,是一个非常重要的概率分布.在数学.物理及工程等领域以及统计学的许多方面有着重大的影响力. ...

  7. python随机生成正态分布_正态分布数据随机生成

    http://www.petroleumcloud.cn/pages/620.html 正态分布,又名高斯分布,是一个非常重要的概率分布.在数学.物理及工程等领域以及统计学的许多方面有着重大的影响力. ...

  8. python随机抽号_使用python的random编写抽奖程序

    python代码的random模块,常用函数是random.random,random.randint,random.randrange,random.choice,random.shuffle. ① ...

  9. python批量生成图_利用Python批量生成任意尺寸的图片

    实现效果 通过源图片,在当前工作目录的/img目录下生成1000张,分别从1*1到1000*1000像素的图片. 效果如下: 目录结构 实现示例 # -*- coding: utf-8 -*- imp ...

最新文章

  1. LeetCode 674. Longest Continuous Increasing Subsequence--python,Java,C++解法
  2. cp复制文件和目录的使用举例
  3. HTML的checkbox和radio的美化
  4. redis(12)--事件,客户端,服务器
  5. C语言高级编程:二级指针的赋值
  6. JAVA的方法的定义和调用
  7. php重度写如何优化,win10玩游戏掉帧严重怎么处理
  8. 运算除法的计算机函数,2、Python基础--除法、常用数学函数(示例代码)
  9. [hashmap|空间换时间] leetcode 1 两数之和
  10. css两列等高,实现一个两列等高布局,讲讲思路
  11. zookeeper保证单一视图
  12. 如何保护前端JS代码?前端js代码混淆加密
  13. 自己仿的一个网页,比较适合小白入门
  14. 云技术:弹性计算ECS
  15. 点击换图 秀米的svg_时隔五年再用秀米,我发现了这个超强玩法。
  16. 头脑极度开放:前额皮层大战杏仁核
  17. Unbuntu22.04安装教程以及Unbuntu下C++环境的配置
  18. 滚动交互引导界面的Ouroboros
  19. MSE、RMSE、MAE、R方等指标整理
  20. 持久续航蓝牙耳机推荐,即使音质再好电量不足又有什么用?

热门文章

  1. 36条网络安全术语盘点——Vecloud
  2. QString和string类型相互转换
  3. Linux(二)各种实用命令
  4. 2014年百度之星程序设计大赛 - 资格赛 1004 Labyrinth(Dp)
  5. B1230 [Usaco2008 Nov]lites 开关灯 线段树
  6. 安装go语言开发环境
  7. osm2pgsql windows “illegal option -W” error
  8. xcode4自定义文件模板(Creating Custom Xcode 4 File Templates)
  9. 多维数组(C# 编程指南)
  10. 用XMLHTTP获取动态页生成的HTML内容