本着学习urllib和正则re的原因和无比蛋疼,另外想把淘宝的成交记录全部列出来看看价格的变化
在这个例子中你可以学到
- urllib2 addHeader的使用
- 正则表达式的使用
使用前需要配置一下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()