Python遍历淘宝成交记录

本着学习urllib和正则re的原因和无比蛋疼,另外想把淘宝的成交记录全部列出来看看价格的变化
在这个例子中你可以学到

  1. urllib2 addHeader的使用
  2. 正则表达式的使用 使用前需要配置一下url变量,淘宝物品的成交记录下一页的链接,请复制链接,把最后一个页数的数字删掉,放在url变量里
    因为里面太多参数了,没办法只改变某些变量 结果会保存在c:\log.txt文件内。

以下是代码

#-*- encoding: gbk -*-
'''
Created on 2011-5-8

@author: fatkun
'''
import urllib2
import re
import time
import string

#读取网页
def read(url):
    opener = urllib2.build_opener()
    #opener.handle_open["http"][0].set_http_debuglevel(1)
    opener.addheaders = [('User-agent', 'Mozilla/5.0')]
    f= opener.open(url)
    content = f.read()
    return content

#正则表达式返回需要的内容
def display(content):
    pattern = re.compile(r"""<tr(?:[^>]+)?> #TR
                        [\S\s]*?<td[\S\s]*?</td>[\S\s]*?<td(?:[^>]+)?> #Second TD
                        [\S\s]*?<a [^>]+>([\S\s]*?)</a> # 链接
                        [\S\s]*?<br/>\s+((?:[\S]+[ ]?)+)\s+</td> # 物品名称
                        [\S\s]*?<em>(\d+)</em> # 价格
                        [\S\s]*?<td>[\S\s]*?</td> # TD
                        [\S\s]*?<td>([\S\s]*?)</td> # 日期
                        [\S\s]*?</tr> #Last TR
                        """, flags=re.MULTILINE|re.IGNORECASE|re.VERBOSE)

    matchs = re.findall(pattern, content )
    str = ''
    for match in matchs:
        str += string.ljust(match[2].strip(), 7) + string.ljust(match[3][:11], 15) + match[1].strip()
        str += '\n'
    return str

filepath = 'c:\\log.txt'
open(filepath, 'w').close()
lastpage = 150
#淘宝物品的成交记录下一页的链接,请复制链接,把最后一个页数的数字删掉,放在url变量里
url = 'http://tbskip.taobao.com/json/show_buyer_list.htm?is_offline=&page_size=15&is_start=false&item_type=b&ends=1305101478000&starts=1304496678000&item_id=8689953932&user_tag=475363344&old_quantity=1187&sold_total_num=365&closed=false&seller_num_id=69211806&zhichong=true&bidPage='
for i in range(1, lastpage + 1):
    fullurl = url + '%d' % (i,)
    #不出错运行后设为False
    runfail = True
    #重试次数
    retry = 2
    print fullurl

    try:
        logfile = open(filepath, 'a')

        while (runfail and retry >= 0):
            try:
                content = read(fullurl)
                str = display(content)
                logfile.write(str)

                runfail = False
            except:
                print '*' * 100
                print 'error'
                print '*' * 100
                retry = retry - 1
                time.sleep(5)
                if (retry == 0):time.sleep(10) #最后一次尝试等10秒

        logfile.flush()
    except:
        print 'write file fail!'
    finally:
        logfile.close()
updatedupdated2023-12-062023-12-06