python+selenium+PhantomJS爬取唯品会

由于唯品会是利用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()
 

运行后的截图如下:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值