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爬虫之抓取百度贴吧并存储到本地txt文件改进版
Nov 06 Python
用Python中的wxPython实现最基本的浏览器功能
Apr 14 Python
python通过apply使用元祖和列表调用函数实例
May 26 Python
Python获取系统默认字符编码的方法
Jun 04 Python
python读取视频流提取视频帧的两种方法
Oct 22 Python
python pandas库的安装和创建
Jan 10 Python
Python中的四种交换数值的方法解析
Nov 18 Python
深入浅析python的第三方库pandas
Feb 13 Python
Python使用sqlite3模块内置数据库
May 07 Python
Python爬虫与反爬虫大战
Jul 30 Python
python自动化之如何利用allure生成测试报告
May 02 Python
如何解决.cuda()加载用时很长的问题
May 24 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递归函数怎么用才有效
2018/02/24 PHP
将HTML自动转为JS代码
2006/06/26 Javascript
javascript中数组的sort()方法的使用介绍
2013/12/18 Javascript
JavaScript在for循环中绑定事件解决事件参数不同的情况
2014/01/20 Javascript
js点击事件链接的问题解决
2014/04/25 Javascript
jQuery实现手机号码输入提示功能实例
2015/04/30 Javascript
浅谈JavaScript的Polymer框架中的事件绑定
2015/07/29 Javascript
浅析AMD CMD CommonJS规范--javascript模块化加载学习心得总结
2016/03/16 Javascript
JS实现点击事件统计的简单实例
2016/07/10 Javascript
微信小程序实战之轮播图(3)
2017/04/17 Javascript
微信小程序登录按钮遮罩浮层效果的实现方法
2018/12/16 Javascript
html+jQuery实现拖动滑块图片拼图验证码插件【移动端适用】
2019/09/10 jQuery
[03:01]DOTA2英雄基础教程 露娜
2014/01/07 DOTA
python模拟鼠标拖动操作的方法
2015/03/11 Python
TF-IDF与余弦相似性的应用(二) 找出相似文章
2017/12/21 Python
Python 文本文件内容批量抽取实例
2018/12/10 Python
python 处理数字,把大于上限的数字置零实现方法
2019/01/28 Python
Python HTML解析器BeautifulSoup用法实例详解【爬虫解析器】
2019/04/05 Python
解决py2exe打包后,总是多显示一个DOS黑色窗口的问题
2019/06/21 Python
python实现自动化上线脚本的示例
2019/07/01 Python
Python使用scrapy爬取阳光热线问政平台过程解析
2019/08/14 Python
Django 拆分model和view的实现方法
2019/08/16 Python
python 利用turtle库绘制笑脸和哭脸的例子
2019/11/23 Python
将matplotlib绘图嵌入pyqt的方法示例
2020/01/08 Python
python pptx复制指定页的ppt教程
2020/02/14 Python
PyCharm 专业版安装图文教程
2020/02/20 Python
用opencv给图片换背景色的示例代码
2020/07/08 Python
美国迪克体育用品商店:DICK’S Sporting Goods
2018/07/24 全球购物
在线实验室测试:HealthLabs.com
2020/05/03 全球购物
abstract class和interface有什么区别
2013/08/04 面试题
售后专员岗位职责
2013/12/08 职场文书
工作说明书格式
2014/07/29 职场文书
2014员工聘用协议书(最新版)
2014/11/24 职场文书
2014年电话销售工作总结
2014/12/01 职场文书
千手观音观后感
2015/06/03 职场文书
85句关于理想的名言警句大全
2019/08/22 职场文书