同步:写入数据速度比较慢,而爬虫速度比较快,可能导致数据最后写入不到数据库中
异步:是将爬虫的数据先放入一个携程内存连接池中,再同时将连接池的数据写入到数据库中,这样既可以提高数据库的写入速度,同时也可以将爬取到的所有数据都写入进数据库,能保证数据的完整性
#导包
import gevent
#猴子补丁
from gevent import monkey
monkey.patch_all()
from d8_db import ConnectMysql
import time
import pymysql
#定义入库类
class MyInsert(object):
#定义入库方法(同步)
def insert_line(self,my_connect):
#定义游标对象
cursor = my_connect.cursor()
#入库操作
for item in range(10001):
#print(item)
cursor.execute(" insert into `spider_data` values ('%s','%s') " % ('123','123'))
my_connect.commit()
cursor.close()
my_connect.close()
#读库
#cursor.execute(' select * from student ')
#res = cursor.fetchall()
#print(res)
#协程入库
class MyInsertGevent(object):
#定义初始化方法
#def __init__(self,my_connect):
# self.my_connect = my_connect
#定义协程入库方法
def insert_gevent(self,startnum,endnum):
conn = pymysql.connect(host='localhost',user='root',password='123456',database='mymac',charset='utf8')
#定义游标对象
cursor = conn.cursor()
#入库操作
for item in range(startnum,endnum):
cursor.execute(" insert into `spider_data` values ('%s','%s') " % ('123','123'))
conn.commit()
cursor.close()
conn.close()
if __name__ == "__main__":
#实例化第一个对象
connectmysql = ConnectMysql()
conn = connectmysql.connect_mysql()
#实例化第二个对象
print('start at %s' % time.ctime())
#myinsert = MyInsert()
#myinsert.insert_line(conn)
#实例化协程入库
myinsertgevent = MyInsertGevent()
gevent.joinall([
gevent.spawn(myinsertgevent.insert_gevent,1,2000),
gevent.spawn(myinsertgevent.insert_gevent,2001,4000),
gevent.spawn(myinsertgevent.insert_gevent,4001,5000),
gevent.spawn(myinsertgevent.insert_gevent,5001,8000),
gevent.spawn(myinsertgevent.insert_gevent,8001,10000),
])
print('end at %s' % time.ctime())