Python获取淘宝商品相关信息

作者: Mo丶染洛凉 | 来源:发表于2017-08-05 20:32 被阅读787次

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

    求助请移步至: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()
    

    相关文章

      网友评论

      • 79e2706bbfe7:我在写怕图片的时候,一组里大概有10多张,结果有时候能全部拿到,有时候只能爬去到一张不知道是什么原因,请教
        79e2706bbfe7:@Mo丶染洛凉 520图.com,就是先找到一组里的所有图片连接,存到list里,最后在爬取
        Mo丶染洛凉:什么网站,怎么拿的图片链接
      • 老北京roy:你好,想问下为什么代码运行之后前三个商品的信息无误,第四个商品的信息和淘宝网页的第四个商品不匹配,之后显示的数据也不一样了,想问下是什么情况?
        Mo丶染洛凉:@老北京roy 我看到你了。我是皮皮哥:blush:
        老北京roy:@Mo丶染洛凉 大神,我已经进群,并问了这个问题,你可以指导一下吗,会不会是正则表达式的问题,谢谢。
        Mo丶染洛凉:@老北京roy 没看明白?进群问吧!欢迎加入Python自学技术交流,群号码:368639036。
      • Jaybin_6159:我填入了 2 戴尔笔记本 ; 但是打印不出你截图的信息
        Mo丶染洛凉:@Jaybin_6159 我刚运行了,没问题。你自己模块缺失了吧
        Mo丶染洛凉:@Jaybin_6159 要用的模块你都安装了吗?
        Mo丶染洛凉:@Jaybin_6159 不会吧,有空我看看
      • Jaybin_6159:好像你的代码也有错误 打印不出什么信息
        Mo丶染洛凉:@Jaybin_6159 你不看文字吗?不是写了吗
        Jaybin_6159: @Mo丶染洛凉 你好,请问是搜索哪个类目,
        Mo丶染洛凉:@Jaybin_6159 搜索商品类型不对。页面结构不一样
      • 噫树:使用正则表达式获取信息那部分,既然使用的是raw_string的格式,是不是就不需要那么多反斜杠了。:relaxed:
        Mo丶染洛凉:@lao_N 为了能匹配到双引号。而转移

      本文标题:Python获取淘宝商品相关信息

      本文链接:https://www.haomeiwen.com/subject/mdswlxtx.html