使用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])
图片如下:
逛天猫商城无非就是这几个步骤,感谢收看,如有错误,望指正。