Python3实现的爬虫爬取数据并存入mysql数据库操作示例


Posted in Python onJune 06, 2018

本文实例讲述了Python3实现的爬虫爬取数据并存入mysql数据库操作。分享给大家供大家参考,具体如下:

爬一个电脑客户端的订单。罗总推荐,抓包工具用的是HttpAnalyzerStdV7,与chrome自带的F12类似。客户端有接单大厅,罗列所有订单的简要信息。当单子被接了,就不存在了。我要做的是新出订单就爬取记录到我的数据库zyc里。

设置每10s爬一次。

抓包工具页面如图:

Python3实现的爬虫爬取数据并存入mysql数据库操作示例

首先是爬虫,先找到数据存储的页面,再用正则爬出。

# -*- coding:utf-8 -*-
import re
import requests
import pymysql #Python3的mysql模块,Python2 是mysqldb
import datetime
import time
def GetResults():
  requests.adapters.DEFAULT_RETRIES = 5 #有时候报错,我在网上找的不知道啥意思,好像也没用。
  reg = [r'"id":(.*?),',
      r'"order_no":"(.*?)",',
      r'"order_title":"(.*?)",',
      r'"publish_desc":"(.*?)",',
      r'"game_area":"(.*?)\\/(.*?)\\/(.*?)",',
      r'"order_current":"(.*?)",',
      r'"order_content":"(.*?)",',
      r'"order_hours":(.*?),',
      r'"order_price":"(.*?)",',
      r'"add_price":"(.*?)",',
      r'"safe_money":"(.*?)",',
      r'"speed_money":"(.*?)",',
      r'"order_status_desc":"(.*?)",',
      r'"order_lock_desc":"(.*?)",',
      r'"cancel_type_desc":"(.*?)",',
      r'"kf_status_desc":"(.*?)",',
      r'"is_show_pwd":(.*?),',
      r'"game_pwd":"(.*?)",',
      r'"game_account":"(.*?)",',
      r'"game_actor":"(.*?)",',
      r'"left_hours":"(.*?)",',
      r'"created_at":"(.*?)",',
      r'"account_id":"(.*?)",',
      r'"mobile":"(.*?)",',
      r'"contact":"(.*?)",',
      r'"qq":"(.*?)"},']
  results=[]
  try:
    for l in range(1,2):   #页码
      proxy = {'HTTP':'61.135.155.82:443'} #代理ip
      html = requests.get('https://www.dianjingbaozi.com/api/dailian/soldier/hall?access_token=3ef3abbea1f6cf16b2420eb962cf1c9a&dan_end=&dan_start=&game_id=2&kw=&order=price_desc&page=%d'%l+'&pagesize=30&price_end=0&price_start=0&server_code=000200000000&sign=ca19072ea0acb55a2ed2486d6ff6c5256c7a0773×tamp=1511235791&type=public&type_id=%20HTTP/1.1',proxies=proxy) # 用get的方式访问。网页解码成中文。接单大厅页。
      #
      html=html.content.decode('utf-8')
      outcome_reg_order_no = re.findall(r'"order_no":"(.*?)","game_area"', html)  #获取订单编号,因为订单详情页url与订单编号有关。
      for j in range(len(outcome_reg_order_no)):
        html_order = requests.get('http://www.lpergame.com/api/dailian/order/detail?access_token=eb547a14bad97e1ee5d835b32cb83ff1&order_no=' +outcome_reg_order_no[j] + '&sign=c9b503c0e4e8786c2945dc0dca0fabfa1ca4a870×tamp=1511146154 HTTP/1.1',proxies=proxy)  #订单详细页
        html_order=html_order.content.decode('utf-8')
        # print(html_order)
        outcome_reg = []
        for i in range(len(reg)):#每条订单
          outcome = re.findall(reg[i], html_order)
          if i == 4:
            for k in range(len(outcome)):
              outcome_reg.extend(outcome[k])
          else:
            outcome_reg.extend(outcome)
        results.append(outcome_reg) #结果集
    return results
  except:
    time.sleep(5)  #有时太频繁会报错。
    print("失败")
    pass

