51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1426|回复: 0
打印 上一主题 下一主题

Pyspider实例之抓取数据并保存到MySQL数据库

[复制链接]
  • TA的每日心情
    擦汗
    3 天前
  • 签到天数: 527 天

    连续签到: 4 天

    [LV.9]测试副司令

    跳转到指定楼层
    1#
    发表于 2018-11-29 14:05:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    1、在Pyspider的脚本开头引入:
    1. from pyspider.database.mysql.mysqldb import SQL
    复制代码

    2、重写on_result方法:
    1. def on_result(self,result):
    2.         if not result or not result['original_id']:
    3.             return
    4.         sql = SQL()
    5.         sql.insert('t_dream_xm_project',**result)  
    复制代码


    3、编写数据库脚本(放入/usr/lib/python2.7/site-packages/pyspider/database/mysql/下):
    1. #!/usr/bin/env python
    2. # -*- encoding: utf-8 -*-
    3. from six import itervalues
    4. import MySQLdb

    5. class SQL():
    6.     #数据库初始化
    7.     def __init__(self):
    8.         #数据库连接相关信息
    9.         hosts    = '数据库地址'  
    10.         username = '数据库用户名'
    11.         password = '数据库密码'
    12.         database = '数据库名'
    13.         charsets = 'utf8'

    14.         self.connection = False
    15.         try:
    16.             self.conn = MySQLdb.connect(host = hosts,user = username,passwd = password,db = database,charset = charsets)
    17.             self.cursor = self.conn.cursor()
    18.             self.cursor.execute("set names "+charsets)
    19.             self.connection = True
    20.         except Exception,e:
    21.             print "Cannot Connect To Mysql!/n",e

    22.     def escape(self,string):
    23.         return '%s' % string
    24.     #插入数据到数据库   
    25.     def insert(self,tablename=None,**values):

    26.         if self.connection:
    27.             tablename = self.escape(tablename)  
    28.             if values:
    29.                 _keys = ",".join(self.escape(k) for k in values)
    30.                 _values = ",".join(['%s',]*len(values))
    31.                 sql_query = "insert into %s (%s) values (%s)" % (tablename,_keys,_values)
    32.             else:
    33.                 sql_query = "replace into %s default values" % tablename
    34.             try:
    35.                 if values:
    36.                     self.cursor.execute(sql_query,list(itervalues(values)))
    37.                 else:      
    38.                     self.cursor.execute(sql_query)
    39.                 self.conn.commit()
    40.                 return True
    41.             except Exception,e:
    42.                 print "An Error Occured: ",e
    43.                 return False
    复制代码
    说明:这里使用的是MySQLdb驱动

    4、数据库新建数据库以及对应的表,表的字段名称和Pyspider脚本中detail_page方法中return返回的字段名称对应。
    OK,完成这项步骤就可以启动服务器进行测试了。
    完整的Pyspider脚本:
    1. #!/usr/bin/env python
    2. # -*- encoding: utf-8 -*-
    3. # Created on 2017-07-14 10:36:36
    4. # Project: xiaomi

    5. from pyspider.libs.base_handler import *
    6. from pyspider.database.mysql.mysqldb import SQL
    7. import urllib
    8. import time
    9. import json

    10. class Handler(BaseHandler):
    11.     #配置通用的请求属性
    12.     crawl_config = {
    13.         'headers' : {'Connection':'keep-alive','Accept-Encoding':'gzip, deflate, br','Accept-Language':'zh-CN,zh;q=0.8','content-type':'application/x-www-form-urlencoded','Referer':'//home.mi.com/crowdfundinglist?id=78&title=%E4%BC%97%E7%AD%B9','User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'}
    14.     }

    15.     @every(minutes=24 * 60)
    16.     def on_start(self):
    17.         #获取所有的产品详细产品地址
    18.         param = 'data=%7B%22HomeList%22%3A%7B%22model%22%3A%22Homepage%22%2C%22action%22%3A%22BuildHome%22%2C%22parameters%22%3A%7B%22id%22%3A12%7D%7D%7D'
    19.         self.crawl('https://home.mi.com/app/shopv3/pipe',method="GET",params=param,callback=self.index_page)


    20.     @config(age=60 * 60)  
    21.     def index_page(self, response):
    22.         #获取单个产品的详细信息
    23.         for each in response.json['result']['HomeList']['data']:
    24.             gid = each['gid']
    25.             detailparm = "{\"detail\":{\"model\":\"Shopv2\",\"action\":\"getDetail\",\"parameters\":{\"gid\":\"%s\"}},\"comment\":{\"model\":\"Comment\",\"action\":\"getList\",\"parameters\":{\"goods_id\":\"%s\",\"orderby\":\"1\",\"pageindex\":\"0\",\"pagesize\":3}},\"activity\":{\"model\":\"Activity\",\"action\":\"getAct\",\"parameters\":{\"gid\":\"%s\"}}}" % (gid,gid,gid)
    26.             detailreq = urllib.quote(detailparm)
    27.             detailreq = "data=" + detailreq
    28.             detailurl = "https://home.mi.com/app/shop/pipe?gid=%s" % gid
    29.             #print detailurl
    30.             self.crawl(detailurl,method='POST',data=detailreq ,callback=self.detail_page)

    31.     @config(priority=2)
    32.     def detail_page(self, response):
    33.         #转换成Json格式的字符串
    34.         resultjsonstr = json.dumps(response.json)
    35.         result = json.loads(resultjsonstr)['result']['detail']['data']['good']
    36.         #将返回的结果保存到文件
    37.         resultfile = open("/tmp/xiaomi/%s.txt" % result['gid'].encode('utf-8'),'w')
    38.         resultfile.write(resultjsonstr)
    39.         resultfile.close()
    40.         #将返回的结果保存到MySQL数据库
    41.         return {
    42.             "original_id": result['gid'].encode('utf-8'),
    43.             "project_name": result['name'].encode('utf-8'),
    44.             "project_desc": result['summary'].encode('utf-8'),
    45.             "curr_money":result['saled'].encode('utf-8'),
    46.             "begin_date":time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(float(result['ctime'].encode('utf-8'))))
    47.         }

    48.     def on_result(self,result):
    49.         if not result or not result['original_id']:
    50.             return
    51.         sql = SQL()
    52.         sql.insert('t_dream_xm_project',**result)
    复制代码


    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-18 08:30 , Processed in 0.064906 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表