双十一购物攻略:如何利用爬虫技术获取历史价格趋势,理性购物不踩雷

news/2024/11/14 4:08:43/文章来源:https://www.cnblogs.com/guoxiaoyu/p/18531125

双十一购物狂欢节即将到来,作为程序员,利用爬虫技术查询商品的历史价格趋势,似乎是一个合理的需求,毕竟这只是为了自己参考,不涉及商业用途。然而,小伙伴们在进行爬虫操作时一定要谨慎小心,尤其是在数据采集和使用的过程中,务必遵守相关法律法规与平台的使用规范。

每次和大家讲解爬虫时,我总是提醒一句:“谨慎、谨慎、再谨慎!”不仅要避免触犯法律,也要避免对网站的正常运营造成影响,保持理性和合规。

商品获取

好的,我们的第一步是进入京东的查询页面,找到并打开我们关注的商品页面。例如,假设我最关注的是显卡的价格和相关数据,那么接下来我就会去查询显卡的具体信息。通过这种方式,我们能够获取到显卡的相关商品数据。如图:

image

你要做的工作是找到我们的商品信息请求连接。这个连接可能不好找,所以你需要耐心地逐个查看相关页面。我已经帮你找到这个连接了,现在我们可以直接根据它开始编写爬虫脚本,目标是从中提取商品链接。你可以通过右键点击请求,选择“复制请求为Python代码”来直接获取Python代码。

至于在线工具,市场上有很多类似的工具可以帮助你转换请求,但我就不一一列举了,你可以根据需求自行选择合适的工具。

代码部分你可以自己编写,我这里只会提供一些关键部分的示例代码,帮助你更好地理解如何实现。以下是我为你整理的关键代码片段:

response = requests.get('https://api.m.jd.com/', params=params, cookies=cookies, headers=headers)# 使用BeautifulSoup解析HTMLsoup = BeautifulSoup(response.text, 'html.parser')# 查找所有符合条件的div标签div_tags = soup.find_all('div', class_='p-name p-name-type-2')# 循环遍历每个div标签,提取信息for div_tag in div_tags:# 查找 span 标签中是否有 "自营" 标识self_operated_tag = div_tag.find('span', class_='p-tag')if self_operated_tag and '自营' in self_operated_tag.text:# 提取显卡名称和链接a_tag = div_tag.find('a', href=True)product_name = a_tag.find('em').text.strip()# 处理相对路径,拼接为完整的URLlink = 'https:' + a_tag['href'] if a_tag['href'].startswith('//') else a_tag['href']store.append({'name': product_name,'link': link})# 打印结果print("名称:", product_name)print("链接:", link)else:print("没有找到自营标识或没有相关信息。")sort_data(store,keyword)def sort_data(data,name):with open(name+'.csv','a',newline='',encoding='utf8')as f:writer=csv.writer(f)for i in data:writer.writerow((i['name'],i['link']))

这里我们只关注自营商品,因为自营商品的品质相对有保障。为了避免频繁爬取导致封号的风险,我将爬取到的数据存储到了CSV文件中,便于后续使用。毕竟,不建议频繁地向同一网站发起请求,这样很容易被封禁。

以下是我爬取的某一页的数据示例。如果你需要获取多个页面的数据,只需调整相关参数即可,确保分页功能正常工作。爬取的示例数据如下所示:

image

没错,我并没有爬取商品的实时价格,因为我们这次的主要目标是获取历史价格数据。不过,在抓取历史价格的同时,顺便也爬取了商品的最新价格,这样既能满足需求,又不会浪费额外的爬取时间。因此,当前的代码已经覆盖了这两方面的内容。

接下来,我们可以转到另一个网站,看看它的数据结构和爬取方式,以便进行比较和优化。

历史价格爬取

在成功获取完当前网站的数据后,我们将转向爬取另一个网站的数据。首先,为了确保能够顺利抓取到所需的历史价格信息,我们需要在Web端进行一些初步的测试。通过手动操作和分析网络请求,我确认了能够获取历史价格数据的请求接口。

经过一番测试和调试后,我成功找到了正确的请求连接。接下来,我将展示这个连接,供大家参考。如下所示:

image

我们计划逐步抓取每一个商品链接的历史价格信息,以确保数据的全面性和准确性。然而,在抓取过程中,我注意到请求的内容中包含了一个加密部分,这使得我们无法直接获取到完整的价格数据。这一加密内容需要解密或进一步处理,才能确保我们能够成功提取出历史价格。

