运维开发网

如何实现不同商场的商品差价分析系统

运维开发网 https://www.qedev.com 2022-06-08 19:34 出处:网络
这篇文章主要给大家介绍了关于Pythonr基于selenium如何实现不同商城的商品价格差异分析系统的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可

这篇文章主要给大家介绍了关于Pythonr基于selenium如何实现不同商城的商品价格差异分析系统的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可


1. 前言

Selenium原本是一个自动化测试工具,由于其出色的页面数据分析和用户行为模拟能力,经常被用于爬虫程序中,使得爬虫程序的抓取过程更加简单快捷。

与其他类型的程序相比,爬虫程序本质上是一样的,提供数据处理逻辑,只是爬虫程序的数据来自HTML代码片段。

如何准确找到页面中数据所在的标签(或节点、元素、组件)成为爬虫的关键。只有这一步建立起来,后续的数据提取、清理、汇总才有可能。

相比Beaufulsoup模块,selenium的底层依靠强大的浏览器引擎,在页面解析能力上相当从容果断。

本文将使用selenium自动模拟用户的搜索行为,获取同一类型的商品在不同商场的价格信息,最终生成不同商场的商品差价对照表。

本文通过实现程序流程来解释selenium,只解释程序中涉及的selenium函数。不会深究其他selenium API的细节。所以当你读这篇文章的时候,请确保你对硒有所了解。


2、程序设计流程


2.1 需求分析:

这个程序实现了用户只需要在不打开浏览器的情况下输入一个商品关键词,就可以完全自动的找到不同商场的商品价格,并汇总一些差价信息。

1.程序运行时,提示用户输入要搜索的商品关键词。

这个节目只是为了探索selenium的奇妙之处,感受它的王者风范,在程序结构和界面上没有下任何功夫。

2.使用selenium模拟用户打开JD.COM和Suning.cn的主页。

为什么选择JD.COM和苏宁易购而不是淘宝?

因为这两个网站在使用搜索功能时不需要登录验证,所以这个程序代码可以简化。

3.使用selenium在首页的文本搜索框中自动输入商品关键词,然后自动触发搜索按钮的click事件进入商品列表页面。

4.使用selenium从不同商城的商品列表页面中分析和抓取商品名称和价格数据。

5.对商品价格数据进行简单分析后,使用CSV模块将其保存为文件。

分析不同商场主要商品的均价、最低价、最高制的差异。

当然,如果有必要,我们可以通过其他模块或者分析逻辑得到更多的数据分析结论。


2.2 认识 selenium

虽然本文不深究selenium API的细节,但是既然要用,那么它的使用过程应该是全面的。

1.安装:

Selenium是python的第三个库。你应该在使用它之前安装它,所以没有必要在安装的细节上浪费更多的笔墨。

pip3 install selenium

除了安装selenium模块,还需要为它下载一个浏览器驱动,否则无法工作。

什么是浏览器驱动?你为什么需要它?

要解释这个问题,需要从硒的工作原理说起。

2.关于硒的工作原理:

美汤用特定的解析器程序解析HTML页面。Selenium更简单直接地依赖浏览器的解析能力。通过调用浏览器底层API完成页面数据搜索,也是顺从的,不仅爬行,还会向浏览器发送操作指令,模拟用户行为。

有没有感觉浏览器是selenium手里的牵线木偶(把浏览器玩弄于股掌之间)?Selenium的工作是驱动浏览器,向浏览器发送指令或接收浏览的反馈。在这个过程中,浏览器驱动(webdriver)起到上传和发布的作用。

典型的组件开发模式。


很明显,由于不同浏览器的内核不同,驱动程序必然不同,所以在下载驱动程序之前,请确定您正在使用的浏览器类型和版本。

要在本文中使用Google Chrome,需要下载与Google Chrome对应的webdriver驱动程序。

去https://www.selenium.dev/downloads/网站,选择python语言和最新的稳定版本。



