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中List的sort方法指南
Sep 01 Python
Python中查看文件名和文件路径
Mar 31 Python
Python中sort和sorted函数代码解析
Jan 25 Python
Python任意字符串转16, 32, 64进制的方法
Jun 12 Python
django2笔记之路由path语法的实现
Jul 17 Python
深入了解Python在HDA中的应用
Sep 05 Python
python读写Excel表格的实例代码(简单实用)
Dec 19 Python
Python内置数据类型list各方法的性能测试过程解析
Jan 07 Python
python 一维二维插值实例
Apr 22 Python
Python基于os.environ从windows获取环境变量
Jun 09 Python
django form和field具体方法和属性说明
Jul 09 Python
python神经网络ResNet50模型
May 06 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经典面试题集锦
2015/03/19 PHP
android上传图片到PHP的过程详解
2015/08/03 PHP
XHProf报告字段含义的解析
2016/05/17 PHP
PHP如何读取由JavaScript设置的Cookie
2017/03/22 PHP
用js来解决ajax读取页面乱码
2010/11/28 Javascript
jquery getScript动态加载JS方法改进详解
2012/11/15 Javascript
举例讲解AngularJS中的模块
2015/06/17 Javascript
轻松搞定jQuery.noConflict()
2016/02/15 Javascript
JS设置cookie、读取cookie
2016/02/24 Javascript
JavaScript实现256色转灰度图
2017/02/22 Javascript
node.js实现微信JS-API封装接口的示例代码
2017/09/06 Javascript
ES6学习教程之对象字面量详解
2017/10/09 Javascript
浅谈express.js框架中间件(middleware)
2019/04/07 Javascript
小程序实现上传视频功能
2020/08/18 Javascript
JavaScript逻辑运算符相关总结
2020/09/04 Javascript
python 简单的多线程链接实现代码
2016/08/28 Python
浅谈Python实现Apriori算法介绍
2017/12/20 Python
用python实现对比两张图片的不同
2018/02/05 Python
Python实现XML文件解析的示例代码
2018/02/05 Python
django项目搭建与Session使用详解
2018/10/10 Python
pandas通过索引进行排序的示例
2018/11/16 Python
pandas使用apply多列生成一列数据的实例
2018/11/28 Python
PyQt5固定窗口大小的方法
2019/06/18 Python
python的移位操作实现详解
2019/08/21 Python
基于selenium及python实现下拉选项定位select
2020/07/22 Python
python获取整个网页源码的方法
2020/08/03 Python
python 利用Pyinstaller打包Web项目
2020/10/23 Python
python使用yaml 管理selenium元素的示例
2020/12/01 Python
德国网上药房:Apotal
2017/04/04 全球购物
StubHub澳大利亚:购买或出售您的门票
2019/08/01 全球购物
Emma Bridgewater官网:英国餐具制造商
2019/11/24 全球购物
MySQL面试题目集锦
2016/04/14 面试题
办公室内勤工作职责
2013/12/11 职场文书
防卫过当辩护词
2015/05/21 职场文书
步步惊心观后感
2015/06/12 职场文书
Python中相见恨晚的技巧
2021/04/13 Python