温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么用python+selenium进行爬虫操作

发布时间:2021-07-02 16:44:57 来源:亿速云 阅读:274 作者:chen 栏目:大数据

这篇文章主要讲解了“怎么用python+selenium进行爬虫操作”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用python+selenium进行爬虫操作”吧!

1.声明浏览器对象

selenium支持多个浏览器,也支持手机端的浏览器,除此之外还有Phantomjs,下面举一个简单的例子,创建一个谷歌浏览器对象,依次类推可以得到其他浏览器对象

from selenium import webdriver

chrome_driver = "C:\Users\zhongchengbin\Documents\chromedriver\chromedriver.exe"(注意要下载对应的chrome的版本,设置路径)browser = webdriver.Chrome(executable_path=chrome_driver)


2.请求页面

# 使用get方法请求百度网页
browser.get('https://www.baidu.com')
# page_source属性用于获取网页的源代码,然后就可以使用正则表达式,css,xpath,bs4来解析网页
print(browser.page_source)
browser.close()
3.查找单个节点和多个节点

寻找单个节点的多有方法,返回的结果是WebElement类型的
browser.find_element_by_id()
browser.find_element_by_name()
browser.find_element_by_xpath()
browser.find_element_by_tag_name()
browser.find_element_by_link_text()
browser.find_element_by_class_name()
browser.find_element_by_css_selector()
browser.find_element_by_partial_link_text()
如果是找多个节点,在element后面加s,结果是列表类型


当我们要定位到百度的搜索框时,我们可以看到,检查元素中,input这个节点里有class,id 等等属性,我们通过定位相关属性,就能定位到想要的节点

from selenium import webdriver
chrome_driver = "C:\Users\zhongchengbin\Documents\chromedriver\chromedriver.exe"(注意要下载对应的chrome的版本,设置路径)

browser = webdriver.Chrome(executable_path=chrome_driver)
browser.get('https://www.baidu.com')
input = browser.find_element_by_id('kw')
browser.close()
4模拟浏览器进行操作

在打开浏览器之后,我们往往需要在一些搜索框里输入文字,删除文字,点击一些按钮等等,这时我们需要用到一下几种方法

send_keys():输入文字
clear():清除文字
click():点击按钮
举个例子,我们打开百度浏览器,然后输入一些关键字,删除,再次输入一些关键字,然后点击回车然后搜索

import time
from selenium import webdriver
chrome_driver = "C:\Users\zhongchengbin\Documents\chromedriver\chromedriver.exe"(注意要下载对应的chrome的版本,设置路径)

browser = webdriver.Chrome(executable_path=chrome_driver)
browser.get('https://www.baidu.com')
input = browser.find_element_by_id('kw')
input.send_keys('许嵩')
time.sleep(3)
input.clear()
input.send_keys('python')
input.send_keys(Keys.ENTER)
# button = browser.find_element_by_class_name('btn self_btn')
# button.click()
browser.close()
5.模拟鼠标移动,键盘按键等没有特定的执行对象的操作

模拟浏览器的时候,我们可能会使用到一些拖动的操作,比如需要将某一个点拖到另外一个地方去,这种方法我们可以称之为动作链。

首先打开网页http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable中的一个实例,选中要拖动的节点以及拖动到哪里的节点,使用ActionChains对象使它变成一个变量,再调用drag_and_drop方法以及perform方法来执行该过程。

