Python爬虫技术系列-04Selenium库案例
1 Selenium库基本使用
1.1 Selenium库安装
- 安装Selenium:
pip install selenium==3.141.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
- 安装selenium库之后,还要安装浏览器,一般本地都已经安装完毕,本书采用chrome浏览器,打开浏览器,在地址栏输入Chrome://version,可以查看到浏览器的版本,如下图所示:
- 确定版本后,可以下载对应的驱动。
Selenium支持多种浏览器驱动,包括Chrome,opera,safari,firefox。为对应chrome浏览器,本例选用chrome驱动,驱动的下载地址为
https://chromedriver.storage.googleapis.com/index.html
选择对应版本驱动chromedriver.exe,下载到本地,放在工程路径下即可。
1.2 Selenium库介绍
Selenium包含一系列工具和库,这些工具和库支持web浏览器的自动化。Selenium库最初用于自动化测试,但也可以应用数据爬取的场景。
有的网页中的信息需要执行js才能显现,这就导致requests库爬取到的源代码与浏览器端看到的数据不一致,这种情况可以通过selenium进行爬取,Selenium会模拟浏览器,爬取执行 js 后的网页数据,实现“所见即所得”。尽管Selenium爬取数据的效率要低很多,但在一些不易爬取的网页中,有着神奇的效果。
2 Selenium使用案例
2.1 京东页面分析
在上一小节,完成了selenium的基本介绍,本小节通过使用selenium打开京东首页,并在搜索栏模拟输入“python爬虫”,模拟点击回车键如下图所示。
在开发者工具中可以查看到搜索框input元素的id为key,通过selenium可获取该元素,send_keys方法,输入“python爬虫”和模拟回车点击。回车点击后跳转到“python爬虫”商品页,可以查看到返回的商品列表,如图所示:
在商品列表页中通过开发者工具可以查看“python爬虫”商品的基本信息,可以看到每个商品都位于li标签中,li标签有一个class属性,属性值为gl-item。
进一步分析,可以看到商品列表页,,如商品链接,商品名称,商品价格,商品评论人数等信息,如图所示:
通过开发者工具可以看出,商品链接位于li标签中a标签的href属性中。商品名称位于class属性为p-name的div标签下得em标签中,并有换行。商品价格信息位于class属性为p-price的div标签中的i标签中,由于图片大小问题,没有展开显示。商品评论人数信息位于class属性为p-commit的a标签中,由于图片大小问题,没有展开显示。
2.2 京东页面采集
经过上面的分析,代码实现如下:
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys # 键盘按键操作
# 访问京东首页 并输入关键字进行搜索
def spider(url, keyword):
goods_info = [] # 定义空列表接受商品信息
driver = webdriver.Chrome(executable_path='./chromedriver.exe') # 实例化浏览器
driver.get(url) # 模拟浏览器发送请求
driver.implicitly_wait(3) # 等待页面加载完毕
# 定位到搜索框
input_tag = driver.find_element_by_xpath('//*[@id="key"]')
# 模拟键盘输入关键字
input_tag.send_keys(keyword)
# 模拟键盘输入enter
input_tag.send_keys(Keys.ENTER)
# 等待5s 避免访问过于密集,本例中没有循环爬取,仅做演示
time.sleep(5)
# 调用get_goods函数
result = get_goods(driver=driver,good_list=goods_info)
return result
# 抓取跳转到商品列表页的浏览器信息
def get_goods(driver, good_list):
goods_comments = {} # 存储一个商品的信息
# 查找商品列表li
jd_goods = driver.find_elements_by_class_name('gl-item')
for jd_good in jd_goods:
link = jd_good.find_element_by_tag_name('a').get_attribute('href') # 获取地址
name = jd_good.find_element_by_css_selector('.p-name em').text.replace('\n', '') # css选择器 获取商品名称
price = jd_good.find_element_by_css_selector('.p-price i').text # 价格
commit = jd_good.find_element_by_css_selector('.p-commit a').text # 评论
goods_comments["link"] = link
goods_comments["name"] = name
goods_comments["price"] = price
goods_comments["commit"] = commit
good_list.append(goods_comments)
goods_comments = {}
driver.close()
return good_list
if __name__ == '__main__':
jd_index = 'https://www.jd.com/' # 京东首页
kw = 'python爬虫' # 搜索关键字
jd_good_result = spider(url=jd_index, keyword=kw ) # 获得关键字的商品信息
for i in jd_good_result:
print(i) # 输出商品信息
上面代码的含义可以结合前面图的分析阶段以及打码中的注释理解,输入结果如下:
{‘link’: ‘https://item.jd.com/10037672406859.html’, ‘name’: ‘Python编程实战100例 (微课视频版)核心编程应用实例图形界面编程自动化编程网络数据分析Office自动化图形界面编程数据库开发网络编程数据分析人工智能编程从入门到实践 Py’, ‘price’: ‘53.88’, ‘commit’: ‘200+’}
…
{‘link’: ‘https://item.jd.com/12699866.html’, ‘name’: ‘【自营】python编程入门指南 Web/Django/Pygame/Flask Web/网络/可搭C语言/java/HTML/CSS/C#/C++/PHP’, ‘price’: ‘80.00’, ‘commit’: ‘2000+’}
备注:由于考虑到避免给网站运营带来压力,本例不提供循环爬取的示例代码,有问题,可以评论交流。