根据爬虫结果建表,这里变量名要准确。并且要设置唯一索引,使每次爬的只有新订单入库。

def mysql_create():
  mysql_host = ''
  mysql_db = 'zyc'
  mysql_user = 'zyc'
  mysql_password = ''
  mysql_port = 3306
  db = pymysql.connect(host=mysql_host, port=mysql_port, user=mysql_user, password=mysql_password, db=mysql_db,charset='utf8') # 连接数据库编码注意是utf8,不然中文结果输出会乱码
  sql_create = "CREATE TABLE DUMPLINGS (id CHAR(10),order_no CHAR(50),order_title VARCHAR(265),publish_desc VARCHAR(265),game_name VARCHAR(265),"\
         "game_area VARCHAR(265),game_area_distinct VARCHAR(265),order_current VARCHAR(3908),order_content VARCHAR(3908),order_hours CHAR(10)," \
         "order_price FLOAT(10),add_price FLOAT(10),safe_money FLOAT(10),speed_money FLOAT(10),order_status_desc VARCHAR(265),"\
         "order_lock_desc VARCHAR(265),cancel_type_desc VARCHAR(265),kf_status_desc VARCHAR(265),is_show_pwd TINYINT,game_pwd CHAR(50),"\
         "game_account VARCHAR(265),game_actor VARCHAR(265),left_hours VARCHAR(265),created_at VARCHAR(265),account_id CHAR(50),"\
         "mobile VARCHAR(265),mobile2 VARCHAR(265),contact VARCHAR(265),contact2 VARCHAR(265),qq VARCHAR(265),"\
         "PRIMARY KEY (`id`),UNIQUE KEY `no`(`order_no`))ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8"
  sql_key="CREATE UNIQUE INDEX id ON DUMPLINGS(id)"
  cursor = db.cursor()
  cursor.execute("DROP TABLE IF EXISTS DUMPLINGS")
  cursor.execute(sql_create)# 执行SQL语句
  cursor.execute(sql_key)
  db.close() # 关闭数据库连

把数据导入Mysql,注意编码和字段之间的匹配。

def IntoMysql(results):
  mysql_host = ''
  mysql_db = 'zyc'
  mysql_user = 'zyc'
  mysql_password = ''
  mysql_port = 3306
  db = pymysql.connect(host=mysql_host, port=mysql_port, user=mysql_user, password=mysql_password, db=mysql_db,charset='utf8') # 连接数据库编码注意是utf8,不然中文结果输出会乱码
  cursor = db.cursor()
  for j in range(len(results)):
    try:
      sql = "INSERT INTO DUMPLINGS(id,order_no,order_title,publish_desc ,game_name," \
         "game_area,game_area_distinct,order_current,order_content,order_hours," \
         "order_price,add_price,safe_money,speed_money,order_status_desc," \
         "order_lock_desc,cancel_type_desc,kf_status_desc,is_show_pwd,game_pwd," \
         "game_account,game_actor,left_hours,created_at,account_id," \
         "mobile,mobile2,contact,contact2,qq) VALUES ("
      for i in range(len(results[j])):
        sql = sql + "'" + results[j][i] + "',"
      sql = sql[:-1] + ")"
      sql = sql.encode('utf-8')
      cursor.execute(sql)
      db.commit()
    except:pass
  db.close()

每十秒运行一次。

mysql_create()
i=0
while True:
  results = GetResults()
  IntoMysql(results)
  i=i+1
  print("爬虫次数:",i)
  time.sleep(10)

结果如图:

 Python3实现的爬虫爬取数据并存入mysql数据库操作示例

更多关于Python相关内容可查看本站专题:《Python Socket编程技巧总结》、《Python正则表达式用法总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python+MySQL数据库程序设计入门教程》及《Python常见数据库操作技巧汇总》

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

