专业编程基础技术教程

网站首页 > 基础教程 正文

一文搞懂爬虫神器selenium常见操作

ccvgpt 2024-11-17 07:27:55 基础教程 5 ℃

一、什么是selenium

Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium可以直接运行在浏览器上,它支持所有主流的浏览器,可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏。

一文搞懂爬虫神器selenium常见操作

二、selenium的安装

selenium的安装比较简单,和其它的python三方库一样,使用 pip install selenium即可。

但是要想驱动浏览器工作,还需要下载一个插件:

1.查看chorm的版本号

在chorm的地址栏输入:chrome://version/

2.下载对应的chromedriver版本

http://chromedriver.storage.googleapis.com/index.html

之后根据自己的操作系统,下载对应的插件即可。

3.下载的文件解压后,将其中的chromedriver.exe复制到python3.exe所在的文件夹下即可

三、selenium常用操作

selenium可以操纵浏览器去操作,下面举个小例子,通过selenium自动在百度搜索“美女”,并保存页面截图。

from selenium import webdriver
import time

if __name__ == '__main__':
    # 1.创建浏览器对象
    driver = webdriver.Chrome()
    # 2.请求页面
    driver.get('https://www.baidu.com/')
    # 3.页面的基本操作(点击、输入)
    driver.find_element_by_id('kw').send_keys('美女')     #输入
    driver.find_element_by_id('su').click()    #点击

    time.sleep(2)
    driver.save_screenshot('baidu.png')

    # 获取渲染之后的数据
    print(driver.page_source)
    print(driver.get_cookies())    #获取cookies值
    print(driver.current_url)      #查看当前的url路径

    driver.close()                 #关闭页面
    driver.quit()                  #关闭浏览器

关于上述代码,可能会有疑问:

driver.find_element_by_id是一种元素定位的方法,在整个页面中,根据id属性值获取元素列表。当我们要搜索时,肯定是先点击百度的搜索栏,然后输入相应的内容,再点击“百度一下”,才会完成搜索:

selenium是模仿人类完成浏览器的操作,所以首先需要找到搜索栏在哪。右键点击搜索栏,然后点击“检查”选项,就会出现如下页面,蓝框会自动出现,所对应的正是搜索栏的位置:

红圈所处的位置,就是driver.find_element_by_id()的参数,之后通过send_keys()方法,将想要搜索的内容传递给服务器。

“百度一下”的id获取方法同理。

除了通过id定位,还有其他的定位方法,如下所示。

四、selenium元素定位的方法

find_elements_by_id  #根据id属性值获取元素列表
find_elements_by_class_name  #根据类名获取元素列表
find_elements_by_xpath  #返回一个包含元素的列表
find_elements_by_link_text  #根据标签的文本获取元素列表,精确定位
find_elements_by_partial_link_text  #根据标签包含的文本获取元素列表,模糊定位
find_elements_by_tag_name  #根据标签名获取元素列表

下面以豆瓣网为例,大家可自行练习:

from selenium import webdriver

if __name__ == '__main__':
    driver = webdriver.Chrome()

    driver.get('https://www.douban.com/')

    # 1.通过标签的id值获取标签
    ret1 = driver.find_element_by_id('anony-nav')   # 标签对象
    print(ret1)
    # 2.通过标签的id值获取多个标签
    ret2 = driver.find_elements_by_id('anony-nav')    # 获取多个标签 --list
    print(ret2)
    # 3.通过标签的class属性获取标签
    ret3 = driver.find_elements_by_class_name('anony-nav-links')
    print(ret3)
    # 4.通过xpath获取左上角豆瓣图片的<a>标签
    ret4 = driver.find_elements_by_xpath('//*[@id="anony-nav"]/h1/a')
    print(ret4)
    # 5.通过标签包裹的文本'下载豆瓣 App'获取元素列表(精确定位)
    ret5 = driver.find_element_by_link_text('下载豆瓣 App')
    print(ret5)
    # 6.通过标签包裹的文本'豆瓣',获取元素的列表(模糊定位)
    ret6 = driver.find_elements_by_partial_link_text('豆瓣')
    print(len(ret6))
    # 7.通过标签名获取元素列表
    ret7 = driver.find_elements_by_tag_name('div')
    print(len(ret7))
    # 8.获取<h1>标签包裹的文本内容
    ret8 = driver.find_element_by_tag_name('h1')
    print(ret8.text)
    # 9.通过标签包裹的文本'下载豆瓣 App'获取其href属性值
    ret9 = driver.find_element_by_link_text('下载豆瓣 App')
    print(ret9.get_attribute('href'))

这里有个值得注意的地方,driver.find_element_by_xpath()中的参数怎么填。

通过xpath获取左上角豆瓣图片的<a>标签:

1.在图片处右键点击“检查”

2.在蓝框处右键点击“Copy”选项中的“Copy Xpath”即可复制该节点的Xpath表达式

3.粘贴入driver.find_element_by_xpath('')的引号内即可

五、页面回退与页面前进

还是以豆瓣网为例,通过selenium点击某个链接,会刷新出该链接的页面,之后通过driver.back()即可返回原来的页面,driver.forward()则是页面前进。

from selenium import webdriver


if __name__ == '__main__':
    driver = webdriver.Chrome()

    driver.get('https://www.douban.com/')

    driver.find_element_by_xpath('//*[@id="anony-sns"]/div/div[3]/div/div[1]/ul/li[2]/div/a/img')
    # 页面回退
    driver.back()
    # 页面前进
    driver.forward()

六、切换窗口

还是以豆瓣网为例,通过selenium点击某个链接,会弹出新的窗口,但是页面可能停留在原来的窗口,这时可以通过driver.switch_to.window切换窗口。

from selenium import webdriver

if __name__ == '__main__':
    '''切换窗口'''   
    driver = webdriver.Chrome()

    driver.get('https://www.douban.com/')

    driver.find_element_by_xpath('//*[@id="anony-nav"]/div[1]/ul/li[2]/a').click()

    # 1.获取当前所有的窗口    
    current_window = driver.window_handles
    print(current_window)

    driver.switch_to.window(current_window[1])

七、模拟登录

模拟登录在爬虫中属于较难的部分,但是通过selenium就会很简单。

首先需要找到嵌套网页,右键点击“检查”:

红圈所处的位置就是嵌套网页的标签,点一下发现只有登录选项那里属于嵌套网页:

所以driver.switch_to_frame()的参数填0即可,以下是完整代码:

from selenium import webdriver

if __name__ == '__main__':
    driver = webdriver.Chrome()

    driver.get('https://www.douban.com/')

    driver.switch_to_frame(0)
   # 定位“密码登录”
    driver.find_element_by_xpath('/html/body/div[1]/div[1]/ul[1]/li[2]').click()
   # 定位“账号”,并输入账号
    driver.find_element_by_xpath('//*[@id="username"]').send_keys('此处填入豆瓣账号')
   # 定位“密码”,并输入密码
    driver.find_element_by_xpath('//*[@id="password"]').send_keys('此处填入豆瓣密码')
   # 定位“登录豆瓣”,并点击
    driver.find_element_by_xpath('/html/body/div[1]/div[2]/div[1]/div[5]/a').click()

以上就是关于selenium的介绍,过几天我会更新使用selenium爬取淘宝商品信息的文章,欢迎关注我。

Tags:

最近发表
标签列表