Python基于多线程实现抓取数据存入数据库的方法

  

本文实例讲述了Python基于多线程实现抓取数据存入数据库的方法。分享给大家供大家参考,具体如下:

  

<强> 1。数据库类

        ”“”   使用须知:   代码中数据表名ace,需要更改该数据表名称的注意更改   ”“”   进口pymysql   类数据库():   #设置本地数据库用户名和密码   主机=" localhost "   用户="根"   密码=" "   数据库="测试"   端口=3306   charset=" utf8 "   光标="   概念网络="   def __init__(自我):   #连接到数据库   自我。概念网络=pymysql。连接(主机=自我。主机、用户=自我。用户、密码=自我。密码,数据库=自我。数据库字符集=self.charset)   自我。光标=self.connet.cursor ()   # #删表   def dropTables(自我):   self.cursor。执行(如果存在ace””“删除表”)   打印(“删表”)   #建表   def不知道(自我):   self.cursor。执行(如果不存在ace”““创建表   (   正如varchar(11)主键不能为空,   检查varchar (200));“)   打印(“建表”)   #保存数据   def保存(自我,aceslist):   self.cursor。执行(“插入ace (asin、检查)值(% s % s)”(aceslist [0], aceslist [1]))   self.connet.commit ()   #判断元素是否已经在数据库里,在就返回真,不在就返回错误的   def is_exists_asin(自我,asin):   self.cursor。执行(“select * from ace,正如=% s ',最佳)   如果self.cursor.fetchone()没有:   返回假   还真   # db=数据库()      之前      

<强> 2。多线程任务类

        进口urllib.parse   进口urllib.parse   进口urllib.request   从队列进口队列   导入的时间   进口随机   进口线程   导入日志   进口pymysql   从bs4进口BeautifulSoup   从local_data导入数据库   #一个模块中存储多个类AmazonSpeder, ThreadCrawl (threading.Thread) AmazonSpiderJob   类AmazonSpider ():   def __init__(自我):   自我。db=数据库()   def randHeader(自我):   head_connection=(“维生”,“关闭”)   head_accept=[' text/html, application/xhtml + xml, */*’)   head_accept_language=[“- fr应用;q=0.5”,“en - us, en; q=0.8, zh-Hans-CN; q=0.5, zh-Hans; q=0.3”)   head_user_agent=[' Mozilla/5.0 (Windows NT 6.3;WOW64;三叉戟/7.0;房车:11.0)像壁虎”,   Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML,像壁虎)Chrome/28.0.1500.95 Safari/537.36”,   Mozilla/5.0 (Windows NT 6.1;WOW64;三叉戟/7.0;SLCC2;net CLR 2.0.50727;net CLR 3.5.30729;net CLR 3.0.30729;媒体中心电脑6.0;.NET4.0C;房车:11.0)像壁虎)”,   Mozilla/5.0(窗口;U;Windows NT 5.2)壁虎/2008070208 Firefox/3.0.1’,   Mozilla/5.0(窗口;U;Windows NT 5.1)壁虎/20070309 Firefox/2.0.0.3’,   Mozilla/5.0(窗口;U;Windows NT 5.1)壁虎/20070803 Firefox/1.5.0.12’,   “歌剧/9.27 (Windows NT 5.2;U;应用)”,   Mozilla/5.0(麦金塔电脑;PPC Mac OS X;U;Opera 8.0的,   “歌剧/8.0(麦金塔电脑;PPC Mac OS X;U;en)”,   Mozilla/5.0(窗口;U;Windows NT 5.1;en - us;房车:1.8.1.12)壁虎/20080219 Firefox/2.0.0.12导航/9.0.0.6 ',   Mozilla/4.0 (compatible;MSIE 8.0;Windows NT 6.1;Win64;x64;三叉戟/4.0)”,   Mozilla/4.0 (compatible;MSIE 8.0;Windows NT 6.1;三叉戟/4.0)”,   Mozilla/5.0 (compatible;MSIE 10.0;Windows NT 6.1;WOW64;三叉戟/6.0;SLCC2;net CLR 2.0.50727;net CLR 3.5.30729;net CLR 3.0.30729;媒体中心电脑6.0;InfoPath.2;.NET4.0C;.NET4.0E)”,   Mozilla/5.0 (Windows NT 6.1;AppleWebKit WOW64)/537.1 (KHTML,像壁虎)傲游浏览器/4.0.6.2000 Chrome/26.0.1410.43 Safari/537.1”,   Mozilla/5.0 (compatible;MSIE 10.0;Windows NT 6.1;WOW64;三叉戟/6.0;SLCC2;net CLR 2.0.50727;net CLR 3.5.30729;net CLR 3.0.30729;媒体中心电脑6.0;InfoPath.2;.NET4.0C;.NET4.0E;QQBrowser/7.3.9825.400)”,   Mozilla/5.0 (Windows NT 6.1;WOW64;房车:Firefox 21.0)壁虎/20100101/21.0”,   Mozilla/5.0 (Windows NT 6.1;WOW64) AppleWebKit/537.1 (KHTML,像壁虎)Chrome/21.0.1180.92 Safari 537.1 LBBROWSER’,   Mozilla/5.0 (compatible;MSIE 10.0;Windows NT 6.1;WOW64;三叉戟/6.0;BIDUBrowser 2. x)”,   Mozilla/5.0 (Windows NT 6.1;AppleWebKit WOW64)/536.11 (KHTML,像壁虎)Chrome/20.0.1132.11 TaoBrowser/Safari 3.0/536.11 ']   头={   “连接”:head_connection [0],   “接受”:head_accept [0],   “接收语言”:head_accept_language [1],   “用户代理”:head_user_agent[随机的。randrange (0, len (head_user_agent)))   }   返回头   queryId def getDataById(自我):   #如果数据库中有的数据,直接返回不处理   如果self.db.is_exists_asin (queryId):   返回   要求=urllib.request.Request (url=" https://www.amazon.com/dp/" + str (queryId),标题=self.randHeader ())   网页=urllib.request.urlopen(要求)   html=webpage.read ()   汤=BeautifulSoup (html、“html.parser”)   内容=汤。find_all(“跨越”,id=癮sTitle”)   #加入一种判断,有的最佳翻译没有该定位,   如果len(内容):   #非空   状态=[0].string内容   其他:   #列表为空,没有定位到   状态="其他"   打印(queryId)   print(状态)   self.db.save ([queryId、州)   类ThreadCrawl (threading.Thread): # ThreadCrawl类继承了threading.Thread类   def __init__(自我,队列):#子类特有属性,队列   格式=trftime (“[Y % - % - % d % H: % m: % S]”, time.localtime ()) +”(AmazonSpider) - - - - - - %(消息)- - - - - -”   logging.basicConfig(=日志级别。信息,格式=格式)   threading.Thread.__init__(自我)   自我。队列=队列   自我。蜘蛛=AmazonSpider() #子类特有属性蜘蛛,并初始化,将实例用作属性   def运行(自我):   而真正的:   成功=True   项=self.queue.get() #调用队列对象的获得()方法从队头删除并返回一个项目项   试一试:   self.spider.getDataById(项)#调用实例蜘蛛的方法getDataById(项)   除了:   #打印(“失败”)   成功=False   如果不成功:   self.queue.put(项)   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

Python基于多线程实现抓取数据存入数据库的方法