长安铃木经销商爬取(解析xml、post提交、python中使用js代码)
1、通过火狐浏览器,查找大长安铃木官网中关于经销商的信息主要在两个网页中
http://www.changansuzuki.com/khfw/xml/pro.xml 地域信息
http://www.changansuzuki.com/khfw/sqcx.php 查询经销商具体信息
2、第一步解析地域信息
上面的图为xml中的格式
3、解析XML文件主要代码
1 def get_area_list(self): 2 """获取地域省份和城市名称字典""" 3 page = urllib2.urlopen(self.xml_url).read() 4 area_list = {} 5 root = ElementTree.fromstring(page) 6 #读取xml格式文本 7 for onep in root: 8 province = onep.get('name') 9 #父标签中的name数据(province中) 10 city_list = [] 11 for onec in onep: 12 #子标签中的name数据(city中) 13 city = onec.get('name') 14 city_list.append(city) 15 area_list[province] = city_list 16 #返回一个省份与城市关系的字典,即:{省份名称:[城市名称1,城市名称2,···]} 17 return area_list
3、得到每个城市经销商信息主要代码
1 def get_post_data(self,province=None,city=None): 2 '''得到每个城市经销商信息''' 3 city1 = city.encode('utf8') 4 #将数据转码为utf8 5 province1 = province.encode('utf8') 6 ctxt = PyV8.JSContext() 7 ctxt.enter() 8 #使用python执行js代码的准备 9 func = ctxt.eval('''(function(){return (new Date())})''') 10 #通过代码得到js格式的时间 11 params = { 'act':'3', 12 'city':city1, 13 'date':func(), 14 'name':'', 15 'pro':province1, 16 'ty':'2', 17 } 18 #整理post数据 19 data = urllib.urlencode(params) 20 req = urllib2.Request(self.index_url,data) 21 page =urllib2.urlopen(req).read().decode('utf8') 22 #通过提交post数据得到相应的结果数据 23 if page != 'sorry': 24 #判断结果是否符合需求 25 dealers = page.split('@@') 26 i = 0 27 dealerlist =[] 28 while i < len(dealers): 29 dealerinfo = {} 30 j = 0 31 dealer = dealers[i].split('|') 32 dealerinfo[Constant.PROVINCE] = province 33 dealerinfo[Constant.CITY] = city 34 dealerinfo[Constant.NAME] = dealer[0] 35 dealerinfo[Constant.ADDRESS] = dealer[1] 36 dealerinfo[Constant.SALETEL] = dealer[2] 37 if len(dealer) ==6: 38 dealerinfo[Constant.URL] = dealer[3] 39 elif len(dealer) == 5: 40 dealerinfo[Constant.URL] = '' 41 else: 42 print '###############' 43 print dealer[0] +' ' +province 44 print '###############' 45 dealerlist.append(dealerinfo) 46 i+=1 47 self.saver.add(dealerlist)
4、最终整合方法实现功能
1 def deal_dealers_info(self): 2 areas = self.get_area_list() 3 for area in areas: 4 province = area 5 #得到省份名称 6 for area_city in areas[area]: 7 city = area_city 8 #得到城市名称 9 self.get_post_data(province,city) 10 #调用经销商处理方法 11 self.saver.commit() 12 #保存excel