手把手教你使用python写提取快捷酒店房间信息的采集程序

自从过完年之后没有发过什么文章了,一直在写一个快捷酒店房间采集程序,现在已经做完了七天连锁的和如家的房间信息采集,现在会陆续将代码贴上来

我的python工程的目录如下图所示:

手把手教你使用python写提取快捷酒店房间信息的采集程序_第1张图片

程序是使用python2.7+mongod+threadpool完成的,所以你还需要一个mongodb数据库和下载一个threadpool线程池库

一,我们首先在resources目录下放入两个个xml文件,第一个文件为homeinns.xml,这是初始化如家酒店的相关城市的信息



beijing北京
shanghai上海
hangzhou杭州
xian西安
tianjin天津
qingdao青岛
shenyang沈阳
wuhan武汉
guangzhou广州
nanjing南京
jinan济南
shijiazhuang石家庄
dalian大连
xiamen厦门
chengdu成都
suzhou苏州
haerbin哈尔滨
shenzhen深圳
wulumuqi乌鲁木齐
wuxi无锡
ningbo宁波
taiyuan太原
lanzhou兰州
chongqing重庆
hefei合肥
zhengzhou郑州
nanchang南昌
changchun长春
changzhou常州
huhehaote呼和浩特
sanya三亚
kunming昆明
lianyungang连云港
nantong南通
xuzhou徐州
fuzhou福州
linyi临沂
yangzhou扬州
yantai烟台
taian泰安
changsha长沙
weihai威海
guiyang贵阳
haikou海口
taizhou泰州
zhenjiang镇江
shantou汕头
foshan佛山
suqian宿迁
handan邯郸
langfang廊坊
nanning南宁
shunde顺德
huaian淮安
wuhu芜湖
rizhao日照
weifang潍坊
zibo淄博
tangshan唐山
baoding保定
jilin吉林
xining西宁
kunshan昆山
jiangyin江阴
liaocheng聊城
dezhou德州
heze菏泽
baotou包头
qiqihaer齐齐哈尔
guilin桂林
yinchuan银川
huizhou惠州
zhuhai珠海
dongguan东莞
yancheng盐城
changshu常熟
cixiningbo慈溪(宁波)
shaoxing绍兴
zoucheng邹城
jining济宁
dongying东营
binzhou滨州
shiyan十堰
yichang宜昌
qinhuangdao秦皇岛
datong大同
changzhi长治
yuncheng运城
dandong丹东
zhongshan中山
liyang溧阳
zhangjiagang张家港
yixing宜兴
jiaxing嘉兴
bengbu蚌埠
zhangzhou漳州
jiujiang九江
jingdezheng景德镇
zaozhuang枣庄
kaifeng开封
luoyang洛阳
cangzhou沧州
fushun抚顺
liuzhou柳州
xianyang咸阳
baoji宝鸡
pingliang平凉
jiuquan酒泉
puning普宁
maomin茂名
shaoguan韶关
zhaoqing肇庆
haian海安
rugaonantong如皋(南通)
jingjiang靖江
haimeng海门
taicang太仓
huzhou湖州
haining海宁
yuyao余姚
zhuji诸暨
yiwu义乌
jinhua金华
chuzhou滁州
huainan淮南
huaibei淮北
tongling铜陵
anqing安庆
huangshan黄山
maanshan马鞍山
quanzhou泉州
linzizibo临淄(淄博)
zhaoyuanyantai招远(烟台)
longkouyantai龙口(烟台)
haiyangyantai海阳(烟台)
shouguangweifang寿光(潍坊)
qufu曲阜
penglaiyantai蓬莱(烟台)
tengzhou滕州
laiwu莱芜
laiyangyantai莱阳(烟台)
xuchang许昌
nanyang南阳
xinxiang新乡
xiangyang襄阳
hengyang衡阳
zhangjiakou张家口
hengshui衡水
xingtai邢台
yangquan阳泉
jinzhong晋中
jincheng晋城
linfen临汾
xinzhou忻州
chifeng赤峰
bayuquanyingkou鲅鱼圈(营口)
liaoyang辽阳
chaoyang朝阳
panjin盘锦
huludao葫芦岛
jinzhou锦州
anshan鞍山
baishan白山
mudanjiang牡丹江
jiamusi佳木斯
suihua绥化
daqing大庆
beihai北海
dujiangyan(chengdu)都江堰(成都)
luzhou泸州
leshan乐山
zunyi遵义
xishuangbanna西双版纳
lijiang丽江
lasa拉萨
jingbianyulin靖边(榆林)
hanzhong汉中
zhangye张掖
jiayuguan嘉峪关
wuwei武威
changji昌吉
wanzhouchongqing万州(重庆)
jieyang揭阳
jiangmen江门
meizhou梅州
zhanjiang湛江
heyuan河源
yunfu云浮
chaozhou潮州
jurong(zhenjiang)句容(镇江)
rudong如东
yizheng仪征
dongtai东台
jianhu建湖
sheyang射阳
dafeng(yancheng)大丰(盐城)
pizhou邳州
jintan金坛
qidong启东
linan临安
tongluhangzhou桐庐(杭州)
fuyanghangzhou富阳(杭州)
tiantai(taizhou)天台(台州)
zhoushan舟山
suzhou宿州
bozhou亳州
ningde宁德
putian莆田
longyan龙岩
wuyishan武夷山
shishi石狮
shangrao上饶
fuzhou抚州
ganzhou赣州
xinyu新余
pingxiang萍乡
zhangqiujinan章丘(济南)
yiyuanzibo沂源(淄博)
boshanzibo博山(淄博)
zhoucunzibo周村(淄博)
zichuanzibo淄川(淄博)
mupingyantai牟平(烟台)
zhuchengweifang诸城(潍坊)
feichengtaian肥城(泰安)
yishuilinyi沂水(临沂)
cangshanlinyi苍山(临沂)
zoupingbinzhou邹平(滨州)
rushanweihai乳山(威海)
wendengweihai文登(威海)
shidaoweihairongcheng石岛(威海荣成)
linqingliaocheng临清(聊城)
yangguliaocheng阳谷(聊城)
rongchengweihai荣成(威海)
shangqiu商丘
anyang安阳
jiaozuo焦作
zhoukou周口
luohe漯河
puyang濮阳
jingzhou荆州
enshi恩施
zhuzhou株洲
xiangtan湘潭
yiyang益阳
zhangjiajie张家界
yueyang岳阳
xinjishijiazhuang辛集(石家庄)
chengde承德
qianan迁安
shuozhou朔州
tongliao通辽
bayannaoer巴彦淖尔
xilinhaote锡林浩特
eerduosi鄂尔多斯
tieling铁岭
benxi本溪
dashiqiaoyingkou大石桥(营口)
fuxin阜新
yingkou营口
siping四平
baicheng白城
songyuan松原
tonghua通化
yanji延吉
suifenhemudanjiang绥芬河(牡丹江)
yichun伊春
hegang鹤岗
fangchenggang防城港
yulin玉林
guiping桂平
meishan(chengdu)眉山(成都)
mianzhu绵竹
panzhihua攀枝花
mianyang绵阳
xichang西昌
deyang德阳
ruili瑞丽
qujing曲靖
zhaotong昭通
kaiyuan开远
tengchongbaoshan腾冲(保山)
yuxi玉溪
puer普洱
yanan延安
yulin榆林
weinan渭南
tongchuan铜川
dingxi定西
qingyang庆阳
jinchang金昌
dunhuangjiayuguan敦煌(嘉峪关)
tianshui天水
zhongwei中卫
guyuan固原
wuzhong吴忠
tulufan吐鲁番
shihezi石河子
fukang阜康
yining伊宁
kashi喀什
lingshui陵水
qionghai琼海

   第二个文件为mongodb-config.xml,内容如下:


    
        localhost
        27017
        3000
        30
        jhnet
    


