[花果山水帘洞] 从什么值得买发现频道获取指定商品信息列表

没有rss自己造

从什么值得买发现频道获取指定商品信息列表

2016-12-13 / vc12345679

结合实际应用学 python 更有效果。

# 说明:这是一个从 什么值得买 发现频道 上获取指定商品信息列表的脚本
# 作者:vc12345679 (chensiwei1990@gmail.com)
# 版本:20161213

import requests
import urllib.request
import bs4
import yaml
import datetime


# 从文件读取监控商品列表
# 文件名:  mon_list
# 文件内容:每行一个商品,如
# 商品A
# 商品B
# ...
def get_mon_list():
    with open("mon_list") as monlst:
        return monlst.readlines()


# 获取发现频道中某一款商品的列表
# 注:默认保留7天内发布的商品发现信息,如有需要,可在调用时自行修改参数
def gen_url(w, filter_day_count = 7):
    headers = {'content-type': 'application/json',
                       'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0'}
    r = requests.get("http://search.smzdm.com/?c=faxian&s="+urllib.request.quote(w.strip()),headers=headers)
    if r.status_code == 200:
        b = bs4.BeautifulSoup(r.text,"html.parser").find(id="feed-main-list").find_all("div",{"class":"z-feed-content"})
        itms = []
        for c in b:
            d = {}
            datetmp = c.find('span',{'class':'feed-block-extras'}).text.split()
            if len(datetmp) == 3:
                d['date'] = datetime.datetime.now().strftime('%Y-')+datetmp[0]
            else:
                d['date'] = datetmp[0]
            f = d['date'].split('-')
            g = datetime.datetime(int(f[0]),int(f[1]),int(f[2]))
            if (datetime.datetime.now()-g).days > filter_day_count:
                return itms
            else:
                d['shop']=datetmp[-1]
                d['title'] = ' '.join(c.find("h5",{'class':'feed-block-title'}).text.replace('\n','').split())
                d['url'] = c.find('a',{'class':'feed-nowrap'})['href']
                itms.append(d)
        return itms
    else:
        return []


# 获取的满足条件的信息,被保存至 result.txt
# 信息以 yaml 格式存储
if __name__ == "__main__":
    mon_list = get_mon_list()
    with open('result.txt','w') as otpf:
        otpc = {}
        for word in mon_list:
            word = word.strip()
            otpc[word] = gen_url(word)
        yaml.dump(otpc, otpf, indent=4, encoding='utf-8', allow_unicode=True)