长安铃木经销商爬取(解析xml、post提交、python中使用js代码)

时间:2023-03-09 08:24:52
长安铃木经销商爬取(解析xml、post提交、python中使用js代码)

1、通过火狐浏览器,查找大长安铃木官网中关于经销商的信息主要在两个网页中

http://www.changansuzuki.com/khfw/xml/pro.xml  地域信息

http://www.changansuzuki.com/khfw/sqcx.php  查询经销商具体信息

2、第一步解析地域信息

长安铃木经销商爬取(解析xml、post提交、python中使用js代码)

上面的图为xml中的格式

3、解析XML文件主要代码

     def get_area_list(self):
"""获取地域省份和城市名称字典"""
page = urllib2.urlopen(self.xml_url).read()
area_list = {}
root = ElementTree.fromstring(page)
#读取xml格式文本
for onep in root:
province = onep.get('name')
#父标签中的name数据(province中)
city_list = []
for onec in onep:
#子标签中的name数据(city中)
city = onec.get('name')
city_list.append(city)
area_list[province] = city_list
#返回一个省份与城市关系的字典,即:{省份名称:[城市名称1,城市名称2,···]}
return area_list

3、得到每个城市经销商信息主要代码

  def get_post_data(self,province=None,city=None):
'''得到每个城市经销商信息'''
city1 = city.encode('utf8')
#将数据转码为utf8
province1 = province.encode('utf8')
ctxt = PyV8.JSContext()
ctxt.enter()
#使用python执行js代码的准备
func = ctxt.eval('''(function(){return (new Date())})''')
#通过代码得到js格式的时间
params = { 'act':'',
'city':city1,
'date':func(),
'name':'',
'pro':province1,
'ty':'',
}
#整理post数据
data = urllib.urlencode(params)
req = urllib2.Request(self.index_url,data)
page =urllib2.urlopen(req).read().decode('utf8')
#通过提交post数据得到相应的结果数据
if page != 'sorry':
#判断结果是否符合需求
dealers = page.split('@@')
i = 0
dealerlist =[]
while i < len(dealers):
dealerinfo = {}
j = 0
dealer = dealers[i].split('|')
dealerinfo[Constant.PROVINCE] = province
dealerinfo[Constant.CITY] = city
dealerinfo[Constant.NAME] = dealer[0]
dealerinfo[Constant.ADDRESS] = dealer[1]
dealerinfo[Constant.SALETEL] = dealer[2]
if len(dealer) ==6:
dealerinfo[Constant.URL] = dealer[3]
elif len(dealer) == 5:
dealerinfo[Constant.URL] = ''
else:
print '###############'
print dealer[0] +' ' +province
print '###############'
dealerlist.append(dealerinfo)
i+=1
self.saver.add(dealerlist)

4、最终整合方法实现功能

     def deal_dealers_info(self):
areas = self.get_area_list()
for area in areas:
province = area
#得到省份名称
for area_city in areas[area]:
city = area_city
#得到城市名称
self.get_post_data(province,city)
#调用经销商处理方法
self.saver.commit()
#保存excel