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 相关文章推荐
Django项目开发中cookies和session的常用操作分析
Jul 03 Python
完美解决python中ndarray 默认用科学计数法显示的问题
Jul 14 Python
python机器学习之神经网络实现
Oct 13 Python
详解python中的hashlib模块的使用
Apr 22 Python
详解Python下载图片并保存本地的两种方式
May 15 Python
Django文件存储 自己定制存储系统解析
Aug 02 Python
Python自动采集微信联系人的实现示例
Feb 28 Python
Python图像处理二值化方法实例汇总
Jul 24 Python
python PyAUtoGUI库实现自动化控制鼠标键盘
Sep 09 Python
Python读写yaml文件
Mar 20 Python
Python几种酷炫的进度条的方式
Apr 11 Python
Python之matplotlib绘制折线图
Apr 13 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编写的SVN类
2013/07/18 PHP
PHP strstr 函数判断字符串是否否存在的实例代码
2013/09/28 PHP
UTF-8正则表达式如何匹配汉字
2015/08/03 PHP
详谈PHP中public,private,protected,abstract等关键字的用法
2017/12/31 PHP
收藏一些不常用,但是有用的代码
2007/03/12 Javascript
jQuery解析XML文件同时动态增加js文件的方法
2015/06/01 Javascript
理解javascript封装
2016/02/23 Javascript
文本框只能输入数字的js代码(含小数点)
2016/07/10 Javascript
微信小程序 window_x64环境搭建
2016/09/30 Javascript
javascript iframe跨域详解
2016/10/26 Javascript
基于vuejs+webpack的日期选择插件
2020/05/21 Javascript
基于JavaScript实现熔岩灯效果导航菜单
2017/01/04 Javascript
VUE axios上传图片到七牛的实例代码
2017/07/28 Javascript
深入理解Vue2.x的虚拟DOM diff原理
2017/09/27 Javascript
JS获取数组中出现次数最多及第二多元素的方法
2017/10/27 Javascript
Vue.js子组件向父组件通信的方法实例代码详解
2018/12/10 Javascript
详解如何用webpack4从零开始构建react开发环境
2019/01/27 Javascript
小程序关于请求同步的总结
2019/05/05 Javascript
微信小程序版本自动更新的方法
2019/06/14 Javascript
vant组件中 dialog的确认按钮的回调事件操作
2020/11/04 Javascript
python中定义结构体的方法
2013/03/04 Python
python 借助numpy保存数据为csv格式的实现方法
2018/07/04 Python
python爬虫 正则表达式解析
2019/09/28 Python
利用CSS3的transition属性实现滑动效果
2015/08/05 HTML / CSS
BudgetAir印度:预订航班、酒店和汽车租赁
2019/07/07 全球购物
美国儿童服装、家具和玩具精品店:Maisonette
2019/11/24 全球购物
介绍一下Java的事务处理
2012/12/07 面试题
服装销售人员求职自我评价
2013/09/26 职场文书
计算机本科生自荐信
2013/10/15 职场文书
小学教师的个人自我鉴定
2013/10/24 职场文书
大学生标准推荐信范文
2013/11/25 职场文书
男方父母婚礼答谢词
2014/01/25 职场文书
公司募捐倡议书
2014/05/14 职场文书
仓管员岗位职责范本
2015/04/01 职场文书
横空出世观后感
2015/06/09 职场文书
python通配符之glob模块的使用详解
2021/04/24 Python