因此,在继续抓取之前,我们需要先分析并处理这个加密机制。以下是加密部分的内容,供参考:

image

在这个请求过程中,使用的并不是商品的直接链接,而是一个经过加密处理的“code”参数。实际上,商品链接在上面的请求中已经经历了一定的转换处理,因此我们无需过于担心这个转换步骤,它只是多了一道处理环节而已,对数据获取本身没有实质性影响。

我们只需要按照指定的方式获取这个“code”参数,并在后续请求中正确使用它即可。经过一系列分析和处理,最终的代码实现如下所示:

def get_history(itemid):#此处省略一堆代码params = {'ud': 'EAONJNRXWXSMTBKNNYL_1730899204','reqid': '46db0db9f67129f31d1fca1f96ed4239','checkCode': 'ada35e4f5d7c1c55403289ec49df69e3P9f1','con': itemid,}data = {'checkCode': 'ada35e4f5d7c1c55403289ec49df69e3P9f1','con': itemid,}response = requests.post('http://www.tool168.cn/dm/ptinfo.php', params=params, cookies=cookies, headers=headers, data=data, verify=False)#此处省略一堆代码code =   json.loads(response.text)params = {'code': code['code'],'t': '','ud': 'EAONJNRXWXSMTBKNNYL_1730899204','reqid': '46db0db9f67129f31d1fca1f96ed4239',}response = requests.post('http://www.tool168.cn/dm/history.php', params=params, cookies=cookies, headers=headers, verify=False)# 正则表达式匹配Date.UTC中的日期和价格pattern = r"Date.UTC\((\d{4}),(\d{1,2}),(\d{1,2})\),([\d\.]+)"matches = re.findall(pattern, response.text)# 解析日期和价格prices = []for match in matches:year, month, day, price = matchdate = datetime(int(year), int(month) + 1, int(day))  # 月份是从0开始的,需要加1prices.append((date, float(price)))# 找出最低价格、最高价格和最新价格min_price = min(prices, key=lambda x: x[1])max_price = max(prices, key=lambda x: x[1])latest_price = prices[-1]# 打印结果print(f"最低价格: {min_price[1]},日期: {min_price[0].strftime('%Y-%m-%d')}")print(f"最高价格: {max_price[1]},日期: {max_price[0].strftime('%Y-%m-%d')}")print(f"最新价格: {latest_price[1]},日期: {latest_price[0].strftime('%Y-%m-%d')}")get_history("https://item.jd.com/100061261651.html")    

最后,通过对获取到的历史价格数据进行分析,我们可以基于价格的波动趋势做出合理的购买判断!看下最终的效果:

image

剩下的工作就是对代码进行优化的过程了。在这个阶段,我们的主要目标是展示一个基本的实现思路,并且验证相关功能是否有效。实际上,我们并不打算爬取所有商品的详细信息,因为这不仅不符合我们的实际需求,而且在实际操作中也没有必要。

总结

总的来说,爬虫技术为我们提供了丰富的数据资源,但在使用过程中,谨慎行事,理性操作,才能真正让爬虫技术为我们的生活带来便利,而不是带来麻烦。希望大家在即将到来的双十一购物狂欢节中,既能抓住机会购买心仪的商品,又能遵守道德与法律的底线,做一个负责任的技术使用者。


我是努力的小雨,一名 Java 服务端码农,潜心研究着 AI 技术的奥秘。我热爱技术交流与分享,对开源社区充满热情。同时也是一位腾讯云创作之星、阿里云专家博主、华为云云享专家、掘金优秀作者。

💡 我将不吝分享我在技术道路上的个人探索与经验,希望能为你的学习与成长带来一些启发与帮助。

🌟 欢迎关注努力的小雨!🌟

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/832096.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

推荐7款程序员常用的API管理工具

前言 现如今API接口的编写与调试已成为开发人员不可或缺的技能,工欲善其事,必先利其器,选择一款优秀的API管理工具显得尤为重要。本文大姚给大家推荐7款程序员常用的API管理工具,大家可以根据自身和团队情况按需选择一款进行使用。 使用情况投票统计 微信使用情况投票统计:…

QT:报错误信息: Error: QDomNode file not found

QT:报错误信息: Error: QDomNode file not found ; Error: QDomDocument file not foundQT:报Error: QDomNode file not found QT:报错误信息: Error: QDomDocument file not found解决方法: 在项目文件 CH1302.pro 里添加 "XML" QT += core gui sql xml 优…

读数据质量管理:数据可靠性与数据质量问题解决之道01数据质量

数据质量1. 为什么数据质量值得关注 1.1. 数据是你的CEO的首要任务 1.2. 下游数据消费者(包括产品分析师、营销领导者和销售团队)则依赖于数据驱动的工具 1.3. 数据宕机1.3.1. 指数据丢失、不准确或出现错误的情况,它表现为过时的仪表板、不准确的报告,甚至是糟糕的决策1.3…

2024数据采集与融合技术实践-作业3

一、中国气象网单线程与多线程爬取图片码云仓库:作业3/task1 曹星才/2022级数据采集与融合技术 - 码云 - 开源中国(一)步骤 爬取网站:https://p.weather.com.cn/tqxc/index.shtml 1.1 单线程方式爬取 step1:设置为单线程方式爬取,settings.py中注设置最大并发请求数量CO…

Linux环境安装Splunk Enterprise服务端和Windows客户端Splunk Universal Forwarder

Ubuntu 22.04 安装Splunk Enterprise服务端这里采用安装Splunk Enterprise 8.2.5版本下载安装包 wget -O splunk-8.2.5-77015bc7a462-linux-2.6-amd64.deb https://download.splunk.com/products/splunk/releases/8.2.5/linux/splunk-8.2.5-77015bc7a462-linux-2.6-amd64.deb执…

数据采集第三次实践作业

第三次作业 作业①: 1.要求: 指定一个网站,爬取这个网站中的所有的所有图片,例如:中国气象网( http://www.weather.com.cn )。使用scrapy框架分别实现单线程和多线程的方式爬取。 –务必控制总页数(学号尾数2位)、总下载的图片数量(尾数后3位)等限制爬取的措施。输出…

WIN11 Chrome 双击打不开闪退及Chrome浏览器不能拖拽文件crx

WIN11 Chrome 双击打不开闪退及Chrome浏览器不能拖拽文件crx 1 WIN11 Chrome 双击打不开闪退 1.1 在 Windows 安全中心按照如下步骤操作1.2 右键对应的软件找到应用路径名称1.3 在程序设置按照如下图建立应用名称和后缀相同的命名,如 chrome.exe1.4 按照如下操作步骤打勾选项1…

LVM 使用与扩容总结

转载请注明出处:LVM(Logical Volume Manager,逻辑卷管理器)是一个用于Linux系统的磁盘管理工具。它提供了一种更加灵活的存储管理机制,可以方便地进行磁盘的扩容、缩减、快照以及迁移等操作。 基本概念物理卷(PV):物理磁盘或分区,如/dev/sda1。 卷组(VG):由一个或多…

针对搭建好的Self-Service-Password服务进行背景图片标题修改和去掉问答短信邮件功能选项的展示

官方链接https://ltb-project.org/documentation/index.html https://github.com/ltb-project/self-service-password关于安装我之前已经写了关于安装self-service-password相关的文章,具参考:https://www.cnblogs.com/autopwn/p/18208481修改背景先将要更改的背景图片上传上…

回归

回归时过境迁,上次发完博客后,之后的半年我努力学习,以106分的408分数极限通过了研究生考试初试,之后为了复试机试刷了ACWING,最终顺利通过了复试,被录取为硕士研究生。 进入新学校,技术上开始用java,springboot,mysql增删改查那一套;业务上一开始做开源仓的代码追溯…

开源 - Ideal库 -获取特殊时间扩展方法(四)

分享特殊时间获取的扩展方法,包括获取当前月第一个/最后一个指定星期几、上/下一个指定星期几、月份的第几周、年的第几周(ISO8601)、月份周数、是否周末、是否闰年、所在季度,提供详细代码和单元测试。书接上回,我们继续来分享一些关于特殊时间获取的常用扩展方法。01、获…

关于Windows外壳(Windows Shell)

在前面的文章中,我介绍过如何替换Windows Shell,将桌面替换为自己的程序。 但是这么做会有个问题,就是桌面环境未被初始化,即使创建了explorer.exe进程,桌面也不会出现。 这里搜集了一些关于WInlogon,LogonUI和Userinit的一些理论知识,有兴趣的小伙伴可以了解一下。Winlo…