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 相关文章推荐
Go语言基于Socket编写服务器端与客户端通信的实例
Feb 19 Python
浅谈python中的getattr函数 hasattr函数
Jun 14 Python
Python 专题三 字符串的基础知识
Mar 19 Python
Python使用当前时间、随机数产生一个唯一数字的方法
Sep 18 Python
Python将8位的图片转为24位的图片实现方法
Oct 24 Python
python 处理telnet返回的More,以及get想要的那个参数方法
Feb 14 Python
PyTorch: 梯度下降及反向传播的实例详解
Aug 20 Python
使用python远程操作linux过程解析
Dec 04 Python
Python实现Keras搭建神经网络训练分类模型教程
Jun 12 Python
浅谈numpy中函数resize与reshape,ravel与flatten的区别
Jun 18 Python
python机器学习实现oneR算法(以鸢尾data为例)
Mar 03 Python
全网非常详细的pytest配置文件
Jul 15 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
使用Sphinx对索引进行搜索
2013/06/25 PHP
php 删除目录下N分钟前创建的所有文件的实现代码
2013/08/10 PHP
PHP错误Warning:mysql_query()解决方法
2015/10/24 PHP
PHP实现发送邮件的方法(基于简单邮件发送类)
2015/12/17 PHP
深入浅析php中sprintf与printf函数的用法及区别
2016/01/08 PHP
利用PHPStorm如何开发Laravel应用详解
2017/08/30 PHP
PHP获取远程http或ftp文件的md5值的方法
2019/04/15 PHP
jQuery插件 selectToSelect使用方法
2013/10/02 Javascript
javascript实现网页屏蔽Backspace事件,输入框不屏蔽
2015/07/21 Javascript
javaScript实现可缩放的显示区效果代码
2015/10/26 Javascript
关于JS中的方法是否加括号的问题
2016/07/27 Javascript
Javascript 实现简单计算器实例代码
2016/10/23 Javascript
浅析如何利用JavaScript进行语音识别
2016/10/27 Javascript
jQuery源码解读之extend()与工具方法、实例方法详解
2017/03/30 jQuery
快速将Vue项目升级到webpack3的方法步骤
2017/09/14 Javascript
vue2.0 子组件改变props值,并向父组件传值的方法
2018/03/01 Javascript
angularjs 动态从后台获取下拉框的值方法
2018/08/13 Javascript
Vue数据双向绑定的深入探究
2018/11/27 Javascript
分享一个vue项目“脚手架”项目的实现步骤
2019/05/26 Javascript
微信小程序实现Swiper轮播图效果
2019/11/22 Javascript
js+canvas实现刮刮奖功能
2020/09/13 Javascript
python实现查询苹果手机维修进度
2015/03/16 Python
python执行外部程序的常用方法小结
2015/03/21 Python
python抽象基类用法实例分析
2015/06/04 Python
python编码最佳实践之总结
2016/02/14 Python
python分割列表(list)的方法示例
2017/05/07 Python
python实现简单tftp(基于udp协议)
2018/07/30 Python
PyQt5响应回车事件的方法
2019/06/25 Python
jupyter notebook 恢复误删单元格或者历史代码的实现
2020/04/17 Python
Python实现爬取并分析电商评论
2020/06/19 Python
Python Celery异步任务队列使用方法解析
2020/08/10 Python
Cole Haan官方网站:美国时尚潮流品牌
2017/12/06 全球购物
2014年高中生自我评价范文
2014/09/26 职场文书
开会通知
2015/04/20 职场文书
调解书格式范本
2015/05/20 职场文书
小学少先队工作总结2015
2015/05/26 职场文书