加入文件完毕之后,我们需要在init包中加入文件province_city.xml,内容如下(这可是哥手动打上去的啊):

   
        
            
                
                

            

        

        
            
                
                

            

        

        
            
                
                

            

        

        
            
                
                

            

        

        
            
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
            

        

        
            
                
                
                
                
                
                
                
                
                
            

        

        
            
                
                
                
                
                
                
                
                
                
                
                
                
            

        

        
            
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
            

        

        
            
                
                
                
                
                
                
            

        

        
        
            
                
                
                
                
                
                
                
                
                
                
                
            

        

        
            
                
                
                
                
                
                
                
                
                
                
                
                
            

        

        
            
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
            

        

        
            
                
                
                
                
                
                
                
                
                
                
                
                
            

        

        
            
                
                
                
                
                
                
                
                
                
                
                
                
                
            

        

        
            
                
                
                
                
                
                
                
                
            

        

        
            
                
                
                
                
                
                
                
                
                
                
                
            

        

        
            
                
                
                
                
                
                
                
                
                
                
                
                
                
            

        

        
            
                
                
                
                
                
                
                
                
                
                
                
                
                
            

        

        
            
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
            

        

        
            
                
                
                
                
                
                
                
                
                
                
            

        

        
            
                
                
                
                
                
                
                
                
                
                
                
            

        

        
            
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
            

        

        
            
                
                
                
                
                
                
                
                
            

        

        
            
                
                
                
                
                
                
                
                
                
                
                
            

        

        
            
                
                
            

        

        
            
                
                
                
                
                
            

        

        
            
                
                
                
                
                
                
                
                
                
                
                
                
                
                
            

        

        
            
                
                
                
                
                
                
                
            

        

        
            
                
                
                
                
                
            

        

        
            
                
            

        

        
            
                
                
            

        

        
            
                
            

        

        
            
                
            

        

    



