爬虫分为四个部分,写成了四个函数写成了四个函数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
接下来就是对于页面的爬取了!!!!!~
-
首先搞清楚自己需要什么信息
各大Online shopping网站在搜索具体关键词之后,会给出一个表单
这样子 来源homedepot
或者这样子 来源Amazon
我们的目的是把每一项(这里打包的一个图片对应的信息就是一项)的信息抓取来,包括但不限于商品名字,价格,评分,品牌等。 -
查看网站源代码
在chrome的开发者模式下,我们需要查看源码
屏幕停留在上述图片的位置, Macbook下键盘“Fn” + “F12”即可出现
(我们这里只关注源码左上角的Elements,点击elements选中)
右边为网站的源码,可以试着把光标在源码上下移动(不点击),可以看见左边对应的一些位置出现了一些选中的TAG,如下
(如果没有的话,点击右边源码最左边的小三角,再试一试
这里,我们的目标是第一点所说的商品列表,所以不断点击源码的下拉小三角,直到左边的选中部分(蓝色)为我们想要的商品信息表。如下
找到啦!~
- 根据使用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是在计算现在是第几个商品了
- 现在需要找到想要的商品信息是什么
比如:商品的名字,价格
对于获取商品的名字的示范
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