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


Posted in Python onJune 22, 2018

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

1. 数据库类

"""
使用须知:
代码中数据表名 aces ,需要更改该数据表名称的注意更改
"""
import pymysql
class Database():
  # 设置本地数据库用户名和密码
  host = "localhost"
  user = "root"
  password = ""
  database = "test"
  port = 3306
  charset = "utf8"
  cursor=''
  connet =''
  def __init__(self):
    #连接到数据库
    self.connet = pymysql.connect(host = self.host , user = self.user,password = self.password , database = self.database, charset = self.charset)
    self.cursor = self.connet.cursor()
  # #删表
  def dropTables(self):
    self.cursor.execute('''''drop table if exists aces''')
    print("删表")
  #建表
  def createTables(self):
    self.cursor.execute('''''create table if not exists aces
            (
              asin  varchar(11) primary key not null,
              checked varchar(200));''')
    print("建表")
  #保存数据
  def save(self,aceslist):
    self.cursor.execute("insert into aces ( asin, checked) values(%s,%s)", (aceslist[0],aceslist[1]))
    self.connet.commit()
  #判断元素是否已经在数据库里,在就返回true ,不在就返回false
  def is_exists_asin(self,asin):
    self.cursor.execute('select * from aces where asin = %s',asin)
    if self.cursor.fetchone() is None:
      return False
    return True
# db =Database()

2. 多线程任务类

import urllib.parse
import urllib.parse
import urllib.request
from queue import Queue
import time
import random
import threading
import logging
import pymysql
from bs4 import BeautifulSoup
from local_data import Database
#一个模块中存储多个类 AmazonSpeder , ThreadCrawl(threading.Thread), AmazonSpiderJob
class AmazonSpider():
  def __init__(self):
    self.db = Database()
  def randHeader(self):
    head_connection = ['Keep-Alive', 'close']
    head_accept = ['text/html, application/xhtml+xml, */*']
    head_accept_language = ['zh-CN,fr-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; Trident/7.0; rv:11.0) like Gecko',
              'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36',
              'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; rv:11.0) like Gecko)',
              'Mozilla/5.0 (Windows; U; Windows NT 5.2) Gecko/2008070208 Firefox/3.0.1',
              'Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070309 Firefox/2.0.0.3',
              'Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070803 Firefox/1.5.0.12',
              'Opera/9.27 (Windows NT 5.2; U; zh-cn)',
              'Mozilla/5.0 (Macintosh; PPC Mac OS X; U; en) Opera 8.0',
              'Opera/8.0 (Macintosh; PPC Mac OS X; U; en)',
              'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.12) Gecko/20080219 Firefox/2.0.0.12 Navigator/9.0.0.6',
              'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0)',
              'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)',
              'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C; .NET4.0E)',
              'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Maxthon/4.0.6.2000 Chrome/26.0.1410.43 Safari/537.1 ',
              'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C; .NET4.0E; QQBrowser/7.3.9825.400)',
              'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0 ',
              'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.92 Safari/537.1 LBBROWSER',
              'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0; BIDUBrowser 2.x)',
              'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/3.0 Safari/536.11']
    header = {
      'Connection': head_connection[0],
      'Accept': head_accept[0],
      'Accept-Language': head_accept_language[1],
      'User-Agent': head_user_agent[random.randrange(0, len(head_user_agent))]
    }
    return header
  def getDataById(self , queryId):
    #如果数据库中有的数据,直接返回不处理
    if self.db.is_exists_asin(queryId):
      return
    req = urllib.request.Request(url="https://www.amazon.com/dp/"+str(queryId) , headers=self.randHeader())
    webpage = urllib.request.urlopen(req)
    html = webpage.read()
    soup = BeautifulSoup(html, 'html.parser')
    content = soup.find_all("span" , id = "asTitle")
    # 加入一种判断,有的asin没有该定位,
    if len(content):
      # 非空
      state = content[0].string
    else:
      # 列表为空,没有定位到
      state = "other"
    print(queryId)
    print(state)
    self.db.save([queryId,state])
class ThreadCrawl(threading.Thread): #ThreadCrawl类继承了Threading.Thread类
  def __init__(self, queue): #子类特有属性, queue
    FORMAT = time.strftime("[%Y-%m-%d %H:%M:%S]", time.localtime()) + "[AmazonSpider]-----%(message)s------"
    logging.basicConfig(level=logging.INFO, format=FORMAT)
    threading.Thread.__init__(self)
    self.queue = queue
    self.spider = AmazonSpider() #子类特有属性spider, 并初始化,将实例用作属性
  def run(self):
    while True:
      success = True
      item = self.queue.get() #调用队列对象的get()方法从队头删除并返回一个项目item
      try:
        self.spider.getDataById(item) #调用实例spider的方法getDataById(item)
      except :
        # print("失败")
        success = False
      if not success :
        self.queue.put(item)
      logging.info("now queue size is: %d" % self.queue.qsize()) #队列对象qsize()方法,返回队列的大小
      self.queue.task_done() #队列对象在完成一项工作后,向任务已经完成的队列发送一个信号
