「python爬虫」「selenium」「电商选品数据分析」商品信息抓取小白全教程(二、如何一步步定位目标元素信息)

爬虫分为四个部分,写成了四个函数写成了四个函数get_search(),get_product() ,drop_down(), next_page()

本篇主要介绍第二个函数,也是最主要的部分
对于爬虫需要的一些前置配置以及源网站获取的相关内容,可以参考上一篇文章 -> 商品信息抓取小白全教程(一、源网站的获取以及一些配置的加载)

Get_product()

def get_products(page_index):

是最为重要的功能了
这里函数的输入变量为当前页面所在的页码数字,而页码数的计算则通过后面main函数中range() 的每一项count出。

为了把结果很好的保存到xlsx文件中,(csv也可,只需很小的改动),函数中首先定义global变量方便记录xlsx中的行信息

global  write_row
接下来就是对于页面的爬取了!!!!!~
  1. 首先搞清楚自己需要什么信息
    各大Online shopping网站在搜索具体关键词之后,会给出一个表单
    这样子-来源home depot
    这样子 来源homedepot或者这样子-来源amazon
    或者这样子 来源Amazon
    我们的目的是把每一项(这里打包的一个图片对应的信息就是一项)的信息抓取来,包括但不限于商品名字,价格,评分,品牌等。

  2. 查看网站源代码
    在chrome的开发者模式下,我们需要查看源码
    屏幕停留在上述图片的位置, Macbook下键盘“Fn” + “F12”即可出现
    (我们这里只关注源码左上角的Elements,点击elements选中)
    在这里插入图片描述
    右边为网站的源码,可以试着把光标在源码上下移动(不点击),可以看见左边对应的一些位置出现了一些选中的TAG,如下
    在这里插入图片描述
    (如果没有的话,点击右边源码最左边的小三角,再试一试

这里,我们的目标是第一点所说的商品列表,所以不断点击源码的下拉小三角,直到左边的选中部分(蓝色)为我们想要的商品信息表。如下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
找到啦!~

  1. 根据使用driver.find_elements_by_css_selector来找出想要查找的表单这里为
driver.find_elements_by_css_selector('.product-pod')

上面这个函数返回的为只要对应class为(‘.product-pod’)的所有商品信息,其中每一个商品信息可以通过for item in list 获取

for li in lis:
        print("------------------ITEM--------------")
        normal_count += 1 

这里normal_count是在计算现在是第几个商品了

  1. 现在需要找到想要的商品信息是什么

比如:商品的名字,价格

对于获取商品的名字的示范

name =li.find_element_by_css_selector('span.product-pod__title__product').text #商品名字

如上通过上文介绍过的find_element_by_css_selector方法,输入对应的标签位置
在这里插入图片描述
这里的商品名字在网站源码的白色部分,而find_element_by_css_selector()的输入参数即为,这一段文字所属于的class product-pod__title__product 。并且class 前还声明了span,所以对应的输入参数即为'span.product-pod__title__product'

对于获取商品价格的示范

price = li.find_element_by_css_selector('div.price-format__main-price').text 

同样通过上文介绍过的find_element_by_css_selector方法,输入对应的标签位置

在这里插入图片描述
这里的商品价格在网站源码的白色部分标出,此时find_element_by_css_selector()的输入参数即为 这一段文字所属于的class price-format__main-price 。并且class 前还声明了div,所以对应的输入参数即为'div.price-format__main-price'

对于获取商品评分的示范

这里的商品评分是小星星的几格格数,没有特定的数字,所以这里我们模糊的使用小星星被填满的百分比作为大致的评分

score = li.find_element_by_css_selector('span.stars--c43xm').get_attribute('style')

在这里插入图片描述
根据上述情况,这里我们需要获取的信息不是网站源码的白色字体部分,而是stars的一个属性,名为style。同样的,写明class的种类和class前面的span'span.stars--c43xm'。而后根据find_element_by_css_selector自带的get_attribute()函数获取style标签写明的width blablabla信息。
P.S. 关于get_attribute()我没有找到官方的相关说明,是从这里找到的使用方法。(找不到了)

对于获取商品地址的示范~

这个抓取到csv或xlsx表格后使用很方便 建议加上~

这里的链接所属的class为header.product-pod--ie-fix, class前面有a标签,所以函数的输入为'a.header.product-pod--ie-fix'
在这里插入图片描述
同样的,对于不是text类型的信息输出,我们使用get_attribute()函数来抓取,这里函数的输入为href(链接url)。

addr = li.find_element_by_css_selector('a.header.product-pod--ie-fix').get_attribute('href')

P.S.对于Amazon亚马逊之类网站的抓取,他的商品详情页url不全,如果需要的话在抓取之后对于字符串处理需要加上一个amazon的头(http啥的)

把收集来的信息写入xlsx表格文件

write_row += 1
            worksheet.write_row('A'+str(write_row),[name,identifier,price,Favorite_count,brand,score,NumOfreviews,cur_pos,addr])
        

这一段的完整代码:

 			Favorite_count = li.find_element_by_css_selector('span.Favorite-wrapper--count').text
            brand =  li.find_element_by_css_selector('span.product-pod__title__brand--bold').text
            name =li.find_element_by_css_selector('span.product-pod__title__product').text #商品名字
            price = li.find_element_by_css_selector('div.price-format__main-price').text  
            cur_pos = str(page_index)+"-"+str(normal_count)
            #badge = li.find_element_by_css_selector('span.product-pod__badge').text
            identifier = li.find_element_by_css_selector('div.product-identifier.product-identifier__model').text 
            NumOfreviews = li.find_element_by_css_selector('span.ratings__count--6r7g3').text
            score = li.find_element_by_css_selector('span.stars--c43xm').get_attribute('style')
            
            addr = li.find_element_by_css_selector('a.header.product-pod--ie-fix').get_attribute('href')
     		print(Favorite_count,brand,name,price,identifier,score,NumOfreviews,cur_pos,addr)
            # 写入到excel
            write_row += 1
            worksheet.write_row('A'+str(write_row),[name,identifier,price,Favorite_count,brand,score,NumOfreviews,cur_pos,addr])
        

关于更多的定位元素方法,可以参考这篇-> Selenium四 find_element_by_css_selector()的几种方法
对于xpath方法的相关介绍Selenium自动化爬取某东商品信息谈谈爬虫中定位元素的常见方法
以及python爬虫之定位网页元素的三种方式

函数的完整代码:

def get_products(page_index):

    global  write_row
   
    lis = driver.find_elements_by_css_selector('.product-pod')
    normal_count = 0
    for li in lis:
        print("------------------ITEM--------------")
        normal_count += 1
        
        try:
            Favorite_count = li.find_element_by_css_selector('span.Favorite-wrapper--count').text
            brand =  li.find_element_by_css_selector('span.product-pod__title__brand--bold').text
            name =li.find_element_by_css_selector('span.product-pod__title__product').text #商品名字
            price = li.find_element_by_css_selector('div.price-format__main-price').text  
            cur_pos = str(page_index)+"-"+str(normal_count)
            #badge = li.find_element_by_css_selector('span.product-pod__badge').text
            identifier = li.find_element_by_css_selector('div.product-identifier.product-identifier__model').text 
            NumOfreviews = li.find_element_by_css_selector('span.ratings__count--6r7g3').text
            score = li.find_element_by_css_selector('span.stars--c43xm').get_attribute('style')
            
            addr = li.find_element_by_css_selector('a.header.product-pod--ie-fix').get_attribute('href')
            #addr = "https://www.homedepot.com" + addr
            #str_list = list(str(addr))
            #str_list.insert(str(addr).find("child=1") + 7, '&language=en_US')
            #addr = ''.join(str_list)
        
            
            print(Favorite_count,brand,name,price,identifier,score,NumOfreviews,cur_pos,addr)
            # 写入到excel
            write_row += 1
            worksheet.write_row('A'+str(write_row),[name,identifier,price,Favorite_count,brand,score,NumOfreviews,cur_pos,addr])
        
        except Exception as er:
            print(page_index,"-",normal_count, "Missing an item~~~~~~~~~~~")

        if normal_count == 24:
            break
        
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值