爬取京东商品数据之(Selenium+bs4)

1、流程步骤

  1. 打开京东官网https://www.jd.com,输入关键字”LV”点击”搜索”按钮,跳转至搜索结果页;
  2. 模拟人为滑动滚动条至底部分页按钮,点击下一页;
  3. 重复2步骤,直到最后一页结束程序。
    2、爬虫分析
    通过输入关键字”LV”跳转至搜索结果页,打开开发者工具,不难发现整个商品列表页都是在#J_goodsList > ul > li层级下规律展示, 所以你只需获取到#J_goodsList > ul 标签下的所有li(一个li代表一个商品信息),然后遍历所有的li标签,用bs4获取你想要的li标签下的文本元素。
    3、实现步骤
  4. 启动webdriver,打开https://www.jd.com;
  5. 用webdriver提供的id定位方法,定位到搜索关键字输入框,输入关键字参数;
  6. 用webdriver提供的xpath定位方法,定位到放大镜按钮,模拟鼠标click事件;
  7. 因为京东商品信息多且杂,很多信息不是一次性加载,避免页面未加载完全,此时获取源码操作会报错,所以休眠5s;
  8. 用webdriver提供的xpath定位方法获取总页数,根据总页数去循环点击多少次,也就说获取多少页数据;
  9. 循环获取每页数据,每获取一页数据存入至一个sheet表,直至循环结束,把数据保存至磁盘。
    4、安装包
    import xlwt
    from bs4 import BeautifulSoup
    from selenium import webdriver
    import time
    5、代码
import xlwt
from bs4 import BeautifulSoup
from selenium import webdriver
import time
import os
import requests
driver = webdriver.Chrome()
workbook =xlwt.Workbook(encoding='utf-8')
resultlist = []
def writeExcel(good_list,flag):
    count = 0
    worksheet = workbook.add_sheet('data'+str(flag))
    worksheet.write(count, 0, '序号')
    worksheet.write(count, 1, '价格')
    worksheet.write(count, 2, '名称')
    worksheet.write(count, 3, '图片')

    for g in good_list:
            count = count + 1
            worksheet.write(count, 0, count)
            worksheet.write(count, 1, g[0])
            worksheet.write(count, 2, g[1])
            worksheet.write(count, 3, g[2])

def next_page(page):
    if page>1:
        driver.find_elements_by_xpath("//*[@id ='J_bottomPage']/span[1]/a[9]")[0].click()#模拟点击下一页按钮
    Parse_Html_Page()
    writeExcel(resultlist, page)#把结果保存至excel表格

def Parse_Html_Page():#获取每页源码存入至resultlist列表中
    resultlist.clear()#每次调用清空列表,避免每次获取数据都会累加上一页数据
    time.sleep(5)
    js = "var q=document.documentElement.scrollTop=10000"
    driver.execute_script(js)  # 因京东商品每页数据不是一次性加载出来(每次只加载30条数据),但是每页有60条数据,这样爬取数据就不对了,所以要模拟鼠标手动刷新
    time.sleep(5)#刷新完再休眠5s
    html = driver.page_source  # 加载完所有商品获取网页源码
    soup = BeautifulSoup(html, "html.parser")#用BeautifulSoup解析网页源码,便于后面获取网页信息
    #print(soup)
    goodslist = soup.select("#J_goodsList>ul>li")#用BeautifulSoup提供的css选择器select函数获取所有的li标签,也就是所有的商品信息
    #print(goodslist)
    #print(len(goodslist))
    for good in goodslist:#循环遍历商品信息存入至resultlist结果列表
        temp = []
        good_price = good.find("i").text
        good_name = good.find_all("em")[1].text
        imgsrc =good.select("div > div.p-img > a>img")#返回的类型为<class 'bs4.element.ResultSet'>,如果想操作的话需要转换为<class 'bs4.element.Tag'>
                                                      #类型,所以if条件获取时需要写成imgsrc[0]
        if imgsrc[0]["data-lazy-img"] == "done":
            image="https:"+imgsrc[0]["src"]
            print(image)
        else:
            image="https:"+imgsrc[0]["data-lazy-img"]
            print(image)
        temp.append(good_price)
        temp.append(good_name)
        temp.append(image)
        resultlist.append(temp)

def main_index(key,filename):#主函数
    driver.get("https://www.jd.com/")#打开京东首页
    driver.maximize_window()#窗口最大化
    try:
        driver.find_element_by_id("key").send_keys(key)#输入关键字
        driver.find_element_by_xpath("//div[@id='search']/div/div[2]/button").click()#模拟鼠标点击事件
        time.sleep(5)
        total=driver.find_elements_by_xpath("//div[@id='J_bottomPage']/span[2]/em/b")[0].text#获取总页数
        for i in range(1,int(total)+1):#从第一页开始遍历
            next_page(i)
    except Exception as e:
         print(e)
    workbook.save(filename + '.xls')
if __name__=="__main__":
    start_time=time.time()
    print("爬虫开始时间%s" %start_time)
    main_index("LV包", "LV包")
    end_time=time.time()
    print("共耗时%s" %(end_time-start_time))

注意:1.京东商品每页数据显示60条,非一次性加载。每次只能加载30条,所以要模拟滚动条手动刷新
2.京东商品图片有懒加载,并不是所有的图片都有src属性都有值,所以需做判断

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值