class AmazonSpiderJob():
  def __init__(self , size , qs):
    self.size = size # 将形参size的值存储到属性变量size中
    self.qs = qs
  def work(self):
    toSpiderQueue = Queue() #创建一个Queue队列对象
    for q in self.qs:
      toSpiderQueue.put(q) #调用队列对象的put()方法,在对尾插入一个项目item
    for i in range(self.size):
      t = ThreadCrawl(toSpiderQueue)  #将实例用到一个类的方法中
      t.setDaemon(True)
      t.start()
    toSpiderQueue.join()  #队列对象,等到队列为空,再执行别的操作

3. 主线程类

from amazon_s import AmazonSpiderJob #从一个模块中导入类
import pymysql
import pandas as pd
from local_data import Database
if __name__ == '__main__':
  #初次跑程序的时候,需要删除旧表,然后新建表,之后重启再跑的时候需要注释
  #----------------------
  db = Database()
  db.dropTables()
  db.createTables()
  #---------------------------
  df = pd.read_excel("ASIN检查_viogico_1108.xlsx")
  # print(df.info())
  qs = df["asin1"].values
  print(qs)
  print(len(qs))
  amazonJob = AmazonSpiderJob(8, qs)
  amazonJob.work()

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python 实现删除某路径下文件及文件夹的实例讲解
Apr 24 Python
浅谈python中字典append 到list 后值的改变问题
May 04 Python
Django使用Mysql数据库已经存在的数据表方法
May 27 Python
python进行TCP端口扫描的实现
Dec 21 Python
对dataframe数据之间求补集的实例详解
Jan 30 Python
浅析python,PyCharm,Anaconda三者之间的关系
Nov 27 Python
python将四元数变换为旋转矩阵的实例
Dec 04 Python
Python3打包exe代码2种方法实例解析
Feb 17 Python
keras中的backend.clip用法
May 22 Python
通过自学python能找到工作吗
Jun 21 Python
Python必须了解的35个关键词
Jul 16 Python
pytorch Dropout过拟合的操作
May 27 Python
python实现比较文件内容异同
Jun 22 #Python
python实现输入数字的连续加减方法
Jun 22 #Python
Python之用户输入的实例
Jun 22 #Python
Python交互环境下实现输入代码
Jun 22 #Python
python实现搜索文本文件内容脚本
Jun 22 #Python
python实现textrank关键词提取
Jun 22 #Python
python实现自主查询实时天气
Jun 22 #Python
You might like
PHP图片自动裁切应付不同尺寸的显示
2014/10/16 PHP
php操作xml入门之xml标签的属性分析
2015/01/23 PHP
WampServer搭建php环境时遇到的问题汇总
2015/07/23 PHP
ThinkPHP开发框架函数详解:C方法
2015/08/14 PHP
PHP读取XML格式文件的方法总结
2017/02/27 PHP
[原创]PHP global全局变量经典应用与注意事项分析【附$GLOBALS用法对比】
2019/07/12 PHP
Windows服务器中PHP如何安装redis扩展
2019/09/27 PHP
XmlUtils JS操作XML工具类
2009/10/01 Javascript
写自已的js类库需要的核心代码
2012/07/16 Javascript
网页中可关闭的漂浮窗口实现可自行调节
2013/08/20 Javascript
jQuery+ajax+asp.net获取Json值的方法
2016/06/08 Javascript
js replace(a,b)之替换字符串中所有指定字符的方法
2016/08/17 Javascript
基于jQuery实现发送短信验证码后的倒计时功能(无视页面关闭)
2016/09/02 Javascript
jquery replace方法去空格
2017/05/08 jQuery
vue+vuecli+webpack中使用mockjs模拟后端数据的示例
2017/10/24 Javascript
Vue和React组件之间的传值方式详解
2019/01/31 Javascript
vue实现购物车案例
2020/05/30 Javascript
浅谈JS for循环中使用break和continue的区别
2020/07/21 Javascript
Vue性能优化的方法
2020/07/30 Javascript
简单谈谈offsetleft、offsetTop和offsetParent
2020/12/04 Javascript
Python数据类型详解(二)列表
2016/05/08 Python
wxPython之解决闪烁的问题
2018/01/15 Python
利用python如何处理nc数据详解
2018/05/23 Python
解决yum对python依赖版本问题
2019/07/05 Python
讲解Python3中NumPy数组寻找特定元素下标的两种方法
2019/08/04 Python
Python基于Dlib的人脸识别系统的实现
2020/02/26 Python
全网首秀之Pycharm十大实用技巧(推荐)
2020/04/27 Python
Pytorch 使用 nii数据做输入数据的操作
2020/05/26 Python
Python 利用argparse模块实现脚本命令行参数解析
2020/12/28 Python
TensorFlow的环境配置与安装方法
2021/02/20 Python
新秀丽官方旗舰店:Samsonite拉杆箱、双肩包、皮具
2018/03/05 全球购物
临时租车协议范本
2014/09/23 职场文书
公务员个人总结
2015/02/12 职场文书
演讲稿之感恩老师(三篇范文)
2019/09/06 职场文书
一条慢SQL语句引发的改造之路
2022/03/16 MySQL
Python开发五子棋小游戏
2022/05/02 Python