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线程锁(thread)学习示例
Dec 04 Python
python基础学习之如何对元组各个元素进行命名详解
Jul 12 Python
Python数据分析matplotlib设置多个子图的间距方法
Aug 03 Python
Django中使用第三方登录的示例代码
Aug 20 Python
使用python将最新的测试报告以附件的形式发到指定邮箱
Sep 20 Python
python元组的概念知识点
Nov 19 Python
keras 使用Lambda 快速新建层 添加多个参数操作
Jun 10 Python
python中执行smtplib失败的处理方法
Jul 01 Python
深入分析python 排序
Aug 24 Python
python里glob模块知识点总结
Jan 05 Python
如何在Python中创建二叉树
Mar 30 Python
pandas中pd.groupby()的用法详解
Jun 16 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
PHP中文件读、写、删的操作(PHP中对文件和目录操作)
2012/03/06 PHP
php遍历类中包含的所有元素的方法
2015/05/12 PHP
php计算整个目录大小的方法
2015/06/19 PHP
简单通用的JS滑动门代码
2008/12/19 Javascript
JavaScript Event学习第五章 高级事件注册模型
2010/02/07 Javascript
js DataSet数据源处理代码
2010/03/29 Javascript
script标签的 charset 属性使用说明
2010/12/04 Javascript
基于jquery实现漂亮的动态信息提示效果
2011/08/02 Javascript
js变换显示图片的实例
2013/04/16 Javascript
onkeypress字符按键兼容所有浏览器使用介绍
2013/04/24 Javascript
jquery禁用右键单击功能屏蔽F5刷新
2014/03/17 Javascript
alert和confirm功能介绍
2014/05/21 Javascript
js兼容火狐获取图片宽和高的方法
2015/05/21 Javascript
jQuery实现的导航下拉菜单效果示例
2016/09/05 Javascript
Vue组件BootPage实现简单的分页功能
2016/09/12 Javascript
详解Vue2 无限级分类(添加,删除,修改)
2017/03/07 Javascript
浅谈Vue组件及组件的注册方法
2018/08/24 Javascript
bootstrapTable+ajax加载数据 refresh更新数据
2018/08/31 Javascript
React 实现拖拽功能的示例代码
2019/01/06 Javascript
async/await让异步操作同步执行的方法详解
2019/11/01 Javascript
Python中使用PyQt把网页转换成PDF操作代码实例
2015/04/23 Python
栈和队列数据结构的基本概念及其相关的Python实现
2015/08/24 Python
pandas 取出表中一列数据所有的值并转换为array类型的方法
2018/04/11 Python
python 实现对文件夹内的文件排序编号
2018/04/12 Python
python使用epoll实现服务端的方法
2018/10/16 Python
Python基础学习之函数方法实例详解
2019/06/18 Python
详解Python3中setuptools、Pip安装教程
2019/06/18 Python
Python基于Opencv来快速实现人脸识别过程详解(完整版)
2019/07/11 Python
python实现的分层随机抽样案例
2020/02/25 Python
python开发入门——列表生成式
2020/09/03 Python
思想品德自我鉴定
2013/10/12 职场文书
新闻学专业求职信
2014/07/28 职场文书
标准单位租车协议书
2014/09/23 职场文书
预备党员群众路线思想汇报2014
2014/10/25 职场文书
房屋质量投诉书
2015/07/02 职场文书
高通2023 年将发布高性能PC处理器
2022/04/29 数码科技