由于唯品会是利用js动态生成html作为反爬机制,所以不能用以前的爬取html的方法进行爬取,本程序是用selenium+PhantomJS对唯品会进行爬取,可以根据需要输入要爬取的商品,还有爬取的起始页和结束页。
程序代码以及注释的内容如下:
from time import sleep import os from selenium import webdriver from urllib import parse from bs4 import BeautifulSoup import csv # 定义唯品会的爬虫类 class WeiPinhuiSpider(object): # 初始化函数 def __init__(self,url,startpage,endpage,data): self.url = url self.startpage = startpage self.endpage = endpage self.data = data # 解析函数,从源码中提取需要的信息,例如图片,价格等 def AnalysisData(self,page): # 以下三行是处理url,把页数还有要爬取的商品编码后拼接到url'中 self.data["page"]=page url = self.url url += parse.urlencode(self.data) # 创建PhantomJS的对象 driver = webdriver.PhantomJS() # 发起请求 driver.get(url) # 睡眠一会是为了让网页加载完成 sleep(5) # 因为唯品会的是一个下拉加载和分页结合的网页,这里是 # 设置自动下拉 js = "document.body.scrollTop='20000'" for i in range(10): driver.execute_script(js) sleep(2) # 读取源码,不能下载,因为唯品会的是动态页面, # 下载下来是js的代码,无法解析的 html = driver.page_source # 创建Beautiful对象 soup = BeautifulSoup(html,'lxml') # 下面的分别是提取照片的url,折扣信息,价格信息,原价信息,介绍信息 imgList = soup.select(".goods-image-link") discountList = soup.select(".goods-discount") priceList = soup.select(".goods-sells-price") marketPriceList = soup.select(".goods-market-price") titleList = soup.select("h4 a") # 定义一个列表,获取每一页的信息返回 infoList = [] for i in range(len(imgList)): # 定义字典,把每一个内容存储到字典 infoDict = {} infoDict['title']=titleList[i]["title"] infoDict['price']=priceList[i].get_text() infoDict['upprice'] = marketPriceList[i].get_text() infoDict['discount']=discountList[i].get_text() infoDict['imgurl']="http:"+imgList[i].select("img")[0]["data-original"] infoList.append(infoDict) return infoList # 该函数是用来把数据存储到csv文件中 def writeFIle(self,infoList): filenames = ["title","price","upprice","discount","imgurl"] with open("weipinhui.csv",'w',errors="ignore") as fp: for info in infoList: csvll = csv.DictWriter(fp,fieldnames=filenames) csvll.writerow(info) # 该函数是该类的一个接口函数,提供给外部调用 def Interface(self): allInfoList=[] for page in range(self.startpage,self.endpage+1): allInfoList +=self.AnalysisData(page) print(len(allInfoList)) self.writeFIle(allInfoList) if __name__ == '__main__': url = "https://category.vip.com/suggest.php?" keyword = input("请输入需要爬取的内容:") startpage = int(input("请输入起始页:")) endpage = int(input("请输入结束页:")) data={ "keyword":keyword } theSpider = WeiPinhuiSpider(url=url,startpage=startpage,endpage=endpage,data=data) theSpider.Interface()
运行后的截图如下: