最近无人车项目需要用到交通管理局的实时路况信息,导师要求将实时路况信息爬下来。
我的想法是,因为路况信息是实时更新的,有最新的路况他们会更新,因此需要让程序隔一段时间运行一次,检查这次爬下的内容与上一次是否一致,不一致的话存到txt文件中。因此整的步骤就是首先将网站内容爬下来,然后将需要的内容用正则表达式匹配,然后将爬下的内容和上一次爬虫的最新数据对比,将新的路况信息保存到txt文件中,最后设置间隔,每隔2分钟爬一次(因为中部信息2分钟刷新一次,观察一段时间路况信息刷新还是挺慢的,因此选2分钟,肯定不会漏)
1、查看上面网址的的结构
通过审查元素,可以看出我们需要爬的其实是一个iframe里面的内容,这样更减轻了我们处理文本的负担,直接爬src对应的网址即可
我们将src后面的网址在浏览器中输入,得到的内容:
这个内容即是我们需要的。
2、爬网址内容
关于的爬虫的文章一大堆,接下来只要一步一步做就行,下面说下主要步骤。(特别推荐一个大神的Python爬虫blog,写的确实不错,花了不少功夫,链接http://blog.csdn.net/column/details/why-bug.html)
匹配问题
从网址的源代码能看出,每一个路况的标签内容都是一样的
因此匹配直接这样写就行,在myItems中将获取到两个内容,一个是第几条,一个是第几条的详细内容
myItems=re.findall('(.*?)',myPage,re.S)
3、检查重复
这里的想法是,每次爬的时候保存最新的一条,下一次的爬虫的内容与保存的对比,将不一致的路况信息保存到txt下面
4、定时
比较简单,直接用while语句一直让它为真,在执行完一次爬虫后sleep 2分钟
问题还是挺简单的,没有分页,也没有特殊的处理。下面是全部代码
# -*- coding:utf-8 -*-
#---------------------------------------
# 程序:爬交通网站右侧实时数据
# 作者:xiaoxiao
# 日期:2014-07-19
# 语言:Python 2.7.5
#----------------------------------------
import urllib2
import urllib
import re
import time
from time import sleep
item_newest=''
def web_spider():
global item_newest
#将网址对应内容爬出
myUrl="http://sslk.bjjtgl.gov.cn/roadpublish/Map/vmsimg/vmsimage/secondrealinfo.htm?d=0.4833169437479228"
user_agent='Mozilla/4.0 (compatible; MSIE 5.5;Windows NT)'
headers={'User-Agent' : user_agent }
req=urllib2.Request(myUrl, headers = headers)
myResponse = urllib2.urlopen(req)
myPage = myResponse.read()
#将对爬下的数据进行匹配,只是抠出想要标签的内容
myItems=re.findall('(.*?)',myPage,re.S)
data=open("traffic_information_data.txt",'a');
for item in myItems:
if item[1]!=item_newest:
data.write(item[1]+'\n')
#保存最新的一条,用于检查下一次爬虫是否重复
data.close()
item_newest=myItems[0][1]
while(1):
try:
web_spider()
sleep(120)#每隔两分钟运行一次
except(KeyboardInterrupt):
print('error')
print time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time()))
break