请选择与您正在使用的浏览版本一致的驱动程序。


下载后,指定驱动程序的存储目录。这篇文章存放在D:\ chrome driver \ chromedriver.exe。它也可以存储在浏览器的安装目录中。



2.3 功能函数设计

当你准备好了,开始编码:

导入程序所需的模块,定义程序所需的变量。

from selenium import webdriverfrom selenium.webdriver.chrome.service import Servicefrom selenium.webdriver.common.by import Byimport csvimport timeimport math# 浏览器对象chrome_browser = None# 商品关键字search_keyword = None# 保存在京东商城搜索到的商品数据,格式{商品名:价格}jd_data = {}# 保存在苏宁商城搜索到的商品数据,格式{商品名:价格}sn_data = {}webdriver: 用来构建浏览器对象,从底层设计角度讲,是 selenium 和浏览器之间的接口层。selenium 向上为用户提供高级应用接口,向下通过 webdriver 和浏览器无障碍沟通。Service: webdriver 构建浏览器对象时的参数类型。By: ** 封装了查找页面组件的各种方式。selenium** 向开者提供了很多高级方法用来查询 HTML 页面组件,如通过元素 ID、样式、样式选择器、XPATHhellip;hellip;By 封装了这些方案。

如:find_element_by_class_name(),find_element_by_id(),find_element_by_(),find_element_by_tag_name(),find_element_by_class_name(),find _ element _ by _

上述方法已被标记为过时。请使用find_element()方法匹配By对象切换模式。

csv: 用来把获取到的数据以 csv 格式保存。time: 时间模块,用来模拟网络延迟。math: 数学模块,辅助数据分析。

初始化函数:初始化浏览器对象和用户输入数据。

'''初始浏览器对象'''def init_data(): # 驱动程序存放路径 webdriver_path = r"D:\chromedriver\chromedriver.exe" service = Service(webdriver_path) # 构建浏览器对象 browser = webdriver.Chrome(service=service) # 等待浏览器就绪 browser.implicitly_wait(10) return browser'''初始用户输入的商品名称关键字'''def input_search_key(): info = input("请输入商品关键字:") return info

查询JD.COM商品信息。在JD.COM商城查询商品分两步,在首页输入商品关键词,点击搜索,然后在结果页查询价格信息。完整的代码如下:

'''进入京东商城查询商品信息'''def search_jd(): global jd_data products_names = [] products_prices = [] # 京东首页 jd_index_url = r"https://www.jd.com/" # 打开京东首面 try: if chrome_browser is None: raise Exception() else: # 打开京东首页 chrome_browser.get(jd_index_url) # 模拟网络延迟 chrome_browser.implicitly_wait(10) # 找到文本输入组件 search_input = chrome_browser.find_element(By.ID, "key") # 在文本框中输入商品关键字 search_input.send_keys(search_keyword) chrome_browser.implicitly_wait(5) # 找到搜索按钮 这里使用 CSS 选择器方案 search_button = chrome_browser.find_element(By.CSS_SELECTOR, "#search gt; div gt; div.form gt; button") # 触发按钮事件 search_button.click() chrome_browser.implicitly_wait(5) # 获取所有打开的窗口(当点击按钮后应该有 2 个) windows = chrome_browser.window_handles # 切换新打开的窗口,使用负索引找到最后打开的窗口 chrome_browser.switch_to.window(windows[-1]) chrome_browser.implicitly_wait(5) # 获取商品价格 product_price_divs = chrome_browser.find_elements(By.CLASS_NAME, "p-price") for i in range(5): div = product_price_divs[i] if len(div.text) != 0: # 删除价格前面的美元符号 products_prices.append(float(div.text[1:])) # 获取商品名称 product_name_divs = chrome_browser.find_elements(By.CLASS_NAME, "p-name") chrome_browser.implicitly_wait(10) for i in range(5): div = product_name_divs[i] if len(div.text) != 0: products_names.append(div.text) jd_data = dict(zip(products_names, products_prices)) jd_data["平均价格"] = sum(products_prices) / len(products_prices) jd_data["最低价格"] = min(products_prices) jd_data["最高价格"] = max(products_prices) # 使用 CSV 模块写入文档 csv_save("京东商城", jd_data) except Exception as e: print(e)

