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使用mysqldb连接数据库操作方法示例详解
Dec 03 Python
Python开发实例分享bt种子爬虫程序和种子解析
May 21 Python
Python中的模块和包概念介绍
Apr 13 Python
python判断计算机是否有网络连接的实例
Dec 15 Python
解决Python 命令行执行脚本时,提示导入的包找不到的问题
Jan 19 Python
三步实现Django Paginator分页的方法
Jun 11 Python
python操作openpyxl导出Excel 设置单元格格式及合并处理代码实例
Aug 27 Python
FFT快速傅里叶变换的python实现过程解析
Oct 21 Python
python实现用户名密码校验
Mar 18 Python
python logging通过json文件配置的步骤
Apr 27 Python
django admin 根据choice字段选择的不同来显示不同的页面方式
May 13 Python
详解使用python爬取抖音app视频(appium可以操控手机)
Jan 26 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的基本常识小结
2013/07/05 PHP
Ubuntu上安装yaf扩展的方法
2018/01/29 PHP
PHP简单实现解析xml为数组的方法
2018/05/02 PHP
Laravel的Auth验证Token验证使用自定义Redis的例子
2019/09/30 PHP
基于json的jquery地区联动效果代码
2011/07/06 Javascript
js+css实现超简洁的二级下拉菜单效果代码
2015/09/07 Javascript
jQuery使用$.each遍历json数组的简单实现方法
2016/04/18 Javascript
BootStrap智能表单实战系列(十一)级联下拉的支持
2016/06/13 Javascript
jQuery 3.0十大新特性
2016/07/06 Javascript
简单好用的nodejs 爬虫框架分享
2017/03/26 NodeJs
jquery实现回车键触发事件(实例讲解)
2017/11/21 jQuery
Vue 中的受控与非受控组件的实现
2018/12/17 Javascript
three.js实现炫酷的全景3D重力感应
2018/12/30 Javascript
使用vue for时为什么要key【推荐】
2019/07/11 Javascript
细述Javascript的加法运算符的具体使用
2019/10/18 Javascript
vue项目中使用vue-layer弹框插件的方法
2020/03/11 Javascript
使用node-media-server搭建一个简易的流媒体服务器
2021/01/20 Javascript
[01:13:46]iG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[01:03:42]VP vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python脚本实现下载合并SAE日志
2015/02/10 Python
python中解析json格式文件的方法示例
2017/05/03 Python
python读写csv文件方法详细总结
2019/07/05 Python
详解如何从TensorFlow的mnist数据集导出手写体数字图片
2019/08/05 Python
python 爬取古诗文存入mysql数据库的方法
2020/01/08 Python
python爬虫使用正则爬取网站的实现
2020/08/03 Python
Python+OpenCV图像处理——实现轮廓发现
2020/10/23 Python
python3中calendar返回某一时间点实例讲解
2020/11/18 Python
HTML5进度条特效
2014/12/18 HTML / CSS
浅谈html5 响应式布局
2014/12/24 HTML / CSS
New Balance波兰官方商城:始于1906年,百年慢跑品牌
2017/08/15 全球购物
欧洲最大的滑雪假期供应商之一:Sunweb Holidays
2018/01/06 全球购物
英国IT硬件供应商,定制游戏PC:Mesh Computers
2019/03/28 全球购物
预备党员入党自我评价范文
2014/03/10 职场文书
授权委托书公证
2014/09/14 职场文书
2014财务部年度工作总结
2014/12/08 职场文书
七年级上册语文教学计划
2015/01/22 职场文书