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 fileinput模块使用实例
May 28 Python
python读取TXT到数组及列表去重后按原来顺序排序的方法
Jun 26 Python
Python实现周期性抓取网页内容的方法
Nov 04 Python
Python处理JSON数据并生成条形图
Aug 05 Python
Python实现抓取网页生成Excel文件的方法示例
Aug 05 Python
python利用urllib实现爬取京东网站商品图片的爬虫实例
Aug 24 Python
python使用zip将list转为json的方法
Dec 31 Python
在django view中给form传入参数的例子
Jul 19 Python
如何利用Python识别图片中的文字
May 31 Python
Python3实现英文字母转换哥特式字体实例代码
Sep 01 Python
Python grpc超时机制代码示例
Sep 14 Python
Python实现图片指定位置加图片水印(附Pyinstaller打包exe)
Mar 04 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 mysql 判断update之后是否更新了的方法
2012/01/10 PHP
PHP静态文件生成类实例
2014/11/29 PHP
9个比较实用的php代码片段
2016/03/15 PHP
offsetParent 算法分析
2010/04/05 Javascript
web网页按比例显示图片实现原理及js代码
2013/08/09 Javascript
jQuery获取iframe的document对象的方法
2014/10/10 Javascript
JS实现超过长度限制后自动跳转下一款文本框的方法
2015/02/23 Javascript
JS实现进入页面时渐变背景色的方法
2015/02/25 Javascript
JS实现的通用表单验证插件完整实例
2015/08/20 Javascript
JS插件clipboard.js实现一键复制粘贴功能
2020/12/04 Javascript
vue.js与后台数据交互的实例讲解
2018/08/08 Javascript
详解Angular6 热加载配置方案
2018/08/18 Javascript
AngularJS 多指令Scope问题的解决
2018/10/25 Javascript
详解微信UnionID作用
2019/05/15 Javascript
详解JavaScript的this指向和绑定
2020/09/08 Javascript
[06:07]DOTA2-DPC中国联赛 正赛 Ehome vs VG 选手采访
2021/03/11 DOTA
python简单程序读取串口信息的方法
2015/03/13 Python
使用Python中的tkinter模块作图的方法
2017/02/07 Python
Python之多线程爬虫抓取网页图片的示例代码
2018/01/10 Python
小白入门篇使用Python搭建点击率预估模型
2018/10/12 Python
python字典值排序并取出前n个key值的方法
2018/10/17 Python
Python基于opencv实现的简单画板功能示例
2019/03/04 Python
使用Python正则表达式操作文本数据的方法
2019/05/14 Python
django 多对多表的创建和插入代码实现
2019/09/09 Python
Python 实现敏感目录扫描的示例代码
2020/05/21 Python
Python爬取12306车次信息代码详解
2020/08/12 Python
python爬虫 requests-html的使用
2020/11/30 Python
美国知名的网上鞋类及相关服装零售商:Shoes.com
2017/05/06 全球购物
波兰在线香水店:Perfumy.pl
2019/08/12 全球购物
.NET remoting中对象激活的两种方式
2015/06/08 面试题
档案接收函范文
2014/01/10 职场文书
趣味活动策划方案
2014/02/08 职场文书
任命书怎么写
2014/06/04 职场文书
2014年机关后勤工作总结
2014/12/16 职场文书
VS2019连接MySQL数据库的过程及常见问题总结
2021/11/27 MySQL
springmvc直接不经过controller访问WEB-INF中的页面问题
2022/02/24 Java/Android