Chrome_browser:映射到webdriver构建的浏览器的对象,selenium通过它控制浏览器上的所有操作。

这个对象有一个find_element()核心方法,用于查找(定位)HTML页面元素。搜索时,您可以指定通过By对象进行搜索的方式(这里使用的是工厂设计模式)。By的值可以是ID、CSS_SELECTOR、XPATH、CLASS_NAME、CSS_SELECTOR、TAG_NAME、LINK_TEX、PARTIAL_LINK_TEXT。

打开JD.COM首页后,首先定位文字搜索框和搜索按钮。


使用浏览器的开发者工具,发现文本框的源代码是一个输入的html片段。为了准确定位这个组件,一般来说,首先要尝试分析这个组件是否有唯一的属性或特征值。id是个不错的选择。html规范id值应该是唯一的值。

search_input = chrome_browser.find_element(By.ID, "key")

找到一个组件后,可以对它执行一系列操作。常见的操作有:

text 属性: 获取组件的文本内容。send_keys( ) 方法:为此组件赋值。get_attribute( ) 方法:获取组件的属性值。

这里,send_keys用于向文本组件提供用户输入的商品关键字。

search_input.send_keys(search_keyword)

再次找到搜索按钮组件:


按钮就是一段按钮html代码,没有明显的属性值。为了找到这个独特的组件,您可以使用XPATH或CSS选择器。右击这段代码片段,在弹出的快捷菜单中找到ldquoRdquo命令,然后查找该组件的CSS选择器值。


search_button = chrome_browser.find_element(By.CSS_SELECTOR, "#search gt; div gt; div.form gt; button")

调用按钮组件的click()方法,模拟用户的点击操作,会打开一个新窗口,以列表的形式显示搜索到的商品数据。

search_button.click()

Selenium可以在打开一个新窗口后收到浏览器的反馈后,使用window_handles属性获取浏览器中所有打开的窗口,并以列表的形式存储每个窗口的操作引用。

windows = chrome_browser.window_handles

在定位和搜索页面元素时,有一个当前窗口(当前可用且正在操作的窗口)的概念。一开始是在首页窗口操作,现在要在搜索结果窗口操作,所以要切换到新打开的窗口。使用负索引获取刚打开的窗口(刚打开的窗口必须是最后一个窗口)。

chrome_browser.switch_to.window(windows[-1])

请注意,当您切换到搜索结果窗口时,您可以在此窗口中搜索所需的组件。


在这个页面中,你只需要获得前5名产品的具体信息,包括产品名称和价格。至于要获取的具体数据,可以根据自己的需求来决定。这个程序只需要商品的价格和名称,然后查看页面,找到对应的html片段。


商品名称信息存储在一个div段中,该段有一个值为p-name的class属性。可以用CSS-NAME来获取,因为所有的商品都使用相同的片段模板。在这里,您可以使用find_elements()方法。

product_name_divs = chrome_browser.find_elements(By.CLASS_NAME, "p-name")

find_elements方法返回具有相同CSS-NAME的组件列表,编写代码迭代每个组件,获取数据,然后将其存储在商品名称列表中。

for i in range(5): div = product_name_divs[i] if len(div.text) != 0: products_names.append(div.text)

用同样的方法,得到价格数据。然后,把商品名称和价格数据做成字典,对价格数据进行简单分析。

jd_data = dict(zip(products_names, products_prices))jd_data["平均价格"] = sum(products_prices) / len(products_prices)jd_data["最低价格"] = min(products_prices)jd_data["最高价格"] = max(products_prices)csv_save("京东商城", jd_data)

