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中__new__与__init__方法的区别详解
May 04 Python
python 排序算法总结及实例详解
Sep 28 Python
Python爬取附近餐馆信息代码示例
Dec 09 Python
python opencv 直方图反向投影的方法
Feb 24 Python
Python实现将数据框数据写入mongodb及mysql数据库的方法
Apr 02 Python
Python创建普通菜单示例【基于win32ui模块】
May 09 Python
python三方库之requests的快速上手
Mar 04 Python
python GUI库图形界面开发之PyQt5单行文本框控件QLineEdit详细使用方法与实例
Feb 27 Python
Tensorflow中的dropout的使用方法
Mar 13 Python
Java ExcutorService优雅关闭方式解析
May 30 Python
Django --Xadmin 判断登录者身份实例
Jul 03 Python
python处理写入数据代码讲解
Oct 22 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中用数组的方法设置cookies
2011/04/21 PHP
php更新修改excel中的内容实例代码
2014/02/26 PHP
php+memcache实现的网站在线人数统计代码
2014/07/04 PHP
使用PHP Socket 编程模拟Http post和get请求
2014/11/25 PHP
php使用cookie实现记住用户名和密码实现代码
2015/04/27 PHP
PHP5.6.8连接SQL Server 2008 R2数据库常用技巧分析总结
2019/05/06 PHP
使用 PHP Masked Package 屏蔽敏感数据的实现方法
2019/10/15 PHP
javascript编程起步(第二课)
2007/01/10 Javascript
身份证号码前六位所代表的省,市,区, 以及地区编码下载
2007/04/12 Javascript
jQuery 可以拖动的div实现代码 脚本之家修正版
2009/06/26 Javascript
node.js中的fs.fstat方法使用说明
2014/12/15 Javascript
VS2008中使用JavaScript调用WebServices
2014/12/18 Javascript
javascript引用类型之时间Date和数组Array
2015/08/27 Javascript
JavaScript实现的背景自动变色代码
2015/10/17 Javascript
浅谈JavaScript对象与继承
2016/07/10 Javascript
bootstrap基础知识学习笔记
2016/11/02 Javascript
Angular页面间切换及传值的4种方法
2016/11/04 Javascript
vue.js内部自定义指令与全局自定义指令的实现详解(利用directive)
2017/07/11 Javascript
AngularJS中filter的使用实例详解
2017/08/25 Javascript
jQuery EasyUI结合zTree树形结构制作web页面
2017/09/01 jQuery
原生JS实现前端本地文件上传
2018/09/08 Javascript
基于Vue2实现简易的省市区县三级联动组件效果
2018/11/05 Javascript
Nodejs中使用puppeteer控制浏览器中视频播放功能
2019/08/26 NodeJs
JavaScript实现串行请求的示例代码
2020/09/14 Javascript
Python中用memcached来减少数据库查询次数的教程
2015/04/07 Python
python获取本地计算机名字的方法
2015/04/29 Python
详细解析Python中的变量的数据类型
2015/05/13 Python
python-OpenCV 实现将数组转换成灰度图和彩图
2020/01/09 Python
基于python实现检索标记敏感词并输出
2020/05/07 Python
美国高级音响品牌:Master&Dynamic
2018/07/05 全球购物
Fanatics官网:运动服装、球衣、运动装备
2020/10/12 全球购物
学生思想表现的评语
2014/01/30 职场文书
促销活动计划书
2014/05/02 职场文书
工作报告范文
2019/06/20 职场文书
Python+Selenium实现抖音、快手、B站、小红书、微视、百度好看视频、西瓜视频、微信视频号、搜狐视频、一点号、大风号、趣头条等短视频自动发布
2022/04/13 Python
图神经网络GNN算法
2022/05/11 Python