Python 爬取淘宝商品信息栏目的实现


Posted in Python onFebruary 06, 2021

一、相关知识点

1.1、Selenium

Selenium是一个强大的开源Web功能测试工具系列,可进行读入测试套件、执行测试和记录测试结果,模拟真实用户操作,包括浏览页面、点击链接、输入文字、提交表单、触发鼠标事件等操作,并且能够对页面结果进行种种验证。也就是说,只要在测试用例中把预期的用户行为与结果都描述出来,我们就得到了一个可以自动化运行的功能测试套件。

1.2、ActionChains
Actionchains是selenium里面专门处理鼠标相关的操作如:鼠标移动,鼠标按钮操作,按键和上下文菜单(鼠标右键)交互。这对于做更复杂的动作非常有用,比如悬停和拖放。

1.3、time
返回当前时间的时间戳

1.4、lxml
lxml是一个Python库,使用它可以轻松处理XML和HTML文件,还可以用于web爬取。市面上有很多现成的XML解析器,但是为了获得更好的结果,开发人员有时更愿意编写自己的XML和HTML解析器。这时lxml库就派上用场了。这个库的主要优点是易于使用,在解析大型文档时速度非常快,归档的也非常好,并且提供了简单的转换方法来将数据转换为Python数据类型,从而使文件操作更容易。

1.5、csv
csv文件格式是一种通用的电子表格和数据库导入导出格式。最近我调用RPC处理服务器数据时,经常需要将数据做个存档便使用了这一方便的格式。

1.6、requests
Requests 库是一个优雅而简单的 Python HTTP 库,主要用于发送和处理 HTTP 请求

二、部分代码解析

加载Chrome驱动,动态解析爬取的网址

#提取公共的爬取信息的api
 def commonsdk(self,url):
 browser = webdriver.Chrome('D:/chromedriver.exe')
 try:
 browser.get(url)
 except Exception as e:
 browser.execute_script('window.stop()') # 超出时间则不加载
 print(e, 'dynamic web load timeout')
 return browser;

实现模拟登录

通过定位淘宝登陆界面的url的表单框,然后输入自己的用户名及密码,再模拟鼠标点击事件,继而提交表单信息实现用户登录。

#模拟登录
 def logon(self,url,a_href_list_next):
 username = "淘宝账户名"
 password = "密码"
 browser1 = self.commonsdk(url)
 #登录账号
 browser1.find_element_by_id('fm-login-id').send_keys(username)
 browser1.find_element_by_id('fm-login-password').send_keys(password)
 #模拟用户点击登录
 browser1.find_element_by_xpath('//*[@id="login-form"]/div[4]/button').click()
 #解析商品信息
 self.Buy_information(a_href_list_next,browser1)

爬取侧边栏目录
1、首先定位到目录分类栏,鼠标光标移动到需要选中的那一栏,继而会出现隐藏的div,(这里需要实现鼠标悬停事件)action.move_to_element(li_list).perform()实现了这一功能。
2、然后定位自己所需要爬取的侧边栏的那一行或多行,通过实现鼠标悬停事件后获取其中内容。
3、获取其超链接进入下一界面

Python 爬取淘宝商品信息栏目的实现

#爬取目录
 def List(self,url):
 browser = self.commonsdk(url)
 #ActionChains类实现鼠标的单击、双击、拖拽等功能
 action = ActionChains(browser)
 li_list = browser.find_elements_by_css_selector('.service-bd li')[1]
 #实现执行鼠标悬停,便于爬取悬停内容
 action.move_to_element(li_list).perform()
 time.sleep(5)

 #爬取整个目录的div
 div_list = browser.find_element_by_css_selector('.service-fi-links')
 #爬取其中的总的名称
 h5_list = div_list.find_elements_by_css_selector('h5')
 #爬取小标题的名称
 p_list = div_list.find_elements_by_css_selector('p')
 #获取a标签
 a_href_list = div_list.find_elements_by_css_selector('a')
 #获取a标签的超链接
 a_href_list_next = div_list.find_elements_by_css_selector('a')[1].get_attribute('href')

 print(li_list.text)
 for j in range(len(p_list)):
 if j<len(p_list):
 print(h5_list[j].text)
 print(p_list[j].text)
 for i in range(len(a_href_list)):
 print(a_href_list[i].get_attribute('href'))

 #获取登录框
 logon = browser.find_element_by_id('J_SiteNavBd')
 #获取登录框的超链接
 logon_url = logon.find_element_by_css_selector('a').get_attribute('href')
 #先关闭第一个网页
 browser.close()
 self.logon(logon_url,a_href_list_next)

