Selenium爬虫实战丨Python爬虫实战系列(8)

个人主页:互联网阿星
格言:选择有时候会大于努力,但你不努力就没得选
作者简介:大家好我是互联网阿星,和我一起合理使用Python,努力做时间的主人
如果觉得博主的文章还不错的话,请点赞+收藏⭐️+留言支持一下博主哦

Selenium爬虫实战丨Python爬虫实战系列(8)_第1张图片
行业资料:PPT模板、简历模板、行业经典书籍PDF
面试题库:历年经典、热乎的大厂面试真题,持续更新中…
学习资料:含Python基础、爬虫、数据分析、算法等学习视频和文档
Tips:以上资料·阿星已备好>>戳我,空投直达


阿星文章·目录

  • 前言
  • Selenium爬虫实战应用
    • 实战案例目标
    • 实现自动搜索
    • 滚动滑动条
    • 实现翻页抓取
    • 完整程序代码
  • 小结


前言

本节讲解 Python Selenium 爬虫实战案例,通过对实战案例的讲解,进一步认识 Selenium 框架。Selenium是一个用电脑模拟人操作浏览器网页,可以实现自动化,测试等。

Selenium爬虫实战应用

实战案例目标

在这里插入图片描述Selenium爬虫实战丨Python爬虫实战系列(8)_第2张图片
Selenium 框架的学习重点在于定位元素节点。关于如何定位,我们有以下 8 种方法:

定位节点方法
方法 说明
find_element_by_id() 通过 id 属性值定位
find_element_by_name() 通过 name 属性值定位
find_element_by_class_name() 通过 class 属性值定位
find_element_by_tag_name() 通过 tag 标签名定位
find_element_by_link_text() 通过标签内文本定位,即精准定位。
find_element_by_partial_link_text() 通过标签内部分文本定位,即模糊定位。
find_element_by_xpath() 通过 xpath 表达式定位
find_element_by_css_selector() 通过 css 选择器定位

其中 Xpath 表达式适用性强,并且便捷。因此,建议大家多多熟悉 Xpath 表达式的相关语法规则。本节案例中很大一部分采用了 Xpath 表达式定位元素,希望帮助您温故知新。

本节案例中涉及了几个技术难点:第一,如何下拉滚动条下载sp,第二,如何实现翻页,也就是抓取下一页的内容,第三,如何判断数据已经抓取完毕,即终止页。下面我们逐步讲解。

实现自动搜索

实现自动输出、自动搜索是最基础的一步。首先定位输入框的的节点,其次定位搜索按钮节点,这与实现百度自动搜索思路一致,最关键就是要正确定位元素节点。

通过开发者调试工具检查相应的的位置,可得如下 Xpath 表达式:

输入框表达式://*[@id="key"]
搜索按钮表达式://*[@class='form']/button

代码如下所示:

from selenium import webdriver

broswer=webdriver.Chrome()
broswer.get('jd网址')
broswer.find_element_by_xpath('//*[@id="key"]').send_keys("python书籍")
broswer.find_element_by_xpath("//*[@class='form']/button").click()

滚动滑动条

实现了自动搜索后,接下来就是要抓取页面中的sp信息,而您会发现只有将滑动条滚动至底部,sp才会全部加载完毕。滚动滑轮操作的代码如下:

# scrollTo(xpos,ypos)
# execute_script()执行js语句,拉动进度条件
#scrollHeight属性,表示可滚动内容的高度
self.browser.execute_script(
      'window.scrollTo(0,document.body.scrollHeight)'#拉动进度条至底部
)

之后在通过 Xpath 表达式匹配所有sp,并将它们放入一个大列表中,通过循环列表取出每个sp,最后提取出想要的信息。

li_list=self.browser.find_elements_by_xpath('//*[@id="J_goodsList"]/ul/li')

for li in li_list:
item={} 
# 提取sp名
item['name']=li.find_element_by_xpath('.//div[@class="p-name"]/a/em').text.strip()
# 提取价格
item['price']=li.find_element_by_xpath('.//div[@class="p-price"]').text.strip()
# 提取评论数量
item['count']=li.find_element_by_xpath('.//div[@class="p-commit"]/strong').text.strip()
# 提取商家店铺
item['shop']=li.find_element_by_xpath('.//div[@class="p-shopnum"]').text.strip()

