网页源码中数据存在,使用selenum却解析不到数据的一种解决方法。

  • 问题描述:使用selenum爬取苏宁易购时,搜索手机时,在浏览器中右键检查都存在的信息,比如价格等信息,在爬虫中解析页面时解析不到数据
  • 问题分析:
    • 苏宁搜索手机加载页面时使用的是ajax加载的信息
    • 在向下滑动时,也在实时加载信息,
    • 当访问页面时,不会加载全部的信息,随着页面向下滚动,会持续发送ajax获取信息
    • 自己的爬虫程序在解析数据时,页面并没有加载全部的信息,就会出现解析出来的信息为空的情况
  • 解决方案:
    • 编写js代码,模拟鼠标的滚动时间,直到鼠标滚动到最底部时,再开始解析数据
  • 定义页面滚动的函数
def scroll_to_bottom(driver):                       # 页面滚动到底部
    js = "return action=document.body.scrollHeight"	# 获取当前页面的高度
    # 初始化现在滚动条所在高度为0
    height = 0
    # 当前窗口总高度
    new_height = driver.execute_script(js)

    while height < new_height:	# 直到滚动到页面最底部,高度不在增加
        # 将滚动条调整至页面底部
        for i in range(height, new_height, 200):
            driver.execute_script(‘window.scrollTo(0, {})‘.format(i))
            time.sleep(0.5)
        height = new_height				# 滚动完成后,跟新现在的高度。
        # time.sleep(random.random())
        new_height = driver.execute_script(js)	# 重新获取页面高度
  • 获取页面信息时,调用页面滚动到底部的函数,即可完美拿到整个页面的信息。
def index_page(page):
    ‘‘‘抓取索引页 :param page: 页码‘‘‘
    try:
        print(‘正在爬取第‘, page, ‘页‘)
        url = ‘https://search.suning.com/%s/‘%(quote(KEYWORD))
        url = ‘https://search.suning.com/%s/&iy=0&isNoResult=0&cp=%d‘%(quote(KEYWORD), page)
        browser.get(url)	# 请求网址
        #等待条件:显示当前页号,显式商品
        # wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR, ‘#mainsrp-pager li.item.active > span‘), str(page)))
        wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ‘#nextPage‘)))	# 等待,直到出现下一页的按钮
        scroll_to_bottom(browser)           # 页面滚动到底部,拿到完整的页面信息
        time.sleep(3)
        get_products(page)                  # 对完整的页面信息进行数据解析
    except TimeoutException:
        index_page(page)

相关推荐