本文实例讲述了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 nullPython基于多线程实现抓取数据存入数据库的方法