本着学习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() |