selenium翻页获取京东图书名称和价格

selenium翻页获取京东图书名称和价格

案例目的:

通过selenium翻页爬取京东图书名称和价格,介绍如何通过selenium模拟鼠标滑轮,点击,翻页等操作。

案例功能:

输入要爬取的页数,批量下载每一页数图书的名称和价格,并保存到本地。

案例分析:

1.找到目标页面的url(我们以中国当代小说为例)

在这里插入图片描述

2.通过模拟滚轮实现异步加载:

注:每一页共有60本书,但是:如果没有手动通过滑轮获取剩下的30个数据,通过xpath页只能获取30个,这就是我们为什么要模拟鼠标滑轮的原因。
在这里插入图片描述

当我们把滑轮滑倒最底部,就会得到加载剩余的30个数据:

当然,价格也是同理。
在这里插入图片描述
名称和价格的xpath,以及鼠标滑轮已经介绍完毕。

3.接下来就是通过selenuim进行翻页。

selenium翻页原理:通过定位下一页的标签,然后模拟点击操作,实现翻页。如下图:
在这里插入图片描述

这里说一下注意事项:

1.selenuim模拟浏览器时可能会因为网络的问题,加载时间延长。因此,爬取每一页数据都要设置延时操作,延时时间根据自己的网速设置。

2.在实现滑轮滑动时,scrollTop后面对应的参数是滑轮所在的位置,如果scrollTop=0就代表在最上方,我是通过调试,得到5000比较合适。
在这里插入图片描述

3.在selenium中使用find_element_by_xpath进行定位时,只是定义节点,而不是文本和属性。
在这里插入图片描述

4.关于数据保存的细节我就不多说了,我的前几篇文章介绍的都有,大家可以做参考。

分析完毕,开始上代码:

from selenium.webdriver import Chrome
import time
from lxml import etree
import json

if __name__ == '__main__':
    # 输入要去的页数
    pages = int(input('请输入要爬取的页数:'))
    # 创建浏览器
    chrome = Chrome()
    # 在网址栏输入url
    chrome.get('https://list.jd.com/list.html?cat=1713,3258,3297')
    # 创建循环
    for i in range(pages):
        # 页面等待
        time.sleep(10)
        # 通过滑轮进行异步加载
        js_ = 'document.documentElement.scrollTop=5000'
        chrome.execute_script(js_)
        time.sleep(2)
        # 获取页面数据
        html_data = chrome.page_source
        # 将数据转换成py格式
        py_data = etree.HTML(html_data)
        # 提取目标数据 1.图书名称,2.图书价格
        title_list = py_data.xpath('//div[@class="gl-i-wrap"]/div[@class="p-name"]/a/em/text()')
        price_list = py_data.xpath('//strong/i/text()')
        print(len(title_list))
        print(len(price_list))
        # 将输入存进字典,并转换成json格式
        for i in range(len(title_list)):
            dict_ = {}
            dict_[title_list[i]] = price_list[i]
            # 将字典转换成json格式数据
            json_data = json.dumps(dict_,ensure_ascii=False)+',\n'
            # 将json数据保存到本地
            with open('京东图书名称和价格.json','a',encoding='utf-8')as f:
                f.write(json_data)
        # 模拟点击下一页
        click_obj = chrome.find_element_by_xpath('//span/a[@class="pn-next"]')
        # 模拟点击
        click_obj.click()
    # 爬取过程完成后,关闭浏览器
    chrome.quit()

我一共爬取了3页。每页对应60个数据

爬取结果如下:

在这里插入图片描述