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命令启动Web服务器实例详解
Feb 23 Python
详解Python odoo中嵌入html简单的分页功能
May 29 Python
浅谈Django中view对数据库的调用方法
Jul 18 Python
详解Python3定时器任务代码
Sep 23 Python
Python进程Multiprocessing模块原理解析
Feb 28 Python
Python3 pywin32模块安装的详细步骤
May 26 Python
如何基于Python爬取隐秘的角落评论
Jul 02 Python
python 图像插值 最近邻、双线性、双三次实例
Jul 05 Python
PyCharm配置anaconda环境的步骤详解
Jul 31 Python
如何用Anaconda搭建虚拟环境并创建Django项目
Aug 02 Python
Python使用cn2an实现中文数字与阿拉伯数字的相互转换
Mar 02 Python
Django程序的优化技巧
Apr 29 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
php 上传功能实例代码
2010/04/13 PHP
php处理斐波那契数列非递归方法
2012/02/04 PHP
ThinkPHP的MVC开发机制实例解析
2014/08/23 PHP
PHP快速生成各种信息提示框的方法
2016/02/03 PHP
TP5框架实现上传多张图片的方法分析
2020/03/29 PHP
符合标准的js表单提交的代码
2007/09/13 Javascript
Javascript 构造函数,公有,私有特权和静态成员定义方法
2009/11/30 Javascript
JavaScript实现表格排序方法
2013/06/14 Javascript
jQuery实现列表自动循环滚动鼠标悬停时停止滚动
2013/09/06 Javascript
jQuery实现仿百度首页滑动伸缩展开的添加服务效果代码
2015/09/09 Javascript
jquery可定制的在线UEditor编辑器
2015/11/17 Javascript
浅谈javascript 函数表达式和函数声明的区别
2016/01/05 Javascript
Angularjs实现mvvm式的选项卡示例代码
2016/09/08 Javascript
详解vue2父组件传递props异步数据到子组件的问题
2017/06/29 Javascript
简单谈谈React中的路由系统
2017/07/25 Javascript
浅谈angular2 组件的生命周期钩子
2017/08/12 Javascript
深入理解React中何时使用箭头函数
2017/08/23 Javascript
windows系统下更新nodejs版本的方案
2017/11/24 NodeJs
Rollup处理并打包JS文件项目实例代码
2018/05/31 Javascript
微信小程序中限制激励式视频广告位显示次数(实现思路)
2019/12/06 Javascript
JS替换字符串中指定位置的字符(多种方法)
2020/05/28 Javascript
解决vue组件销毁之后计时器继续执行的问题
2020/07/21 Javascript
微信小程序实现聊天室
2020/08/21 Javascript
Python BS4库的安装与使用详解
2018/08/08 Python
Python常见排序操作示例【字典、列表、指定元素等】
2018/08/15 Python
Django添加KindEditor富文本编辑器的使用
2018/10/24 Python
Python切片操作去除字符串首尾的空格
2019/04/22 Python
Python3中的最大整数和最大浮点数实例
2019/07/09 Python
django mysql数据库及图片上传接口详解
2019/07/18 Python
HTML5语义化元素你真的用对了吗
2019/08/22 HTML / CSS
万代美国官网:PREMIUM BANDAI USA
2020/09/11 全球购物
《彩色世界》教学反思
2014/04/12 职场文书
甲乙双方合作协议书
2014/10/13 职场文书
浅谈Vue的computed计算属性
2022/03/21 Vue.js
Vue3中toRef与toRefs的区别
2022/03/24 Vue.js
MySQL分区路径子分区再分区
2022/04/13 MySQL