长安铃木经销商爬取(解析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
原文地址:https://www.cnblogs.com/victroy/p/3440345.html