python模拟天猫商城

使用python爬虫,对天猫商品详细信息进行获取

下面是在代码中所使用的模块

requests模块进行网址的请求
lxml中的etree进行数据的获取
urllib中的request.urlretrieve进行商品图片的下载,prase进行编码
tkinter进行用户交互
time模块进行时间的延迟
pygame 用来显示图片
webbrowser用于弹出指定网页
PIL模块可以将.png .gif 转换成tkinter专用的.jpg(此程序中形如废柴,没有用到)

最终结果如下

python模拟天猫商城


使用tkinter的交互界面,我们可以看到,可以查看下一个商品,商品价格,月销量,评价数,同时也可以弹出该商品的该买链接
在这里插入图片描述 商品图片如下
在这里插入图片描述

首先,我们需要天猫商城的首页url

首页网址:https://www.tmall.com/
在这里插入图片描述
当我们输入需要搜索的内容,网址会发生变化:
https://list.tmall.com/search_product.htm?q=%C0%F1%CE%EF&type=p&vmarket=&spm=875.7931836%2FB.a2227oh.d100&from=mallfp…pc_1_searchbutton
在这里插入图片描述C0%F1%CE%EF这串字符是将礼物进行编码得到的,因此,我们需要将汉字进行编码,写入url中
编码代码如下:


    def get_url():
        name = number1.get()
        data = {}
        data['name'] = name
        resp = parse.urlencode(data)
        name_urlcode = resp[5:]
        url = 'https://list.tmall.com/search_product.htm?q=' + str(name_urlcode) + '&type=p&vmarket=&spm=875.7931836%2FB.a2227oh.d100&from=mallfp..pc_1_searchbutton'
       

接下来就是爬虫了,我们需要将转换的url进行解析,解析代码如下:

def get_HTML(url):
    # print("正在请求:",url)
    response = requests.get(url)
    text = response.content.decode('gbk')
    html = etree.HTML(text)
    return html

可以返回网页中的html

下一步,就是获取该网页的数据,并每个数据保存在一个字典中,保存在数组中。

代码如下:

#获取页面内的详细信息,包括商品名称,商品价格,商品链接,商品月销量,商品评价数的详细信息
def get_detials(url):
    html = get_HTML(url)
    #使用xpath提取数据
    #获取URL
    every_urls = html.xpath('//div[@id = "J_ItemList"]/div/div[1]/p[2]/a/@href')
    #获取商品名称
    commodity_name = html.xpath('//div[@id = "J_ItemList"]/div/div[1]/p[2]/a/@title')
    #获取商品价格
    commodity_price = html.xpath('//div[@id = "J_ItemList"]/div/div/p[1]/em/@title')
    #商品月销量
    commodity_number = html.xpath('//div[@id = "J_ItemList"]/div/div[1]/p[3]/span/em/text()')
    #商品评价数
    commodity_Evaluation = html.xpath('//div[@id = "J_ItemList"]/div/div[1]/p[3]/span[2]/a/text()')
    commodity_shop_name = html.xpath('//div[@id = "J_ItemList"]/div/div[1]/div[3]/a//text()')
    #商品图片
    commodity_picture_url_src = html.xpath('//div[@id = "J_ItemList"]/div/div[1]/div[1]//img/@src')
    commodity_picture_url_data = html.xpath('//div[@id = "J_ItemList"]/div/div[1]/div[1]//img/@data-ks-lazyload')
    #将商品图片的url存入一个数组中
    commodity_picture_url = []
    for number in commodity_picture_url_src:
        commodity_picture_url.append(number)
    for number in commodity_picture_url_data:
        commodity_picture_url.append(number)
        #储存所有数据的数组
    file_new_commodity = []
    #获取每一个数据
    for each in range(len(every_urls)):
        try:
            new_commodity = {}
            every_url = 'https:' + every_urls[each]
            new_commodity["商品名称"] = commodity_name[each].strip()
            new_commodity["商品链接网址"] = every_url
            # new_commodity["商品店名"] = str(commodity_shop_name[4*each+2]).strip()
            new_commodity["商品价格"] = str(commodity_price[each])+'元'
            new_commodity["商品月销量"] = str(commodity_number[each])
            new_commodity["商品评价数"] = str(commodity_Evaluation[each])
            picturl_url = 'http:' + commodity_picture_url[each]
            new_commodity["商品图片网址"] = picturl_url

            file_new_commodity.append(new_commodity)
        except:
            pass
    return file_new_commodity

将所有数据返回

下一步,就是,将数据显示在tkinter中,我们可以很清晰的了解每个商品的详细信息,包括价格,商品链接,以及月销量

代码如下;