from selenium import webdriver
from selenium.webdriver import ActionChains
browser = webdriver.Chrome()
browser.get('http:www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
browser.switch_to.frame('iframeResult')
yuanlai = browser.find_element_by_css_selector('#draggable')
mubiao = browser.find_element_by_css_selector('#droppable')
a = ActionChains(browser)
a.drag_and_drop(yuanlai,mubiao)
a.perform()
6.拖动滑动条

使用爬虫爬取网页时,经常会看到使用滑动条的页面,然后会显示加载中,没多久就会加载出新的页面出来。如果直接爬取,往往只能爬到一页甚至是前几页的信息。

在此可以直接模拟运行JavaScript,滑到网页的最底下。使用的是execute_script(),并且可以设置一个网页提示框

from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.toutiao.com/search/?keyword=街拍')
# execute_script()将进度条拉到最下面,然后弹出提示框
browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
browser.execute_script('alert("已经到最下面了")')
7.获取节点信息

获取节点信息与两种方法,第一种是使用page_source属性,获取到目标网页的源代码之后,使用正则表达式,css,xpath ,bs4等工具进行抓取信息。第二种就是直接使用selenium的一些方法和属性。

① 获取属性

首先选中要匹配解析的节点,然后调用get_attribute方法来获取节点的属性。

from selenium import webdriver
from selenium.webdriver import ActionChains
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
input = browser.find_element_by_id('kw')
print(input)
print(input.get_attribute('class'))
② 获取文本

依然是先代开网址,然后定位到目标节点,再使用text属性来获取文本

from selenium import webdriver
from selenium.webdriver import ActionChains
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
input = browser.find_element_by_id('kw')
print(input)
print(input.text)
③ 获取ID,位置,标签名和大小

方法和前两个类似,直接调用即可获得相关的值

from selenium import webdriver
from selenium.webdriver import ActionChains
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
input = browser.find_element_by_id('kw')
print(input)
# 获取节点id
print(input.id)
# 获取节点在页面的相对位置
print(input.location)
# 获取节点标签名称
print(input.tag_name)
# 获取节点大小
print(input.size)
8.切换frame

网页有一种很常见的节点叫做iframe,相当于是子frame,也就是页面的子页面。

结构和外部网页的结构一致,当我们使用selenium打开页面,默认是在父页面里执行的,但是呢,这种网页我们往往是获取不到子页面的节点,所以要使用switch_to.frame()来跳转页面,然后再进行相对应的操作

然后尝试获取父页面的某个节点,如果获取不到就报错,接下来就换回父页面去获取该节点,就能成功了。

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
 
browser = webdriver.Chrome
browser.get('https://www.toutiao.com')
browser.switch_to.frame('tanxssp-tuwen-iframemm')#具体是什么,要看节点frame的id是什么
try:
    title = browser.find_element_by_id('tanx-a-mm_32479643_3494618_81668314')
except NoSuchElementException:
    print('没有这个节点')
browser.switch_to.parent_frame()
title = browser.find_element_by_id('tanx-a-mm_32479643_3494618_81668314')
print(title)
print(title.text)
9.延时等待

有些时候,网页有额外的Ajax请求,并没有那么快就能加载出来,所以我们要有耐心地等待一下。

等待分为两种,隐式等待和显式等待

隐式等待,查找某个节点的时候,隐式等待就会等待固定的时间,如果到了时间你还没有来,他就会发脾气,然后向上级打小报告说你没有出现。

from selenium import webdriver
browser = webdriver.Chrome
browser.implicitly_wait(10)
browser.get('https://www.baidu.com')
input = browser.find_element_by_id('kw')
print(input)
显式等待就显得比较有人情味一点,会做人。当她准备等你的时候,她会温馨地提示你,她最多等你多久,如果你在规定的时间内到了,那好,就一起接着做其他事。如果你超过了时间没来,那也没办法了,只能向上级报告这个问题了。

# 显式等待
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
 
browser = webdriver.Chrome
browser = get('https://www.taobao.com')
# 引入WWebDriverWait对象,指定等待的最长时间
wait = WebDriverWait(browser,10)
# 调用unti方法,然后设定等待的条件,表示直到这个节点出现的意思。参数是节点的定位元组,也就是说ID为q的节点搜索框
# 成功就返回,不成功就抛出异常
input = wait.until(EC,presence_of_element_located((By.ID,'q')))
button = wait.until(EC,element_to_be_clickable((By.CSS_SELECTOR,'btn-search')))
print(input,button)
'''
所有的等待条件
title_is                                 标题是某内容
title_contains                           标题包含某内容
presence_of_element_located              节点加载出来,传入定位元组
visibility_of_element_located            节点可见,传入定位元组
visibility_of                            可见,传入节点对象
presence_of_all_element_located          所有节点加载出来
text_to_be_present_in_element            某个节点文本包含某文字
text_to_be_present_in_element_value      某个节点值包含某文字
frame_to_be_available_and_switch_to_it   加载并且切换
invisibility_of_element_located          节点不可见
element_to_be_clickable                  节点可点击
staleness_of                             判断一个节点是否在DOM,可判断页面是否已经刷新
element_to_be_selected                   节点可选择,传节点对象
element_located_to_be_selected           节点可选择,传定位元组
element_selection_state_to_be            传入节点对象以及状态,相等返回true,否则返回false
element_located_selection_state_to_be    传入定位元组以及状态,相等返回true,否则返回false
alert_is_present                         是否出现警告  
'''
10.后退前进

使用浏览器都有前进后退的功能,在selenium中,back()表示后退,forward()表示前进

# 后退前进
import time
from selenium import webdriver
browser = webdriver.Chrome()
browser .get('https://www.baidu.com')
browser.back()
time.sleep(3)
browser.forward()
browser.close()
11.获取cookies

from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
print(browser.get_cookies())
browser.add_cookie({'name':'name','domain':'www.baidu.com','value':'germey'})
print(browser.get_cookies())
browser.delete_all_cookies()
print(browser.get_cookies())
12.选项卡管理

import time
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
# window.open()新开启一个选项卡
browser.execute_script('window.open()')
# window_handles 用于获取当前开启的所有选项卡,返回的是选项卡的代号列表
print(browser.window_handles)
# switch_to_window用于切换选项卡
browser.switch_to_window(browser.window_handles[1])
browser.get('https://www.taobao.com')
time.sleep(3)
browser.switch_to_window(browser.window_handles[0])
browser.get('https://python.org')

感谢各位的阅读,以上就是“怎么用python+selenium进行爬虫操作”的内容了,经过本文的学习后,相信大家对怎么用python+selenium进行爬虫操作这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI