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实现多线程抓取妹子图
Aug 08 Python
Python中input与raw_input 之间的比较
Aug 20 Python
Python实现简单网页图片抓取完整代码实例
Dec 15 Python
Python函数定义及传参方式详解(4种)
Mar 18 Python
python PyAutoGUI 模拟鼠标键盘操作和截屏功能
Aug 04 Python
浅谈pytorch、cuda、python的版本对齐问题
Jan 15 Python
python 成功引入包但无法正常调用的解决
Mar 09 Python
pycharm无法安装第三方库的问题及解决方法以scrapy为例(图解)
May 09 Python
Python抓包并解析json爬虫的完整实例代码
Nov 03 Python
Pycharm如何自动生成头文件注释
Nov 14 Python
python搜索算法原理及实例讲解
Nov 18 Python
Python循环之while无限迭代
Apr 30 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
海贼王动画变成“真人”后,凯多神还原,雷利太帅了!
2020/04/09 日漫
探讨:如何编写PHP扩展
2013/06/13 PHP
浅析PHP中Collection 类的设计
2013/06/21 PHP
php calender(日历)二个版本代码示例(解决2038问题)
2013/12/24 PHP
jQuery get和post 方法传值注意事项
2009/11/03 Javascript
javascript操作JSON的要领总结
2012/12/09 Javascript
js实现浏览器窗口大小被改变时触发事件的方法
2015/02/02 Javascript
JavaScript常用脚本汇总(二)
2015/03/04 Javascript
php+ajax+jquery实现点击加载更多内容
2015/05/03 Javascript
通过实例理解javascript中没有函数重载的概念
2015/06/03 Javascript
javascript实现下拉提示选择框
2015/12/29 Javascript
javascript中的作用域和闭包详解
2016/01/13 Javascript
AngularJS学习第二篇 AngularJS依赖注入
2017/02/13 Javascript
详解nodejs微信公众号开发——2.自动回复
2017/04/10 NodeJs
angular实现IM聊天图片发送实例
2017/05/08 Javascript
理解 javascript 中的函数表达式与函数声明
2017/07/07 Javascript
微信小程序中setInterval的使用方法
2017/09/29 Javascript
vue-router的使用方法及含参数的配置方法
2018/11/13 Javascript
vue.js实现的全选与全不选功能示例【基于elementui】
2018/12/03 Javascript
vue跳转同一个组件,参数不同,页面接收值只接收一次的解决方法
2019/11/05 Javascript
关于vue3默认把所有onSomething当作v-on事件绑定的思考
2020/05/15 Javascript
[59:30]完美世界DOTA2联赛PWL S3 access vs LBZS 第二场 12.20
2020/12/23 DOTA
python3模块smtplib实现发送邮件功能
2018/05/22 Python
Window环境下Scrapy开发环境搭建
2018/11/18 Python
对pandas通过索引提取dataframe的行方法详解
2019/02/01 Python
常用的四种CSS透明属性介绍
2014/04/12 HTML / CSS
美国精品家居用品网站:US-Mattress
2016/08/24 全球购物
美丽的现代设计家具:2Modern
2018/07/26 全球购物
医院办公室主任职责
2013/12/29 职场文书
责任担保书范文
2014/05/21 职场文书
卖房授权委托书样本
2014/10/05 职场文书
校园游戏活动新闻稿
2014/10/15 职场文书
创先争优承诺书
2015/01/20 职场文书
2015年幼儿园保育工作总结
2015/05/12 职场文书
2016年世界人口日宣传活动总结
2016/04/05 职场文书
python绘制简单直方图(质量分布图)的方法
2022/04/21 Python