接着再在init包中创建一个recordPC.py文件,代码如下:

# -*- coding:utf-8 -*-
from xml.dom import minidom
from com.jhnet.spider.db.factory.MongoFactory import MongoFactory
def recordPc():
    xmldoc = minidom.parse("province_city.xml")
    ps = xmldoc.firstChild
    
    p = ps.childNodes
    
    for i in range(0, p.length):
        pp = p.item(i)
        if pp.nodeType == 1:
           pname = pp.attributes['name'].value
           ppinyin = pp.attributes['province_pinyinname'].value
               
           ppCs = pp.childNodes.item(1)
           ppC = ppCs.childNodes
           for j in range(0, ppC.length):
               ppCC = ppC.item(j)
               if ppCC.nodeType == 1:
                   cname = ppCC.attributes['name'].value
                   cpinyin = ppCC.attributes['city_pinyinname'].value
                   MongoFactory.getDBCollection("province_city").insert({'province_name':pname,'province_pinyin':ppinyin,'city_name':cname,'city_pinyin':cpinyin})

由于这个文件是依赖于mongodb的,所以创建完成之后就先不管了。

二,在factory包中创建MongoFactory.py文件,代码如下(因为是数据连接,索引代码就不用加注释了):

# -*- coding: utf-8 -*-
import pymongo

class MongoFactory:
    __conn = None
    __db = None
    
    def __init__(self):
        pass
    def initMongo(self,config):
        mainMongoHost = config['mainMongo_host']
        mainMongodbName=config['mainMongo_dbName']
        mainMongoConnectionsPerHost = int(config['mainMongo_connectionsPerHost'])
        mainMongoConnectTimeout = int(config['mainMongo_connectTimeout'])
        mainMongoPort = int(config['mainMongo_port'])
        
        MongoFactory.conn = pymongo.Connection(mainMongoHost, mainMongoPort,mainMongoConnectionsPerHost,mainMongoConnectTimeout)
        MongoFactory.db = MongoFactory.conn[mainMongodbName]
    
    @staticmethod
    def getConn():
        return MongoFactory.conn
    @staticmethod
    def closeConn():
        MongoFactory.conn.close()
    @staticmethod
    def closeDB():
        MongoFactory.db.close()
    @staticmethod
    def getDBCollection(tableName):
        return MongoFactory.db[tableName]
  三,接下来在entity包中创建一个实体ProvinceCity.py,代码如下:

# -*- coding: utf-8 -*-

class ProvinceCity:
    def __init__(self,cityName, cityPinyin,provinceName,provincePinyin):
        self.cityName = cityName
        self.cityPinyin = cityPinyin
        self.provinceName = provinceName
        self.provincePinyin = provincePinyin
        self.homeinnsCityid = None
    def setCityName(self, cityName):
        self.cityName = cityName
    def getCityName(self):
        return self.cityName
    def setCityPinyin(self,cityPinyin):
        self.cityPinyin = cityPinyin
    def getCityPinyin(self):
        return self.cityPinyin
    def setProvinceName(self,provinceName):
        self.provinceName = provinceName
    def getProvinceName(self):
        return self.provinceName
    def setProvincePinyin(self, provincePinyin):
        self.provincePinyin = provincePinyin
    def getProvincePinyin(self):
        return self.provincePinyin
    def setHomeinnsCityid(self,homeinnsCityid):
        self.homeinnsCityid = homeinnsCityid
        
    def getHomeinnsCityid(self):
        return self.homeinnsCityid


四,在util的__init__.py文件中放入如下代码:

# -*- coding:utf-8 -*-
from datetime import datetime