Python 相关文章推荐
python中from module import * 的一个坑
Jul 20 Python
python执行外部程序的常用方法小结
Mar 21 Python
在Python3中使用asyncio库进行快速数据抓取的教程
Apr 02 Python
python实现快速排序的示例(二分法思想)
Mar 12 Python
pandas DataFrame实现几列数据合并成为新的一列方法
Jun 08 Python
Django中使用Celery的方法示例
Nov 29 Python
pycharm的console输入实现换行的方法
Jan 16 Python
Pycharm使用之设置代码字体大小和颜色主题的教程
Jul 12 Python
使用pygame写一个古诗词填空通关游戏
Dec 03 Python
在tensorflow中设置使用某一块GPU、多GPU、CPU的操作
Feb 07 Python
Keras自定义实现带masking的meanpooling层方式
Jun 16 Python
python用700行代码实现http客户端
Jan 14 Python
利用python如何处理百万条数据(适用java新手)
Jun 06 #Python
Python3实现的Mysql数据库操作封装类
Jun 06 #Python
python操作redis方法总结
Jun 06 #Python
目前最全的python的就业方向
Jun 05 #Python
python多进程提取处理大量文本的关键词方法
Jun 05 #Python
使用python进行文本预处理和提取特征的实例
Jun 05 #Python
python 用正则表达式筛选文本信息的实例
Jun 05 #Python
You might like
叫你如何修改Nginx与PHP的文件上传大小限制
2014/09/10 PHP
PHP获取用户访问IP地址的5种方法
2016/05/16 PHP
PHP文件管理之实现网盘及压缩包的功能操作
2017/09/20 PHP
用Greasemonkey 脚本收藏网站会员信息到本地
2009/10/26 Javascript
Jquery选择器 $实现原理
2009/12/02 Javascript
鼠标滚轮控制网页横向移动实现思路
2013/03/22 Javascript
jQuery源码解读之removeClass()方法分析
2015/02/20 Javascript
jquery实现标签支持图文排列带上下箭头按钮的选项卡
2015/03/14 Javascript
简单学习JavaScript中的for语句循环结构
2015/11/10 Javascript
jQuery 特性操作详解及实例代码
2016/09/29 Javascript
js封装成插件的步骤方法
2017/09/11 Javascript
Vue2.0 http请求以及loading展示实例
2018/03/06 Javascript
JS匿名函数内部this指向问题详析
2019/05/10 Javascript
vue中axios实现数据交互与跨域问题
2019/05/12 Javascript
微信小程序页面调用自定义组件内的事件详解
2019/09/12 Javascript
解决removeEventListener 无法清除监听的问题
2020/10/30 Javascript
Vue中强制组件重新渲染的正确方法
2021/01/03 Vue.js
python实现爬虫下载漫画示例
2014/02/16 Python
python通过装饰器检查函数参数数据类型的方法
2015/03/13 Python
用Python实现服务器中只重载被修改的进程的方法
2015/04/30 Python
python用户管理系统
2018/03/13 Python
Python回文字符串及回文数字判定功能示例
2018/03/20 Python
Python如何爬取实时变化的WebSocket数据的方法
2019/03/09 Python
python3的UnicodeDecodeError解决方法
2019/12/20 Python
Keras使用tensorboard显示训练过程的实例
2020/02/15 Python
解决Jupyter Notebook使用parser.parse_args出现错误问题
2020/04/20 Python
Pycharm生成可执行文件.exe的实现方法
2020/06/02 Python
python 基于opencv实现高斯平滑
2020/12/18 Python
Html5实现二维码扫描并解析
2016/01/20 HTML / CSS
韩都衣舍天猫官方旗舰店:天猫女装销售总冠军
2017/10/10 全球购物
纽约州一群才华横溢的金匠制作而成:Hearth Jewelry
2019/03/22 全球购物
北京麒麟网信息技术有限公司网络游戏测试面试题
2013/09/28 面试题
会计专业自我鉴定范文
2013/10/06 职场文书
大学生个人实习的自我评价
2014/02/15 职场文书
普通话宣传标语
2014/06/26 职场文书
2016大一新生入学教育心得体会
2016/01/23 职场文书