苏宁易购上对于冰箱的价格信息,是被Js渲染过的,无法通过request、bs4库或者是scrapy直接爬取下来的,所以今天学习并使用了selenium库,并将所有冰箱的价格及型号全部保存在csv中。
- 使用selenium库之前,需要在网站上下载Chromedeiver,而且必须下载配套自己谷歌浏览器版本的,网站是:http://npm.taobao.org/mirrors/chromedriver
- 配套上time库,因为js渲染加载需要一定的时间,如果没有充足的时间把物品信息加载出来的话,会导致爬取不全,爬到非常少的相关冰箱信息。
time.sleep()
参数是秒。 - 在第一面刚刚打开网站的时候,会有一个大广告,所以selenium库正好可以操作一个botton按钮,click进行关闭,自动化库的使用过程就是模拟一个人的使用,如果不关闭广告的话我们也是无法就像是用这个网站的。
- 模拟网站下拉操作,下拉可以使后续的网页信息加载Js,越往下拉数据越多,本人在下拉的整个过程中使网页停止了20秒,给网页充足的时间显示信息。
- 对价格、型号的xpath进行解析,对于获取所有信息。
- 显示并保存到csv中,不知道为什么在爬取所有的信息的时候,会出现空行,应该是有这样的xpath标签但是其中没有任何数据,也是为了更好的保存到csv中,我们把每个对应的值保存在一个字符串中,对字符串进行判断,如果不为空显示且保存。(最后保证数据的可视化)
- 对于1-40的网页我们使用按钮点击,click每个网页的下方右键按钮,每次点击都会调转到下一页上,苏宁的冰箱对于网页的操作作死没有数字,用的是second。。。所以只能够用selenium模拟点击。所有操作循环来进行。
- 保存在csv表格一定要注意设置encoding,否则乱码。因为下一页算是追加信息,文件读取类型里,我们使用a来做文件的标注。追加不留空行,要加入newline。
这就是所有用爬虫爬取到的代码信息,以后可以套模板了:
import selenium
from selenium import webdriver
import time
import csv
import codecscsvFile=open('C:\\Users\\JYuXuAN\\Desktop\\sn.csv','a',encoding='utf-8-sig', newline="")
writer=csv.writer(csvFile)
writer.writerow(['价格','冰箱信息'])driver = webdriver.Chrome(executable_path='C:\\Users\\JYuXuAN\\AppData\\Local\\CentBrowser\\Application\\chromedriver.exe')
driver.get('https://search.suning.com/%E5%86%B0%E7%AE%B1/')botton=driver.find_element_by_class_name('close-btn')
time.sleep(2)
botton.click()num=1
while(num!=40):driver.execute_script("""(function () {var y = 0;var step = 100;window.scroll(0, 0);function f() {if (y < document.body.scrollHeight) {y += step;window.scroll(0, y);setTimeout(f, 100);} else {window.scroll(0, 0);document.title += "scroll-done";}}setTimeout(f, 1000);})();""")time.sleep(20)price=driver.find_elements_by_xpath('//span[@class="def-price"]')info=driver.find_elements_by_xpath('//div[@class="title-selling-point"]/a[1]')for p,i in zip(price,info):s1=""+str(p.text)s2=""+str(i.text)if(s1!=''):print("价格为:"+s1,end=" ")print("物品信息:"+s2)writer.writerow([s1,s2])botton2=driver.find_element_by_class_name('next')time.sleep(1)botton2.click()num=num+1