Python多线程爬取亚马逊商品数据

news/2025/1/31 2:18:13/文章来源:https://www.cnblogs.com/pengboke/p/18695596

前言

新年快乐

1.环境准备

使用miniconda为亚马逊创建一个新环境,防止feapder和其他包冲突(比如scrapy)。

# 创建一个新的 Conda 环境:
conda create -n python_feapder python=3.12# 查看已创建的环境
conda info --envs# 激活环境
conda activate python_feapder# 安装所需要的包
pip install  pymysql requests retrying lxml loguru feapder# 使用pip install安装包,要使用 pip list 来查看当前环境中通过 pip 安装的包
# 使用conda  install安装包,要使用 conda list 来查看当前环境中通过 pip 安装的包
pip list# 退出当前环境
conda deactivate# 删除可以删除环境,可能不需要,如果创建失败或者需要重新创建,可以删除重建
conda remove -n python_feapder --all

以下是创建过程>

创建python_feapder

如果创建时不指定python版本,会默认使用你的安装目录\miniconda\package\python.exe

也就是你的miniconda安装目录下的python.exe的解释器

image-20250131020705515

查看当前所有环境

image-20250129162219507

激活python_feapder

image-20250129162247737

安装环境所需要的包

image-20250129162339855

查看已安装的包

image-20250129162818518

2.conda解释器设置

添加本地解释器

image-20250129171652348

选择新创建的环境

image-20250129171518171

如果新创建的环境的解释器位置对不上,可以重新设置

创建环境的时候设置python版本,应该不会有这个问题

conda create -n python_feapder python=3.12

image-20250129170747097

重新指定新环境的python解释器地址

image-20250129170804782

3.一级菜单

地址:https://www.amazon.com/

查找一级菜单

image-20250129230111994

一级菜单地址

https://www.amazon.com/nav/ajax/hamburgerMainContent?ajaxTemplate=hamburgerMainContent&pageType=Gateway&hmDataAjaxHint=1&navDeviceType=desktop&isSmile=0&isPrime=0&isBackup=false&hashCustomerAndSessionId=c29600d243c8a5975548ed30d33b8f18925a7d23&languageCode=zh_CN&environmentVFI=AmazonNavigationCards%2Fdevelopment%40B6289328400-AL2_aarch64&secondLayerTreeName=prm_digital_music_hawkfire%2Bkindle%2Bandroid_appstore%2Belectronics_exports%2Bcomputers_exports%2Bsbd_alexa_smart_home%2Barts_and_crafts_exports%2Bautomotive_exports%2Bbaby_exports%2Bbeauty_and_personal_care_exports%2Bwomens_fashion_exports%2Bmens_fashion_exports%2Bgirls_fashion_exports%2Bboys_fashion_exports%2Bhealth_and_household_exports%2Bhome_and_kitchen_exports%2Bindustrial_and_scientific_exports%2Bluggage_exports%2Bmovies_and_television_exports%2Bpet_supplies_exports%2Bsoftware_exports%2Bsports_and_outdoors_exports%2Btools_home_improvement_exports%2Btoys_games_exports%2Bvideo_games_exports%2Bgiftcards%2Bamazon_live%2BAmazon_Global&customerCountryCode=VN

image-20250129230242342

我们发现这个链接返回了所有的菜单列表,一级菜单和二级菜单,但是返回的是html

我们使用PyCharm创建一个新的html页,并把代码拷贝进去

image-20250131001645300

整理一下代码,Ctrl + shift + L格式化代码

然后替换一些格式化的字符,代码就整洁多了

image-20250131002059290

在页面开始加一行配置,要不然使用PyCharm打开时会乱码

<meta http-equiv="Content-Type" content="text/html;charset=utf-8">

image-20250131002300673

我们只需要商品分类下的菜单地址,而且每个菜单的前2个是没有链接的

image-20250131002625400

所以我们提取数据的xpath是:

<ul> 元素中,选取 data-menu-id 在 5 到 26 之间的 ul,并筛选其中符合以下条件的 <li> 元素:

  • 位置 (position()) 大于 2(即排除前两个 <li>)。
  • 不包含 class="hmenu-separator"(即排除分隔符)。这个是我后期测试发现的,这个li没有链接,可以忽略掉
//ul[number(@data-menu-id) >= 5 and number(@data-menu-id) <= 26]/li[position() > 2 and not(contains(@class, "hmenu-separator"))]

image-20250131002734460

看看返回的html,基本就明白了

当然,看着简单,我调的时候也费了点事

image-20250131003218855

然后就是我请求的时候一直返回的是英文的数据,需要在请求头加点配置

 "Cookie": " i18n-prefs=CNY; lc-main=zh_CN;""Accept-Language": "zh-CN,zh;q=0.9",

image-20250131011534769

多线程其实就是把数据放到队列,交给其他有资源的线程从队列中获取后进行处理

获取一级菜单也不是多线程,我只开启了一个线程,其实也不需要多线程处理这个html

然后爬取到的链接,其实就是li下的a标签的href属性,这个链接是没有域名的,需要加上域名

image-20250131011733620

4.商品列表页

这里只爬取二级菜单返回的链接中带有分页的,其他的页面也要好多种,这里不展开学习了

image-20250131003952770

这里获取到商品列表后,获取分页最大的页码,给商品列表的链接拼接分页参数,就是&page=

拼接完所有的分页链接后,解析获取每页的商品详情链接

记得开始get(),代码最后要task_done()

image-20250131004411072

其实就是获取<a>标签的<href>的链接

image-20250131005129820

获取到商品详情的链接就放入到获取商品详情数据的队列product_url_queue

image-20250131005256868

5.商品详情

这里获取到商品详情链接后,就需要分析商品详情的页面,获取到自己需要的数据

image-20250131005457328

这里就以商品标题为例,商品标题的xpath

//span[@id="productTitle"]/text()

image-20250131005659933

xpath匹配数据的时候记得做非空判断,提高代码容错率,我这里封装了一个方法

image-20250131010742025

其实每种类别的商品详情页还是有一些差别的

我这里主要是获取了名称、图片、价格、销量、评论等

image-20250131005807119

实际爬取的过程中,获取到商品详情的链接,我打开页面发现对应的xpath也能获取信息,但是代码获取的就是空

具体原因可能是返回的页面不完整或者其他的反爬措施

我这里就在请求的时候带上xpath,主要是商品标题的xpath,这个肯定是有的

如果没有我要的数据就重试3次,每次间隔2s,算是一个小的优化,实际爬取过程确实好了不少

image-20250131010003692

6.保存数据

保存mysql基本操作,这里做了优化就是30条数据插入一次,算是优化

但是风险就是插入失败了会损失30条

还有需要注意的是代码的缩进,我这里sql一开始缩进不对,程序就一直卡着,不好调试

image-20250131010921557

7.请求重试

这里对发送请求进行了优化

  • 一个是普通请求失败了,可以重试3次
  • 另一个是没有返回指定内容的页面也进行了重试,重试3次,间隔2s

image-20250131012235871

8.多线程启动任务

创建线程(不同任务分配不同数量的线程):

  • 1个线程 处理获取菜单链接 (get_menu_url)。
  • 10个线程 处理获取商品详情链接 (get_procduct_detail_url)。
  • 5个线程 处理解析商品详情 (get_product_detail)。
  • 1个线程 负责数据保存 (save_product_data)。

然后遍历thread_list启动所有线程,并设置置守护线程,保证主线程退出时所有子线程自动终止。

time.sleep(5):等待5秒,确保所有线程都真正运行起来,防止主线程提前执行 queue.join() 导致阻塞。

queue.join():阻塞主线程,直到队列中的所有任务都被消费。

image-20250131012450630

9.代理IP池

如果长时间对https://www.amazon.com进行请求,自己的IP可能被封禁,所以建议使用代理IP池,当然需要付费,我这里只是记录一下实现方式

首先在__init__(self)中声明代理IP池的请求地址和队列,因为我们获取到IP池的IP放到队列,需要的时候从队列里取

image-20250131015630583

从代理池队列里取出IP后,请求的时候带上proxies,如果IP可用,再放回代理IP池队列中,做到重用image-20250131020047936

开启一个线程从代理IP池的服务器获取代理IP

image-20250131020251261

10.结尾

没有使用代理IP池,个人电脑爬取,不到30分钟,爬取了3000条数据,效率还凑合

image-20250131013332128

创作不易,感谢支持。

wxzf

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

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

相关文章

Debug: debugger失效排查

MarkTime: 2024-11-24 19:25:17 LogTime: 2024-11-24 19:25:17记一次 debugger 断点失效原因的排查版本说明Chrome: 131.0.6778.86 Vue: 3.2.27结论检查 是否启用了 谷歌浏览器 的 自定义排除规则, 并把 node_modules 给排除了 检查 前端项目配置文件eslint 是否有覆盖规则, 使…

Debug: 前端发送请求参数传递null, 后端转换实体类对应变量自动注入默认值

MarkTime: 2024-11-18 16:19:47 LogTime: 2024-11-25 01:26:05实体类属性未正确定义原因导致: ​ 基础数据类型未被初始化, 会对对应变量赋予默认值(int: 0; boolean: false;...) ​ 包装类型允许存储null, 不会进行默认值赋予, 实体类中如果需要设置默认值需要自行指定(privat…

Vue: 项目映射到外网后, 前端打包配置调整

Mark Time: 2024-11-15 15:55:34 Log Time: 2024-11-24 16:00:00小项目, 记录下前端打包的debug过程(配置文件有做部分删减, 看个结构就好)说明 版本说明项目前后端分离axios: 0.24.0node: 14.18.0npm: 6.14.15vue: 3.2.27webpack: 4.46.0webpack-bundle-analyzer: 4.8.0背景说…

Pyton多线程爬取亚马逊商品数据

前言 新年快乐 1.环境准备 使用miniconda为亚马逊创建一个新环境,防止feapder和其他包冲突(比如scrapy)。 # 创建一个新的 Conda 环境: conda create -n python_feapder python=3.12# 查看已创建的环境 conda info --envs# 激活环境 conda activate python_feapder# 安装所…

独立开发经验谈:如何通过 Docker 让潜在客户快速体验你的系统

如果你的产品是和我的在线客服系统一样,100% 允许用户私有化部署的,那你一定要使用 Docker 技术,让用户能够快速体验到你的系统,以及能够在生产环境中非常轻松的把你的产品用起来。我在业余时间开发了一款自己的独立产品:升讯威在线客服与营销系统。陆陆续续开发了几年,从…

AP Physics C Mechanics Chapter 7 Rotation 1

RTVocabularyRigid body 刚体 Angular displacement 角位移 \(\Delta \theta\) Angular velocity 角速度 \(\omega\) Angular acceleration 角加速度 \(\alpha\) Rotational kinetic energy 旋转动能 \(KE_{\text{rotational}}\) Rotational inertia 转动惯量 \(I\) Torque 扭矩…

electrical, electric, electronic; comparison

electrical 3818 electric 2711 electronic 2422electrical vs electric left 4WORD 1: ELECTRICAL WORD W1 W2 PROFESSOR 118 0 , " said Charles Bouman, a Purdue professor of electrical and computer engineering.普渡大学电气和计算机工程教授查尔斯…

容斥与反演

容斥与反演 容斥 容斥原理 用于不重不漏地【表达/转化】某集合 广义容斥:合法方案数 = 总方案数 - 不合法方案数 狭义容斥: \[\left|\bigcup_{i = 1}^{n}S_i\right|=\sum_{x = 1}^{n}(-1)^{x - 1}\sum_{i_1<i_2<\cdots <i_x}\left|\bigcap_{j = 1}^{x}S_{i_j}\right…

数据库查询优化:提升性能的关键实践

title: 数据库查询优化:提升性能的关键实践 date: 2025/1/30 updated: 2025/1/30 author: cmdragon excerpt: 在当今数据驱动的商业环境中,数据库的性能直接影响着应用程序的响应速度和用户体验。查询优化是性能调优的重要组成部分,通过对 SQL 查询的分析与改进,减少查询…

记一次LLVM平行宇宙修包实战

最近加入了LLVM平行宇宙计划小组,在小组内提交了一定数量的PR。这个计划究竟是做什么的呢?LLVM平行宇宙计划是基于LLVM技术栈构建openEuler软件包,大白话讲就是原本一个软件包是用gcc/g++编译的,现在换成clang/clang++编译。虽然只是切换了编译工具,但是偶尔也有可能出现一…

spark--设置日志级别

修改前: Windows:修改后: Windows:对比: Windows:修改过程: Windows: C:\Users\Administrator\Documents\spark\spark-3.5.4-bin-hadoop3>copy conf\log4j2.properties.template conf\log4j2.properties 已复制 1 个文件。 rootLogger.level = info rootLogger.…

动手学大模型应用开发,第1天:学习大模型必知必会

一. 什么是LLM(大语言模型)? 1. 发展历程 语言建模的研究始于20世纪90年代,最初采用了统计学习方法,通过前面的词汇来预测下一个词汇。然而,这种方法在理解复杂语言规则方面存在一定局限性。 随后,研究人员不断尝试改进,其中在2003年,深度学习先驱Bengio在他的经典论文…