#创建tkinter显示
def get_Tkinter():
    master = tkinter.Tk()
    master.title('天猫')
    frame = tkinter.Frame(master)
    frame.pack(padx = 10,pady = 20)



    #初始化数据
    number1 = tkinter.StringVar()
    number2 = tkinter.StringVar()
    number3 = tkinter.StringVar()
    number4 = tkinter.StringVar()
    number5 = tkinter.StringVar()
    number6 = tkinter.StringVar()
    number7 = tkinter.StringVar()
    #显示表头
    tkinter.Label(frame,text = "你需要搜索的商品:").grid(row = 0,column = 0,sticky=tkinter.E)
    tkinter.Label(frame,text="商品名称:").grid(row=2, column=0,sticky=tkinter.E)
    tkinter.Label(frame, text="商品链接网址:").grid(row=3, column=0,sticky=tkinter.E)
    tkinter.Label(frame, text="商品店名:").grid(row=4, column=0,sticky=tkinter.E)
    tkinter.Label(frame, text="商品价格:").grid(row=5, column=0,sticky=tkinter.E)
    tkinter.Label(frame, text="商品月销量:").grid(row=6, column=0,sticky=tkinter.E)
    tkinter.Label(frame, text="商品评价数:").grid(row=7, column=0,sticky=tkinter.E)
    #在上面输入需要搜索的内容
    tkinter.Entry(frame, textvariable = number1,width = 50).grid(row=0, column=1)
    #清空
    def zero():
        number2.set('')
        number3.set('')
        number4.set('')
        number5.set('')
        number6.set('')
        number7.set('')

    url_text =[]
    url_picturre= []
    #当按下下一个按钮时,进行数据的刷新
    def show_next(numb = [0]):
        if numb[0] < len(news):
            num = numb[0]
            numb[0] = numb[0]+1
            every = news[num]
            #将数据显示在tkinter
            number2.set(every['商品名称'])
            number3.set(every['商品链接网址'])
            # number4.set(every['商品店名'])
            number5.set(every['商品价格'])
            number6.set(every['商品月销量'])
            number7.set(every['商品评价数'])
            url_text.append(every['商品链接网址'])
            url_picturre.append(every['商品图片网址'])
            request.urlretrieve(url_picturre[0], '0.png')
            url_picturre.pop()
            #调用显示图片的tinter
            picture_display()
        #当商品中所有数据显示完之后,重新归零
        else :
            numb[0] = 0

    #弹出所在网页
    def show_url():
        time.sleep(0.5)
        webbrowser.open(url_text[-1])
    #显示按钮
    tkinter.Button(frame, text="搜索", width=10, command=get_url).grid(row=1, column=2, padx=10, pady=10)
    tkinter.Button(frame, text="清空", width=10, command=zero).grid(row=1, column=0, padx=10, pady=10)
    tkinter.Button(frame, text="刷新", width=10,command = show_next).grid(row=1, column=1, padx=10, pady=10)
    #显示商品信息框
    tkinter.Entry(frame, textvariable=number2, width=50, state="readonly").grid(row=2, column=1)
    tkinter.Entry(frame, textvariable=number3, width=50, state="readonly").grid(row=3, column=1)
    tkinter.Entry(frame, textvariable=number4, width=50, state="readonly").grid(row=4, column=1)
    tkinter.Entry(frame, textvariable=number5, width=50, state="readonly").grid(row=5, column=1)
    tkinter.Entry(frame, textvariable=number6, width=50, state="readonly").grid(row=6, column=1)
    tkinter.Entry(frame, textvariable=number7, width=50, state="readonly").grid(row=7, column=1)
    #显示商品信息之后的按钮框
    tkinter.Button(frame, text="退出", width=10,command = master.quit).grid(row=8, column=0, padx=10, pady=10)
    tkinter.Button(frame, text="弹出天猫页面", width=10,command = show_url).grid(row=8, column=1, padx=10, pady=10)
    tkinter.Button(frame, text="下一个", width=10,command = show_next).grid(row=8, column=2, padx=10, pady=10)



    tkinter.mainloop()
    picture()

下一步就是弹出图片的模块

代码如下:

#在pygame显示图片
def picture_display():
    # 初始化
    pygame.init()
    # 界面高度与宽度
    size = width, height = 800, 500
    # 移动速度
    bg = (255, 255, 255)
    # 创建指定大小的窗口
    screen = pygame.display.set_mode(size)
    # 设置窗口标题
    pygame.display.set_caption("商品图片")
    # 加载图片
    turtle = pygame.image.load("0.png")
    # 获取图像的位置矩形
    position = turtle.get_rect()
    # 填充背景
    screen.fill(bg)
    # 更新图像
    screen.blit(turtle, position)
    # 更新界面
    pygame.display.flip()
    # 延迟
    pygame.time.delay(10)

在tkinter中,并且有弹出天猫页面,我们可以详细的查看商品的具体信息

    def show_url():
        time.sleep(0.5)
        webbrowser.open(url_text[-1])

图片如下:
在这里插入图片描述逛天猫商城无非就是这几个步骤,感谢收看,如有错误,望指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鱼子爱吃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值