Python中文社区python进阶Python专辑

Python获取淘宝商品相关信息

2017-08-05  本文已影响787人  Mo丶染洛凉

更多教程请移步至:洛凉博客

求助请移步至:Python自学技术交流

我感觉自己有个缺点挺不好的。不爱做笔记和总结。
自从工作之后发现不会做总结是多么没有优势。
例如:写个项目总结、工作总结、年中,年终总结。
不百度或者谷歌下发现很难写出点像样的总结报告。


我希望自己能好好改掉这个缺点。以后对自己的所做所学加以记录,方便以后查阅或温习。

昨天一直在看中国大学MOOC大学,北京理工大学,嵩教授主讲的:Python网络爬虫与信息提取。
(这里多说一句【并非打广告】,嵩教授讲的确实不错,思路和代码书写都很谨慎,每次都会强调代码的稳定性,有爬虫意向的朋友可以看看)


昨晚看的主要内容为定向获取某类商品的价格,标题。
看完后自己按照思路敲了一遍。额外多获取了一个商品属性。
这个淘宝搜索后的商品信息好像是以JSON的形式存储在源码里面。
PS:目前为止我好想还没搞明白JSON和AJAX有没有联系。(以后对这方面知识进行补充)


敲完代码运行后好像不成功。
自己找了下原因,我查找的商品类型和嵩教授示例代码里的商品类型不一致。
由于是通过正则进行匹配的数据。(如需获取还需改下正则表达式)
导致数据存储对应的键不一致。下面大家可以看下区别。

电脑价格.png
书包价格.png
其实如果用嵩教授的商品进行获取,可以获取到更多的商品信息。
例如商品的ID,其实获取到了ID就可以进行商品链接拼接。
这张截图是通过URL链接里的ID在页面源码找的到。
然后可以拼接成:天猫店铺:https://detail.tmall.com/item.htm?id=42252465037,淘宝店铺:https://item.taobao.com/item.htm?id=537105758663的方式进行获取商品链接。
有兴趣的可以尝试下获取更多商品信息。
image.png
好了,其实爬虫需要的是思路,思路清晰,代码就好写了。
我写的可以查找数码这一类商品,例如,某品牌电脑,键盘,鼠标,手机
如果失败大家可以看下源码里面价格和商品名称对应的数据,相应修改后就能正常。
下面直接贴我看完后以老师的思路进行编写的代码。
import requests
import re


def geturl(page,key):
    '''获取搜索商品后的页面源码'''

    data = {
        'q':key,
        's':page*44
    }
    url = 'https://s.taobao.com/search?'
    try:
        html = requests.get(url,params=data)
        html.raise_for_status()
    except:
        print('-----初始链接获取失败-----')

    return html.text


def gethtml(html):
    '''匹配源码里需要的数据'''

    try:
        goods = []
        #商品标题,价格,付款人数正则表达式
        pat1 = r'\"price\":\"\d{1,5}\"'
        pat2 = r'\"title\":\".*?\"'
        pat3 = r'\"month_sales\":\"\d{1,9}\"'
    
        prices = re.findall(pat1,html)
        titles = re.findall(pat2,html)
        sales = re.findall(pat3,html)

        for i in range(len(titles)):
            #eval去掉字符串两边双引号,以分好切片获取后面要的信息
            price = eval(prices[i].split(':')[1])
            title = eval(titles[i].split(':')[1])
            sale = eval(sales[i].split(':')[1])
            #将每个商品的价格,标题,付款人数以表格形式存入到一个空列表
            goods.append([title,sale,price])
    except:
        print('-----信息获取失败-----')

    return goods


def printinfo(slist):
    '''打印获取到的商品信息'''
    #format打印格式
    law = '{:^4}\t{:^8}\t{:^8}\t{:^16}'
    print(law.format('序号','商品价格','已付款人数','商品名称'))
    num = 0 #初始化序号
    for x in slist:
        num+=1
        print(law.format(num,x[2],x[1],x[0]))


def main():
    '''程序运行入口'''
    pages = int(input('请输入要查询的页数:'))
    good_name = input('请输入需要查找的商品类型:')
    for page in range(pages):
        try:
            html = geturl(page,good_name)
            slist = gethtml(html)
            printinfo(slist)
        except:
            print('-----程序运行出错-----')


if __name__ == '__main__':
    main()

运行后打印效果.png

下面我也把嵩老师代码贴一下,大家不要直接复制运行。会报错。
要试的自己按照代码敲一遍。

import requests
import re
def getHTMLText(url):
    try:
        r = requests.get(url, timeout=30)         
        r.raise_for_status()         
        r.encoding = r.apparent_encoding         
        return r.text     
    except:         
        return ""      

def parsePage(ilt, html):     
    try:         
        plt = re.findall(r'\"view_price\"\:\"[\d\.]*\"',html)        
        tlt = re.findall(r'\"raw_title\"\:\".*?\"',html)         
        for i in range(len(plt)):             
            price = eval(plt[i].split(':')[1])             
            title = eval(tlt[i].split(':')[1])             
            ilt.append([price , title])     
        except:         print("") 

def printGoodsList(ilt):     
    tplt = "{:4}\t{:8}\t{:16}"     
    print(tplt.format("序号", "价格", "商品名称"))     
    count = 0     
    for g in ilt:         
        count = count + 1         
        print(tplt.format(count, g[0], g[1]))          

def main():     
    goods = '书包'     
    depth = 3     
    start_url = 'https://s.taobao.com/search?q=' + goods     
    infoList = []     
    for i in range(depth):         
        try:             
            url = start_url + '&s=' + str(44*i)             
            html = getHTMLText(url)             
            parsePage(infoList, html)         
        except:             
            continue     
            printGoodsList(infoList)      

main()
上一篇下一篇

猜你喜欢

热点阅读