class Utils:
    
    cityCache = []
    
    """
        增加month
    """
    @staticmethod
    def getLastDate(incr):
        dt = datetime.now()
        y = int(dt.strftime('%Y'))
        m = int(dt.strftime('%m'))
        d = int(dt.strftime('%d'))
        if m + incr > 12:
            y = y + 1
            m = m + incr - 12
        d1 = datetime(y, m, d)
        y = int(d1.strftime('%Y'))
        m = int(d1.strftime('%m'))
        d = int(d1.strftime('%d'))
        tsm = None
        if m < 10:
            tsm = ('0' + str(m))
        else:
            tsm = str(m)     
            
        tsd =None
        if d < 10:
            tsd = ('0' + str(m))
        else:
            tsd = str(d)       
        nd = str(y)+"-"+str(tsm)+"-"+str(tsd)
        return nd
    @staticmethod
    def getDate(incr):
        dt = datetime.now()
        y = int(dt.strftime('%Y'))
        m = int(dt.strftime('%m'))
        d = int(dt.strftime('%d'))
        tsm = None
        if m < 10:
            tsm = ('0' + str(m))
        else:
            tsm = str(m)     
            
        tsd =None
        if d < 10:
            tsd = ('0' + str(d))
        else:
            tsd = str(d)       
        nd = str(y)+"-"+str(tsm)+"-"+str(tsd)
        if m in [1,3,5,7,8,12]:
            if (d + incr) > 31:
                m += 1
                d = (d + incr) - 31
            else:
                d += incr
        elif m in [4,6,9,10,11]:
            if (d + incr) > 30:
                m += 1
                d = (d + incr) - 30
            else:
                d += incr
        else:
            if Utils.isLeap(y):
                if (d + incr) > 29:
                    m += 1
                    d = (d + incr) - 29
                else:
                    d += incr
            else:
                if (d + incr) > 28:
                    m += 1
                    d = (d + incr) - 28
                else:
                    d += incr
        sm = None
        if m < 10:
            sm = ('0' + str(m))
        else:
            sm = str(m)     
            
        sd =None
        if d < 10:
            sd = ('0' + str(d))
        else:
            sd = str(d)       
        td = str(y) + "-" + str(sm) + "-" + str(sd)
        return (nd,td)
        
    @staticmethod
    def isLeap(year):
        if year%400 == 0:
            return True
        elif year%4 == 0 and year%100 == 0:
            return True


五,在init包中创建InitConfig.py文件,代码如下:

# -*- coding:utf-8 -*-
#--------------------------------------------
#描述:如家页面爬虫主程序
#日期: 2014-02-09
#作者: jiangfuqiang
#---------------------------
from com.jhnet.spider.db.factory.MongoFactory import MongoFactory
from com.jhnet.spider.entity.ProvinceCity import ProvinceCity
from com.jhnet.spider.fetchpage.spider import SpiderUtils
from com.jhnet.spider.util import Utils
from xml.dom import minidom
import os
mongoConfigDict = {};
path = "E:"+os.sep+"testdata" + os.sep   #写一个你自己的存放地址
#初始化mongodb的配置,放入字典中
def initMongoXml():
    xmldoc = minidom.parse("../../../resources/mongodb-config.xml")
    mongos = xmldoc.firstChild
    mongoChild = mongos.childNodes
    
    for i in range(0,mongoChild.length):
       mongo = mongoChild.item(i)
       if mongo.nodeType == 1:  #去掉标签
           mongoName = mongo.nodeName
           mChild = mongo.childNodes
           for j in range(0, mChild.length):
               mm = mChild.item(j)
               if mm.nodeType == 1:
                   mmName = mm.nodeName
                   mmValue = mm.childNodes.item(0).nodeValue
                   mongoConfigDict[mongoName + '_' + mmName] = mmValue
                   
initMongoXml()  #初始化mongodb配置
mf = MongoFactory()
mf.initMongo(mongoConfigDict)
#缓存城市
def cacheCity():
    citys = MongoFactory.getDBCollection("province_city").find()
    if citys.count() > 0:
        for city in citys:
            cityName = city['city_name']
            cityNamePinyin = city['city_pinyin']
            provincePinyin = city['province_pinyin']
            provinceName = city['province_name']
            pc = ProvinceCity(cityName, cityNamePinyin,provinceName,provincePinyin)
            if 'homeinns_cityid' in city.keys():
                pc.setHomeinnsCityid(city['homeinns_cityid'])
            Utils.cityCache.append(pc)
cacheCity()

#在这里你就可以执行recordPC.py了,赶紧先去初始化吧

好了,今晚就先上这么多,明晚继续

你可能感兴趣的:(手把手教你使用python写提取快捷酒店房间信息的采集程序)