agoda获取酒店数据

本文介绍了如何通过Python爬取Agoda网站的酒店数据,着重解决了在爬取过程中遇到的json.loads报错、速度控制以及数据库插入时的引号报错问题。通过对搜索框获取城市ID,实现报错时减少尝试次数并自动重启,同时详细讲解了列表页数据获取和详情页数据处理。
摘要由CSDN通过智能技术生成

最近改了改代码,正好解决了一些报错问题,更新出来。个别处会加蜜
数据库以及线程控制

from DBUtils.PooledDB import PooledDB
import requests
import demjson
import time
import random
import json
import pymysql
import datetime
import threading

b = {"user": "root",
     "passwd": "Lohas123",
     "host": "121.40.52.101",
     "db": 'price',
     "port": 3306,
     "charset": 'utf8'
     }
#改了一下-10才能将库里读完。
h = -10
class Agoda(threading.Thread):
    __pool = None
    _instance_lock = threading.Lock()

    def __init__(self):
        threading.Thread.__init__(self)
        self.indata =(datetime.datetime.now()+datetime.timedelta(days=2)).strftime('%Y-%m-%d %H:%M:%S')
        self.outdata =(datetime.datetime.now()+datetime.timedelta(days=4)).strftime("%Y-%m-%d %H:%M:%S")
        # 将数据库连接游标初始化
        self.coon = Agoda.getmysqlconn()
        self.cur = self.coon.cursor(cursor=pymysql.cursors.DictCursor)

    # sql连接池
    @staticmethod
    def getmysqlconn():
        if Agoda.__pool is None:
            __pool = PooledDB(creator=pymysql, mincached=3, maxcached=20, host=b["host"], user=b["user"],
                              passwd=b["passwd"], db=b["db"], port=b["port"], charset=b["charset"])
        return __pool.connection()

    # 插入\更新\删除sql\
    def op_insert(self, sql):

        print('op_insert', sql)
        self.cur.execute(sql)
        print("修改成功")
        self.coon.commit()

    # 查询
    def op_select(self, sql):
        print('op_select', sql)
        self.cur.execute(sql)  # 执行sql
        select_res = self.cur.fetchall()  # 返回结果为字典
        # print("查询成功")
        return select_res


    # 释放资源
    def dispose(self):
        self.coon.close()
        self.cur.close()
      
    #动态计算数据库数量
    def count(self):
        table="foreign_city_copy"
        runstatue = "isrunning"
        sql="select count(*) from {0} where {1}=0".format(table,runstatue)
        ress = (list(self.op_select(sql)[0].values())[0]//10+1)*10
        return ress
    
    #线程控制稍微改了下
    def run(self):
        global h
        count=self.count()
        while True:
            if h > count:
                break
            with Agoda._instance_lock:
                h += 10
            if h > count:
                break
            sql = "select id,name,ename,country from foreign_city_co
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值