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实现的生成自我描述脚本分享(很有意思的程序)
Jul 18 Python
python实现ipsec开权限实例
Nov 11 Python
从CentOS安装完成到生成词云python的实例
Dec 01 Python
Python使用装饰器进行django开发实例代码
Feb 06 Python
详解Python发送email的三种方式
Oct 18 Python
python队列Queue的详解
May 10 Python
Python如何实现小程序 无限求和平均
Feb 18 Python
利用python绘制数据曲线图的实现
Apr 09 Python
Python使用sqlite3模块内置数据库
May 07 Python
详解python安装matplotlib库三种失败情况
Jul 28 Python
OpenCV+python实现膨胀和腐蚀的示例
Dec 21 Python
使用python生成大量数据写入es数据库并查询操作(2)
Sep 23 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
简单易用的计数器(数据库)
2006/10/09 PHP
PHP学习之PHP运算符
2006/10/09 PHP
php相对当前文件include其它文件的方法
2015/03/13 PHP
PHP数组操作简单案例分析
2016/10/15 PHP
一键生成各种尺寸Icon的php脚本(实例)
2017/02/08 PHP
浅谈thinkphp的nginx配置,以及重写隐藏index.php入口文件方法
2019/10/12 PHP
Js之软键盘实现(js源码)
2007/01/30 Javascript
刷新时清空文本框内容的js代码
2007/04/23 Javascript
两个Javascript小tip资料
2010/11/23 Javascript
javascript学习笔记(十一) 正则表达式介绍
2012/06/20 Javascript
JavaScript高级程序设计(第3版)学习笔记6 初识js对象
2012/10/11 Javascript
JavaScript中的标签语句用法分析
2015/02/10 Javascript
基于javascript代码检测访问网页的浏览器呈现引擎、平台、Windows操作系统、移动设备和游戏系统
2015/12/03 Javascript
微信小程序教程系列之新建页面(4)
2017/04/17 Javascript
jQuery查找dom的几种方法效率详解
2017/05/17 jQuery
jQuery实现可兼容IE6的遮罩功能详解
2017/09/19 jQuery
three.js中文文档学习之如何本地运行详解
2017/11/20 Javascript
用Node提供静态文件服务的方法
2018/07/06 Javascript
js+html5实现手机九宫格密码解锁功能
2018/07/30 Javascript
node创建Vue项目步骤详解
2020/03/06 Javascript
vue界面发送表情的实现代码
2020/09/11 Javascript
vue中是怎样监听数组变化的
2020/10/24 Javascript
[47:38]Optic vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python中使用scapy模拟数据包实现arp攻击、dns放大攻击例子
2014/10/23 Python
利用arcgis的python读取要素的X,Y方法
2018/12/22 Python
Python实现的微信红包提醒功能示例
2019/08/22 Python
python元组和字典的内建函数实例详解
2019/10/22 Python
如何关掉pycharm中的python console(图解)
2019/10/31 Python
Python3实现发送邮件和发送短信验证码功能
2020/01/07 Python
薇诺娜官方网上商城:专注敏感肌肤
2017/05/25 全球购物
高中自我鉴定范文
2013/11/03 职场文书
大学生旷课检讨书
2014/01/22 职场文书
老公保证书范文
2014/04/29 职场文书
慰问信格式
2015/02/14 职场文书
卡特教练观后感
2015/06/08 职场文书
Golang 并发下的问题定位及解决方案
2022/03/16 Golang