获取商品信息

1、这里使用的定位方式是Xpath方式,使用了绝对定位来获取标签的位置。

#爬取商品信息
 def Buy_information(self,url,browser):
 browser.get(url)
 div_list = browser.find_element_by_xpath('//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[1]')
 img = div_list.find_element_by_css_selector('img')
 img_url = "https:"+img.get_attribute('data-src')
 price = div_list.find_element_by_xpath('//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[1]/div[2]/div[1]/div[1]').text
 number = div_list.find_element_by_xpath('//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[1]/div[2]/div[1]/div[2]').text
 shoping_information = div_list.find_element_by_xpath('//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[1]/div[2]/div[2]').text
 shop = div_list.find_element_by_xpath('//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[1]/div[2]/div[3]/div[1]/a').text
 adress = div_list.find_element_by_xpath('//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[1]/div[2]/div[3]/div[2]').text
 path = self.img_baocun(img_url)
 data={
 '图片路径':path,
 '价格':price,
 '购买人数':number,
 '商品信息':shoping_information,
 '商家':shop,
 '籍贯':adress
 }
 self.write_dictionary_to_csv(data,'information')

下载图片

通过获取到的图片的url,然后将图片下载到指定的文件夹内

#下载照片
 def img_baocun(self,url):
 root = "文件夹下载的路径"//电脑上的绝对路径
 path = root + url.split('?')[0].split('/')[-1].strip('')#获取jpg的名称
 #判断是否存在该路径,不存在则创建
 if not os.path.exists(root):
 os.mkdir(root)
 #判断是否存在该图片,存在则不下载
 if not os.path.exists(path):
 r = requests.get(url)
 r.raise_for_status()
 with open(path,'wb') as f:
 f.write(r.content)
 return path

将需要爬取的信息写入到csv文件中,便于查看
1、商品信息以字典的形式写入csv文件中方便查看。

#将解析得到的内容(字典格式)逐行写入csv文件
 def write_dictionary_to_csv(self,dict,filename):
 #格式化文件名
 file_name='{}.csv'.format(filename)
 with open(file_name, 'a',encoding='utf-8') as f: 
 file_exists = os.path.isfile(filename)
 #delimiter(定界符) 
 w =csv.DictWriter(f, dict.keys(),delimiter=',', quotechar='"', lineterminator='\n',quoting=csv.QUOTE_ALL, skipinitialspace=True)
 if not file_exists :
 w.writeheader()
 w.writerow(dict)
 print('当前行写入csv成功!')

三、程序思路

1、首先定位到侧边栏的位置,然后使用action.move_to_element(li_list).perform()的方法实现鼠标的动态悬停,让隐藏的div显示出来,再获取其中的信息。
2、然后再实现模拟登录的功能,登录账号,获取其中的商品信息(由于淘宝的反扒机制,多次登录会让用户扫码登录,此功能暂未实现)
3、商品信息的获取使用Xpath的绝对定位方式来获取。

Xpath的使用方式:
 右键需要定位的标签->选中Copy选项->Copy Xpath

四、发展空间

1、解决淘宝反扒机制的问题。传送门,解决问题
2、文件的写入换用其他方式。

到此这篇关于Python 爬取淘宝商品信息栏目的实现的文章就介绍到这了,更多相关Python 爬取淘宝商品信息内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python中文编码那些事
Jun 25 Python
Python中转换角度为弧度的radians()方法
May 18 Python
使用Python来开发Markdown脚本扩展的实例分享
Mar 04 Python
Python跨文件全局变量的实现方法示例
Dec 10 Python
Django集成搜索引擎Elasticserach的方法示例
Jun 04 Python
sklearn+python:线性回归案例
Feb 24 Python
Django实现将views.py中的数据传递到前端html页面,并展示
Mar 16 Python
Keras实现将两个模型连接到一起
May 23 Python
python代码实现猜拳小游戏
Nov 30 Python
python 邮件检测工具mmpi的使用
Jan 04 Python
python 将Excel转Word的示例
Mar 02 Python
Python捕获、播放和保存摄像头视频并提高视频清晰度和对比度
Apr 14 Python
解决pytorch下出现multi-target not supported at的一种可能原因
Feb 06 #Python
pytorch下的unsqueeze和squeeze的用法说明
Feb 06 #Python
一文带你掌握Pyecharts地理数据可视化的方法
Feb 06 #Python
解决pycharm不能自动保存在远程linux中的问题
Feb 06 #Python
Python第三方库安装缓慢的解决方法
Feb 06 #Python
python中threading和queue库实现多线程编程
Feb 06 #Python
Python3爬虫ChromeDriver的安装实例
Feb 06 #Python
You might like
全国FM电台频率大全 - 3 河北省
2020/03/11 无线电
php连接mssql的一些相关经验及注意事项
2013/02/05 PHP
PHP根据IP判断地区名信息的示例代码
2014/03/03 PHP
PHP的mysqli_thread_id()函数讲解
2019/01/24 PHP
PHP 使用位运算实现四则运算的代码
2021/03/09 PHP
让Firefox支持event对象实现代码
2009/11/07 Javascript
Dojo 学习笔记入门篇 First Dojo Example
2009/11/15 Javascript
js图片闪动特效可以控制间隔时间如几分钟闪动一下
2014/08/12 Javascript
JavaScript实现的一个日期格式化函数分享
2014/12/06 Javascript
JS实现把鼠标放到链接上出现滚动文字的方法
2016/04/06 Javascript
JS中检测数据类型的几种方式及优缺点小结
2016/12/12 Javascript
js实现tab选项卡切换功能
2017/01/13 Javascript
nodejs6下使用koa2框架实例
2017/05/18 NodeJs
ECMAScript6变量的解构赋值实例详解
2017/09/19 Javascript
vue-awesome-swiper滑块插件使用方法详解
2017/11/27 Javascript
vue脚手架搭建项目的兼容性配置详解
2018/07/17 Javascript
微信小程序template模版的使用方法
2019/04/13 Javascript
微信小程序的引导页实现代码
2020/06/24 Javascript
OpenLayer学习之自定义测量控件
2020/09/28 Javascript
[17:36]VG战队纪录片
2014/08/21 DOTA
Python实现批量检测HTTP服务的状态
2016/10/27 Python
django 修改server端口号的方法
2018/05/14 Python
Django使用中间件解决前后端同源策略问题
2019/09/02 Python
python实现飞机大战项目
2020/03/11 Python
Django表单提交后实现获取相同name的不同value值
2020/05/14 Python
Python 程序员必须掌握的日志记录
2020/08/17 Python
Python基于mediainfo批量重命名图片文件
2020/12/29 Python
Nordgreen手表德国官方网站:丹麦极简主义手表
2019/10/31 全球购物
应届生文秘专业个人自荐信格式
2013/09/21 职场文书
广告学专业毕业生自荐信
2013/09/24 职场文书
中专自我鉴定范文
2013/10/16 职场文书
《王二小》教学反思
2014/02/27 职场文书
节水倡议书范文
2014/04/15 职场文书
六一儿童节致辞稿(3篇)
2019/07/11 职场文书
初中运动会闭幕词范本3篇
2019/12/09 职场文书
JavaScript流程控制(分支)
2021/12/06 Javascript