selenium与python爬虫(二)【等待与多窗口(目标1)】

目标明确

1.我们的目标首先是打开一个网页
2.定位其中一个元素或者多个执行对应的操作
3.根据需求对该元素进行操作和获取,对获取的数据进行处理
4.之后再根据需求再打开更多的网页重复之前的操作
总体而言,我们的步骤分为这四大步,但是每一步又可以细分为几个小步。那么现在我们就来实现目标一

打开网页(细分一,开网页)

这个在上一篇博客已经有写过。
使用get()方法打开网页

from selenium import webdriver
drive=webdriver.Chrome()
drive.maximize_window()#窗口最大化
drive.get('https://www.baidu.com/')
print(len(drive.page_source))#page_source是返回的网址源码

打开网页(细分二,开分页)

误区演示;当我们使用get()方法时打开的是一个全新的网页
例如;

from selenium import webdriver
drive=webdriver.Chrome()
drive.maximize_window()#窗口最大化
drive.get('https://www.baidu.com/')
drive.get('https://123.sogou.com/')
print(len(drive.page_source))#page_source是返回的网址源码

表面上看打开了两个网页但是实际上最后只有一个网页被打开,相当于关掉了上一个网页,打开了下一个网页。但是在做实际的爬取工作时往往是从一个页面跳转到另一个再跳转回来的。也就是我们希望浏览器呈现这样的状态
在这里插入图片描述
再原来的基础上再开一个。
正确姿势
1.使用execute_Script()方法切换网页
2.获取窗口的位置(第几个窗口)
3.使用switc_to_window()切换
代码如下;

from selenium import webdriver
drive=webdriver.Chrome()
drive.maximize_window()#窗口最大化
drive.get('https://www.baidu.com/')
print(len(drive.page_source))#page_source是返回的网址源码

drive.execute_script("window.open('https://123.sogou.com/')")
#drive.window_handles获取窗口通过索引定位窗口
drive.switch_to_window(drive.window_handles[1])

效果如下;
在这里插入图片描述

打开网页(细分三,等待加载)【隐式等待】

打开一个网页可以很快但是加载一个网页可不一定。如果说打开一个网页之后还没有加载出来相应的元素就贸然去定位元素是绝对会报错的。
1.所谓隐式等待其实就相当于导入time模块使用sleep()方法。但是比较特殊的是selenium比较复杂(里面各种线程齐飞直接使用sleep()是没有用的,况且他自己本身还要运行加载。)
直接使用方法implicitly_wait()
下面使用上一篇博客的例子

from selenium import webdriver

drive=webdriver.Chrome()
drive.get('https://www.baidu.com/')
############
drive.implicitly_wait(10)#等待十秒
InputTag=drive.find_element_by_name('wd')
InputTag.send_keys('python')
############
SubmitBut=drive.find_element_by_xpath('//input[@type="submit" and @value="百度一下"]')
SubmitBut.click()


打开网页(细分三,等待加载)【显式等待】

这玩意就稍微智能一点,可以加入判断条件不会死等。当然导入的东东也比较多。

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as Ec
#Ec加入判断条件的东东

代码如下;

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as Ec




drive=webdriver.Chrome()
drive.maximize_window()
drive.get('https://www.baidu.com/')
drive.implicitly_wait(10)
print(len(drive.page_source))


try:
    InputTag=WebDriverWait(drive,10).until(
        Ec.presence_of_element_located((By.ID,'kw'))
    )
    #等待十秒要是提前出现了就不等了
    InputTag.send_keys('python')


except Exception as error:
    print(error)




Enter=drive.find_element(By.ID,'su')
Enter.click()
print(len(drive.page_source))

此外判断条件还有很多
在这里插入图片描述
相信各位英文都不会太差。

最终演示的代码

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as Ec




drive=webdriver.Chrome()
drive.maximize_window()
drive.get('https://www.baidu.com/')
drive.implicitly_wait(10)
print(len(drive.page_source))


try:
    InputTag=WebDriverWait(drive,10).until(
        Ec.presence_of_element_located((By.ID,'kw'))
    )
    InputTag.send_keys('python')


except Exception as error:
    print(error)




Enter=drive.find_element(By.ID,'su')
Enter.click()
print(len(drive.page_source))

'''切换网页'''

drive.execute_script("window.open('https://123.sogou.com/')")
drive.switch_to_window(drive.window_handles[1])


在这里插入图片描述
此外这里还有一个小细节
在这里插入图片描述
这个也就是为什么使用selenium获取Ajax的内容了,当然你直接找到接口破解传入的参数也行。

猜你喜欢

转载自blog.csdn.net/FUTEROX/article/details/108428656
今日推荐