由于该项目还在运行当中,公司并未使用代理,此处只贴逻辑,关键代码我会打码,见谅
配置:
from DBUtils.PooledDB import PooledDB###sql连接池的一个包
import requests
import re
import time
import random
import json
import pymysql
from lxml import etree
import threading
b ={"user":"***",
"passwd":"***",
"host":"****",
"db":'*****',
"port":****,
"charset":'utf8'####解决中文编码
}
h=0####全局参数,城市数,由于线程并发争抢资源的问题,故需锁住
数据库部分:###init游标,封装线程池,sql查询,sql增删改
class Braud(threading.Thread):###继承线程类
__pool=None
_instance_lock = threading.Lock()
##初始化一些资源
def __init__(self, threadID, name, counter):
threading.Thread.__init__(self)
##接下来三个参数应为并没有处理记录线程情况作用不大
self.threadID = threadID
self.name = name
self.counter = counter
###时间
self.indata="2018-09-14"
self.outdata="2018-09-15"
#将数据库连接游标初始化,这个游标通过连接池中的连接每一次sql都是不同的连接
self.coon=Braud.getmysqlconn()
self.cur=self.coon.cursor(cursor=pymysql.cursors.DictCursor)
#sql连接池,init游标,此处与游标建立了联系达到全局都可以使用这个池子,即每条sql语句通过游标建立一个单独的连接
@staticmethod
def getmysqlconn():
if Braud.__pool is None:
#creater是以哪种包来创建pool,
#mincached最少的空闲连接数,如果空闲连接数小于这个数,pool会创建一个新的连接
#maxcached最大的空闲连接数,如果空闲连接数大于这个数,pool会关闭空闲连接
#当然这个包还有其他的东西:[精炼](https://www.cnblogs.com/Xjng/p/3437694.html)
__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\##此处有个问题就是传一个sql,value是不能直接生成sql语句,所以单独写对应写入函数来拼接sql语句
def op_insert(self, sql):
print('op_insert', sql)
insert_num = self.cur.execute(sql)
print("修改成功")
self.coon.commit()
return insert_num
# 查询
def op_select(self, sql):
try:
print('op_select', sql)
self.cur.execute(sql) # 执行sql
select_res = self.cur.fetchall() # 返回结果为字典
print("查询成功")
return select_res
except pymysql.Error as e:
self.op_select(sql)
# 释放资源,此处我是加到所有线程结束,释放,并没有实测(开始是没加此函数)
def dispose(self):
self.coon.close()
self.cur.close()
线程run方法,此方法名称不能改,为线程模块中默认跑线程start只是开启
#多线程:城市每10条一取最大633个
def run(self):
global h
while True:
#在这个所得前后必须将终止条件都写一遍,不然就会有几个线程在达到终止条件但并不会停止
if h >640:
break
with Booking._instance_lock:
x = h
if h>630:
x=633
h += 10
if h >640: