• 长安铃木经销商爬取(解析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
  • 相关阅读:
    Java内存模型
    如何使用原生的Ribbon
    家穷应该读大学吗?| 寒门学子的奋斗史(一)
    试用期没过,因在公司上了1024网站。。。
    两个"�"="锟斤拷"?
    Java字符类Character字符串类String和StringBuffer
    Python抽象基类的定义与使用
    Java数字类Number和Math
    ESP8266 NodeMCU手把手入门(实操篇)——读取传感器的值
    不下软件,照样可以完美正确格式化树莓派SD卡!(恢复U盘/SD卡到满容量)
  • 原文地址:https://www.cnblogs.com/victroy/p/3440345.html
Copyright © 2020-2023  润新知