「python爬虫」「selenium」「电商选品数据分析」商品信息抓取小白全教
爬虫分为四个部分,写成了四个函数写成了四个函数(),() ,(), ()
本篇主要介绍第二个函数,也是最主要的部分
对于爬虫需要的一些前置配置以及源网站获取的相关内容,可以参考上一篇文章 -> 商品信息抓取小白全教程(一、源网站的获取以及一些配置的加载)
()
def get_products(page_index):
是最为重要的功能了
这里函数的输入变量为当前页面所在的页码数字,而页码数的计算则通过后面main函数中range() 的每一项count出。
为了把结果很好的保存到xlsx文件中,(csv也可,只需很小的改动),函数中首先定义变量方便记录xlsx中的行信息
global write_row
接下来就是对于页面的爬取了!!!!!~
首先搞清楚自己需要什么信息
各大 网站在搜索具体关键词之后,会给出一个表单
这样子 来源
或者这样子 来源
我们的目的是把每一项(这里打包的一个图片对应的信息就是一项)的信息抓取来,包括但不限于商品名字,价格,评分,品牌等。
查看网站源代码
在的开发者模式下,我们需要查看源码
屏幕停留在上述图片的位置, 下键盘“Fn” + “F12”即可出现
(我们这里只关注源码左上角的,点击选中)
右边为网站的源码,可以试着把光标在源码上下移动(不点击),可以看见左边对应的一些位置出现了一些选中的TAG,如下
(如果没有的话,点击右边源码最左边的小三角,再试一试
这里,我们的目标是第一点所说的商品列表,所以不断点击源码的下拉小三角,直到左边的选中部分(蓝色)为我们想要的商品信息表。如下
找到啦!~
根据使用.来找出想要查找的表单这里为
driver.find_elements_by_css_selector('.product-pod')
上面这个函数返回的为只要对应class为(‘.-pod’)的所有商品信息,其中每一个商品信息可以通过for item in list 获取
for li in lis:print("------------------ITEM--------------")normal_count += 1
这里是在计算现在是第几个商品了
现在需要找到想要的商品信息是什么
比如:商品的名字,价格
对于获取商品的名字的示范
name =li.find_element_by_css_selector('span.product-pod__title__product').text #商品名字
如上通过上文介绍过的方法,输入对应的标签位置
这里的商品名字在网站源码的白色部分,而()的输入参数即为,这一段文字所属于的class - 。并且class 前还声明了span,所以对应的输入参数即为'span.-'
对于获取商品价格的示范
price = li.find_element_by_css_selector('div.price-format__main-price').text
同样通过上文介绍过的方法,输入对应的标签位置
这里的商品价格在网站源码的白色部分标出,此时()的输入参数即为 这一段文字所属于的class price--price 。并且class 前还声明了div,所以对应的输入参数即为'div.price--price'
对于获取商品评分的示范
这里的商品评分是小星星的几格格数,没有特定的数字,所以这里我们模糊的使用小星星被填满的百分比作为大致的评分
score = li.find_element_by_css_selector('span.stars--c43xm').get_attribute('style')
根据上述情况,这里我们需要获取的信息不是网站源码的白色字体部分,而是stars的一个属性,名为style。同样的,写明class的种类和class前面的span'span.stars--c43xm'。而后根据自带的()函数获取style标签写明的width 信息。
P.S. 关于()我没有找到官方的相关说明,是从这里找到的使用方法。(找不到了)
对于获取商品地址的示范~ 这个抓取到csv或xlsx表格后使用很方便 建议加上~
这里的链接所属的class为.-pod--ie-fix, class前面有a标签,所以函数的输入为'a..-pod--ie-fix'
同样的,对于不是text类型的信息输出,我们使用()函数来抓取,这里函数的输入为href(链接url)。
addr = li.find_element_by_css_selector('a.header.product-pod--ie-fix').get_attribute('href')
P.S.对于亚马逊之类网站的抓取,他的商品详情页url不全,如果需要的话在抓取之后对于字符串处理需要加上一个的头(http啥的)
把收集来的信息写入xlsx表格文件
write_row += 1worksheet.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').textbrand = li.find_element_by_css_selector('span.product-pod__title__brand--bold').textname =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').textidentifier = li.find_element_by_css_selector('div.product-identifier.product-identifier__model').text NumOfreviews = li.find_element_by_css_selector('span.ratings__count--6r7g3').textscore = 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)# 写入到excelwrite_row += 1worksheet.write_row('A'+str(write_row),[name,identifier,price,Favorite_count,brand,score,NumOfreviews,cur_pos,addr])
关于更多的定位元素方法,可以参考这篇-> 四 ()的几种方法
对于xpath方法的相关介绍自动化爬取某东商品信息和谈谈爬虫中定位元素的常见方法
以及爬虫之定位网页元素的三种方式
函数的完整代码:
def get_products(page_index):global write_rowlis = driver.find_elements_by_css_selector('.product-pod')normal_count = 0for li in lis:print("------------------ITEM--------------")normal_count += 1try:Favorite_count = li.find_element_by_css_selector('span.Favorite-wrapper--count').textbrand = li.find_element_by_css_selector('span.product-pod__title__brand--bold').textname =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').textidentifier = li.find_element_by_css_selector('div.product-identifier.product-identifier__model').text NumOfreviews = li.find_element_by_css_selector('span.ratings__count--6r7g3').textscore = 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)# 写入到excelwrite_row += 1worksheet.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