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个数据