以CSV格式存储从JD.COM商城抓取的数据。


获取Suning.cn的商品数据。从JD.COM获取数据的逻辑是相同的(两段代码可以集成到一个函数中,为了便于理解,本文单独编写)。两者的区别在于页面结构、承载数据的页面组件或者组件的属性设置不同。

def search_sn(): global sn_data # 保存商品名称 products_names = [] # 保存商品价格 products_prices = [] # 苏宁首页 sn_index_url = r"https://www.suning.com/" try: if chrome_browser is None: raise Exception() else: # 打开首页 chrome_browser.get(sn_index_url) # 摸拟网络延迟 chrome_browser.implicitly_wait(10) # 查找文本输入组件 search_input = chrome_browser.find_element(By.ID, "searchKeywords") # 在文本框中输入商品关键字 search_input.send_keys(search_keyword) time.sleep(2) # 找到搜索按钮 这里使用 CSS 选择器方案 search_button = chrome_browser.find_element(By.ID, "searchSubmit") # 触发按钮事件 search_button.click() time.sleep(3) # 获取所有打开的窗口(当点击按钮后应该有 2 个) windows = chrome_browser.window_handles # 切换新打开的窗口,使用负索引找到最后打开的窗口 chrome_browser.switch_to.window(windows[-1]) chrome_browser.implicitly_wait(20) # 获取商品价格所在标签 product_price_divs = chrome_browser.find_elements(By.CLASS_NAME, "def-price") # 仅查看前 5 个商品信息 for i in range(5): div = product_price_divs[i] # 删除价格前面的美元符号 if len(div.text) != 0: products_prices.append(float(div.text[1:])) chrome_browser.implicitly_wait(10) # 获取商品名称 product_name_divs = chrome_browser.find_elements(By.CLASS_NAME, "title-selling-point") for i in range(5): products_names.append(product_name_divs[i].text) # sn_data = dict(zip(products_names, products_prices)) sn_data["平均价格"] = sum(products_prices) / len(products_prices) sn_data["最低价格"] = min(products_prices) sn_data["最高价格"] = max(products_prices) # 使用 CSV 模块写入文档 csv_save("苏宁商城", sn_data) except Exception as e: print(e)

获得Suning.cn上的商品数据后,也以CSV格式存储。


存储最终分析结果。本文只分析两个商场同类商品的平均价格、最低价格和最高价格的差异。

def price_result(): if len(jd_data) != 0 and len(sn_data) != 0: with open("d:/商品比较表.csv", "w", newline='') as f: csv_writer = csv.writer(f) jd_name = list(jd_data.keys()) jd_price = list(jd_data.values()) sn_price = list(sn_data.values()) csv_writer.writerow(["比较项", "京东价格", "苏宁价格", "价格差"]) for i in range(5, len(jd_price)): csv_writer.writerow([jd_name[i], jd_price[i], sn_price[i], math.fabs(jd_price[i] - sn_price[i])])

保存两个商场商品价格的平均、最小、最大、绝对差价。


最终测试代码

if __name__ == '__main__': search_keyword = input_search_key() chrome_browser = init_data() search_jd() time.sleep(2) search_sn() price_result()

请输入商品关键词:华为meta 40。


3. 总结

本文主要应用硒。通过应用过程讲解硒,了解硒的基本使用过程。数据分析不是本文的重点。

如果想要得到更全面的分析结果,需要提供更多维度的数据分析逻辑。

关于Pythonr如何基于selenium实现不同商场商品差价分析系统的这篇文章到此为止。更多关于Pythonrselenium商品差价分析系统的信息,请搜索源搜网之前的文章或者继续浏览下面的相关文章。希望大家以后能多支持源搜网!


0

精彩评论

暂无评论...
验证码 换一张
取 消