实现翻页抓取

如何实现翻页抓取数据,并判断数据数据已经抓取完毕呢?这其实并不难想到,我们可以先跳至终止页(即最后一页)。此时最后一页的“下一页”处于不可用状态,其元素节点如下:

终止页下一页class属性:"pn-next disabled">下一页 > 
其他页下一页class属性:"pn-next" οnclick="SEARCH.page(3, true)" ...>下一页 > 

如果页面源码中有上述代码存在,则证明此页是最后一页,若没有则不是。因此通过 if …else 语句即可实现上述需求,如下所示:

#-1说明没找到,不是最后一页,执行点击 “下一页” 操作
if self.browser.page_source.find('pn-next disabled')==-1:
    browser.find_element_by_class_name('pn-next').click()

完整程序代码

完整程序代码如下所示:

  • 阿星提醒:不做代码伸手党~仔细看看,主要是学习其中的方法
#coding:utf8
from selenium import webdriver
import time
import pymongo

class JdSpider(object):
    def __init__(self):
        self.url='jd网址'
        self.options=webdriver.ChromeOptions() # 无头模式
        self.options.add_argument('--headless')
        self.browser=webdriver.Chrome(options=self.options) # 创建无界面参数的浏览器对象
        self.i=0  #计数,一共有多少件sp

        #输入地址+输入sp+点击按钮,切记这里元素节点是京东首页的输入栏、搜索按钮
    def get_html(self):
        self.browser.get(self.url)
        self.browser.find_element_by_xpath('//*[@id="key"]').send_keys('python书籍')
        self.browser.find_element_by_xpath("//*[@class='form']/button").click()

        #把进度条件拉倒最底部+提取sp信息
    def get_data(self):
        # 执行js语句,拉动进度条件
        self.browser.execute_script(
            'window.scrollTo(0,document.body.scrollHeight)'
        )
        # 给页面元素加载时预留时间
        time.sleep(2)
        #用 xpath 提取每页中所有sp,最终形成一个大列表
        li_list=self.browser.find_elements_by_xpath('//*[@id="J_goodsList"]/ul/li')

        for li in li_list:
            #构建空字典
            item={}  
            item['name']=li.find_element_by_xpath('.//div[@class="p-name"]/a/em').text.strip()
            item['price']=li.find_element_by_xpath('.//div[@class="p-price"]').text.strip()
            item['count']=li.find_element_by_xpath('.//div[@class="p-commit"]/strong').text.strip()
            item['shop']=li.find_element_by_xpath('.//div[@class="p-shopnum"]').text.strip()
            print(item) 
            self.i+=1

    def run(self):
        #搜索出想要抓取sp的页面
        self.get_html()
        #循环执行点击“下一页”操作
        while True:
            #获取每一页要抓取的数据
            self.get_data()
            #判断是否是最一页
            if self.browser.page_source.find('pn-next disabled')==-1:
                self.browser.find_element_by_class_name('pn-next').click()
                #预留元素加载时间
                time.sleep(1)
            else:
                print('数量',self.i)
                break


if __name__ == '__main__':
    spider=JdSpider()
    spider.run()

输出结果如下:
Selenium爬虫实战丨Python爬虫实战系列(8)_第3张图片
Selenium 自动化爬虫让你无须关心网站的类型(静态或者动态),只需您按部就班的寻找元素节点,并依此点击,即可实现数据抓取。

不过 Selenium 最大的缺点就是效率低,因此它只适合做小规模的数据采集工作。


小结

Selenium爬虫实战丨Python爬虫实战系列(8) 就到这了,在学爬虫的老铁记得持续关注,阿星祝你早日修炼成为爬虫大佬如果觉得博主的文章还不错的话,请点赞+收藏⭐️+留言支持一下博主哦

学习资料:含Python基础、爬虫、数据分析、算法等学习视频和文档
行业资料:添加即可领取PPT模板、简历模板、行业经典书籍PDF
面试题库:历年经典,热乎的大厂面试真题,持续更新中…
资料已备好,戳我文末名片领…√


资料已备好戳我名片领‍

在这里插入图片描述

你可能感兴趣的:(python,爬虫,selenium,网络爬虫,爬虫案例)