python实现爬取千万淘宝商品的方法


Posted in Python onJune 30, 2015

本文实例讲述了python实现爬取千万淘宝商品的方法。分享给大家供大家参考。具体实现方法如下:

import time
import leveldb
from urllib.parse import quote_plus 
import re
import json
import itertools
import sys
import requests
from queue import Queue
from threading import Thread
URL_BASE = 'http://s.m.taobao.com/search?q={}&n=200&m=api4h5&style=list&page={}'
def url_get(url):
  # print('GET ' + url)
  header = dict()
  header['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
  header['Accept-Encoding'] = 'gzip,deflate,sdch'
  header['Accept-Language'] = 'en-US,en;q=0.8'
  header['Connection'] = 'keep-alive'
  header['DNT'] = '1'
  #header['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.71 Safari/537.36'
  header['User-Agent'] = 'Mozilla/12.0 (compatible; MSIE 8.0; Windows NT)'
  return requests.get(url, timeout = 5, headers = header).text
def item_thread(cate_queue, db_cate, db_item):
  while True:
    try:
      cate = cate_queue.get()
      post_exist = True
      try:
        state = db_cate.Get(cate.encode('utf-8'))
        if state != b'OK': post_exist = False
      except:
        post_exist = False
      if post_exist == True:
        print('cate-{}: {} already exists ... Ignore'.format(cate, title))
        continue
      db_cate.Put(cate.encode('utf-8'), b'crawling')
      for item_page in itertools.count(1):
        url = URL_BASE.format(quote_plus(cate), item_page)
        for tr in range(5):
          try:
            items_obj = json.loads(url_get(url))
            break
          except KeyboardInterrupt:
            quit()
          except Exception as e:
            if tr == 4: raise e
        if len(items_obj['listItem']) == 0: break
        for item in items_obj['listItem']:
          item_obj = dict(
            _id = int(item['itemNumId']),
            name = item['name'],
            price = float(item['price']),
            query = cate,
            category = int(item['category']) if item['category'] != '' else 0,
            nick = item['nick'],
            area = item['area'])
          db_item.Put(str(item_obj['_id']).encode('utf-8'),
                json.dumps(item_obj, ensure_ascii = False).encode('utf-8'))
        print('Get {} items from {}: {}'.format(len(items_obj['listItem']), cate, item_page))
        if 'nav' in items_obj:
          for na in items_obj['nav']['navCatList']:
            try:
              db_cate.Get(na['name'].encode('utf-8'))
            except:
              db_cate.Put(na['name'].encode('utf-8'), b'waiting')
      db_cate.Put(cate.encode('utf-8'), b'OK')
      print(cate, 'OK')
    except KeyboardInterrupt:
      break
    except Exception as e:
      print('An {} exception occured'.format(e))
def cate_thread(cate_queue, db_cate):
  while True:
    try:
      for key, value in db_cate.RangeIter():
        if value != b'OK':
          print('CateThread: put {} into queue'.format(key.decode('utf-8')))
          cate_queue.put(key.decode('utf-8'))
      time.sleep(10)
    except KeyboardInterrupt:
      break
    except Exception as e:
      print('CateThread: {}'.format(e))
if __name__ == '__main__':
  db_cate = leveldb.LevelDB('./taobao-cate')
  db_item = leveldb.LevelDB('./taobao-item')
  orig_cate = '正装'
  try:
    db_cate.Get(orig_cate.encode('utf-8'))
  except:
    db_cate.Put(orig_cate.encode('utf-8'), b'waiting')
  cate_queue = Queue(maxsize = 1000)
  cate_th = Thread(target = cate_thread, args = (cate_queue, db_cate))
  cate_th.start()
  item_th = [Thread(target = item_thread, args = (cate_queue, db_cate, db_item)) for _ in range(5)]
  for item_t in item_th:
    item_t.start()
  cate_th.join()

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

Python 相关文章推荐
Python函数返回值实例分析
Jun 08 Python
使用Python的Flask框架表单插件Flask-WTF实现Web登录验证
Jul 12 Python
利用Python自动监控网站并发送邮件告警的方法
Aug 24 Python
Python iter()函数用法实例分析
Mar 17 Python
Python numpy 提取矩阵的某一行或某一列的实例
Apr 03 Python
Python基于Floyd算法求解最短路径距离问题实例详解
May 16 Python
python 用lambda函数替换for循环的方法
Jun 09 Python
Python3 chardet模块查看编码格式的例子
Aug 14 Python
PyTorch 普通卷积和空洞卷积实例
Jan 07 Python
Python递归调用实现数字累加的代码
Feb 25 Python
Python 通过监听端口实现唯一脚本运行方式
May 05 Python
实例讲解Python中sys.argv[]的用法
Jun 03 Python
python简单判断序列是否为空的方法
Jun 30 #Python
python检查序列seq是否含有aset中项的方法
Jun 30 #Python
python判断一个集合是否包含了另外一个集合中所有项的方法
Jun 30 #Python
python过滤字符串中不属于指定集合中字符的类实例
Jun 30 #Python
python获得文件创建时间和修改时间的方法
Jun 30 #Python
python读写ini配置文件方法实例分析
Jun 30 #Python
python清除指定目录内所有文件中script的方法
Jun 30 #Python
You might like
全国FM电台频率大全 - 24 贵州省
2020/03/11 无线电
PHP面向对象编程快速入门
2006/12/14 PHP
PHP下载远程图片并保存到本地方法总结
2016/01/22 PHP
PHP面向对象程序设计之对象生成方法详解
2016/12/02 PHP
运用jquery实现table单双行不同显示并能单行选中
2009/07/25 Javascript
自制基于jQuery的智能提示插件一枚
2011/02/18 Javascript
读jQuery之七 判断点击了鼠标哪个键的代码
2011/06/21 Javascript
在jQuery ajax中按钮button和submit的区别分析
2012/10/07 Javascript
JavaScript实现GriwView单列全选(自写代码)
2013/05/13 Javascript
使用javascript获取页面名称
2014/12/23 Javascript
Jquery解析json字符串及json数组的方法
2015/05/29 Javascript
jQuery实现类似标签风格的导航菜单效果代码
2015/08/25 Javascript
学习JavaScript设计模式之中介者模式
2016/01/14 Javascript
纯js三维数组实现三级联动效果
2017/02/07 Javascript
jQuery实现碰到边缘反弹的动画效果
2018/02/24 jQuery
vue项目中jsonp跨域获取qq音乐首页推荐问题
2018/05/30 Javascript
JS实现灯泡开关特效
2020/03/30 Javascript
vue请求服务器数据后绑定不上的解决方法
2019/10/30 Javascript
[03:37]2015国际邀请赛第四日现场精彩集锦
2015/08/08 DOTA
python读取TXT到数组及列表去重后按原来顺序排序的方法
2015/06/26 Python
Python cx_freeze打包工具处理问题思路及解决办法
2016/02/13 Python
python实现随机漫步算法
2018/08/27 Python
python调用百度REST API实现语音识别
2018/08/30 Python
python使用 cx_Oracle 模块进行查询操作示例
2019/11/28 Python
Python数据存储之 h5py详解
2019/12/26 Python
python中strip(),lstrip(),rstrip()函数的使用讲解
2020/11/17 Python
商务主管岗位职责
2013/12/08 职场文书
海南地接欢迎词
2014/01/14 职场文书
主要领导对照检查材料
2014/08/26 职场文书
党的群众路线教育实践活动对照检查材料
2014/09/22 职场文书
幼儿园小班教师个人工作总结
2015/02/06 职场文书
加入学生会自荐书
2015/03/05 职场文书
刑事上诉状(量刑过重)
2015/05/23 职场文书
物业公司管理制度
2015/08/05 职场文书
文明礼仪主题班会
2015/08/13 职场文书
实习报告范文
2019/07/30 职场文书