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简单实现刷新智联简历
Mar 30 Python
简单谈谈Python中的元祖(Tuple)和字典(Dict)
Apr 21 Python
Python拼接微信好友头像大图的实现方法
Aug 01 Python
详解Python requests 超时和重试的方法
Dec 18 Python
python分数表示方式和写法
Jun 26 Python
使用虚拟环境打包python为exe 文件的方法
Aug 29 Python
springboot配置文件抽离 git管理统 配置中心详解
Sep 02 Python
Python网络编程之使用TCP方式传输文件操作示例
Nov 01 Python
解决Tensorflow 使用时cpu编译不支持警告的问题
Feb 03 Python
详解Django关于StreamingHttpResponse与FileResponse文件下载的最优方法
Jan 07 Python
python pyg2plot的原理知识点总结
Feb 28 Python
Django开发RESTful API实现增删改查(入门级)
May 10 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生成EXCEL的东东
2006/10/09 PHP
解析php中array_merge与array+array的区别
2013/06/21 PHP
解析file_get_contents模仿浏览器头(user_agent)获取数据
2013/06/27 PHP
PHP借助phpmailer发送邮件
2015/05/11 PHP
redirect_uri参数错误的解决方法(必看)
2017/02/16 PHP
javascript showModalDialog模态对话框使用说明
2009/12/31 Javascript
JSONP 跨域共享信息
2012/08/16 Javascript
Json序列化和反序列化方法解析
2013/12/19 Javascript
jquery中的ajax方法怎样通过JSONP进行远程调用
2014/05/04 Javascript
基于OL2实现百度地图ABCD marker的效果
2015/10/01 Javascript
Node.js重新刷新session过期时间的方法
2016/02/04 Javascript
详解nodejs 文本操作模块-fs模块(四)
2016/12/22 NodeJs
vue如何集成raphael.js中国地图的方法示例
2017/08/15 Javascript
js实现购物车功能
2018/06/12 Javascript
Puppeteer 爬取动态生成的网页实战
2018/11/14 Javascript
微信小程序五子棋游戏AI实现方法【附demo源码下载】
2019/02/20 Javascript
利用es6 new.target来对模拟抽象类的方法
2019/05/10 Javascript
WebStorm无法正确识别Vue3组合式API的解决方案
2021/02/18 Vue.js
跟老齐学Python之编写类之一创建实例
2014/10/11 Python
python opencv之SURF算法示例
2018/02/24 Python
Python实现扣除个人税后的工资计算器示例
2018/03/26 Python
Windows下将Python文件打包成.EXE可执行文件的方法
2018/08/03 Python
python pandas 时间日期的处理实现
2019/07/30 Python
Python PyInstaller库基本使用方法分析
2019/12/12 Python
python 的numpy库中的mean()函数用法介绍
2020/03/03 Python
python百行代码自制电脑端网速悬浮窗的实现
2020/05/12 Python
Django在Model保存前记录日志实例
2020/05/14 Python
关于Python 解决Python3.9 pandas.read_excel(‘xxx.xlsx‘)报错的问题
2020/11/28 Python
机电专业个人自荐信格式模板
2013/09/23 职场文书
初中同学聚会感言
2014/02/11 职场文书
《傅雷家书》教学反思
2014/04/20 职场文书
员工安全生产承诺书
2014/05/22 职场文书
2014年社区国庆节活动方案
2014/09/16 职场文书
面试通知单大全
2015/04/20 职场文书
vue项目两种方式实现竖向表格的思路分析
2021/04/28 Vue.js
使用Python获取字典键对应值的方法
2022/04/26 Python