[Python自学] 爬虫(5)selenium
一、准备工作
1.安装selenium
pip install selenium
2.下载安装chromedriver.exe
注意:如果Chrome在自动更新的话,可能会导致运行出现问题,我们应该去系统服务中禁用Chrome的自动更新服务。
下载chromedriver.exe:
http://chromedriver.storage.googleapis.com/index.html
【除了该下载地址,还可以去淘宝镜像下载:https://developer.aliyun.com/mirror/NPM?from=tnpm
其中提供了phantomjs,chromedriver,OperaDriver等镜像地址。】
下载与自己Chrome浏览器版本接近的版本(大版本号一定要对应上)。
可以按照以下方式查看版本是否能对应:
下载完毕后,将chromedrive.exe拷贝到Chrome浏览器根目录:
Chrome根目录:C:\Program Files (x86)\Google\Chrome\Application
以上是我的路径。
将Chrome根目录加到系统环境变量中:
即保证selenium能够执行chromedriver.exe程序即可(所在目录添加在系统变量)。
二、简单使用selenium
1.打开baidu首页
import time from selenium import webdriver # 创建一个Chrome浏览器实例 driver = webdriver.Chrome() # 打开百度首页 driver.get("http://www.baidu.com") # 睡眠5s观察效果 time.sleep(5) # 退出浏览器 driver.quit()
2.在百度首页自动搜索"python"
import time from selenium import webdriver # 创建一个Chrome浏览器实例 driver = webdriver.Chrome() # 设置窗口大小为1920x1080 # driver.set_window_size(1920,1080) # 设置窗口为全屏 driver.maximize_window() # 打开百度首页 driver.get("http://www.baidu.com") # 元素定位,找到百度的搜索输入框 driver.find_element_by_id("kw").send_keys('python') # 点击搜索 driver.find_element_by_id("su").click() # 睡眠5s观察效果 time.sleep(5) # 退出浏览器 driver.quit()
这样我们就完成了一次使用selenium来自动打开百度首页,并输入python进行搜索的流程。
3.获取cookie
使用以下方式获取所有的cookie:
import time from selenium import webdriver driver = webdriver.Chrome() driver.get("http://www.baidu.com") # 获取所有的cookie信息 cookies = driver.get_cookies() # 只保留cookie的名称和值 cookies = {i['name']: i['value'] for i in cookies} print( cookies) # {'H_PS_PSSID': '31622_1457_31325_21104_31110_31594_31464_31321_30823_26350', 'BD_LAST_QID': '11445339033471882529', 'BAIDUID': '7D5178AD3B9D241D5B1877CE5E2F5383:FG=1', 'BIDUPSID': '7D5178AD3B9D241DC887CABE7DFF3DF4', 'PSTM': '1589774143', 'BD_UPN': '12314753', 'BD_HOME': '1'} time.sleep(3) driver.quit() # 退出浏览器。另外driver.close()是关闭页面,当关闭了最后一个页面,则退出浏览器。
4.获取其他信息
driver.page_source # 对应F12中Elements的内容
driver.current_url # 对应当前访问的URL,即当前代码所在位置对应浏览器所在url
三、selenium页面元素定位
1.使用xpath查找元素
li_list = driver.find_elements_by_xpath("//ul[@id='detail-list']/li") # 获取多个li标签 for li in li_list: li.find_element_by_xpath(".//h1/p") # 继续使用xpath获取其中的一个标签
注意,find_elements_by_xpath是获取多个标签的列表,而find_element_by_xpath是获取一个标签(第一个)。并且使用find_element_**方法,只能获取标签元素,而不能用于获取文本,例如 ".//h1/p/text()" 就不是一个标签,会报错: ".//h1/p/text()" is: [object Text]. It Shoud be an element.
如果要获取标签的属性值:
li.find_element_by_xpath(".//h1/p").text li.find_element_by_xpath(".//h1/a").get_attribute("href")
2.使用link的text来查找连接的url
例如页面上有一个按钮 下一页> ,我们想获取他对应的url连接:
driver.find_element_by_link_text("下一页>").get_attribute("href")
偏文本匹配(即局部包含文本):
driver.find_element_by_partial_link_text("下一").get_attribute("href")
3.其他
除了以上查找元素的方式,selenium还支持其他的方式,例如:
driver.find_elements_by_tag_name()
driver.find_elements_by_class_name()
driver.find_elements_by_css_selector()
四、处理iframe标签
1.切换到ifame标签
我们知道,iframe标签是可以嵌入在html页面中的另一个页面,所以我们直接使用driver是无法拿到iframe中的元素的。需要进行一下操作:
import time from selenium import webdriver driver = webdriver.Chrome() driver.get("https://mail.qq.com/cgi-bin/loginpage") # 对应登录框的标签为iframe id=login_frame driver.switch_to.frame("login_frame") # 找到iframe中的username的输入框 username = driver.find_element_by_xpath("//input[@id='u']") # 输入数据 username.send_keys("4774177") time.sleep(3) driver.quit()
可以看到,我们以QQ邮箱登陆页面为例,将driver切换到iframe,然后找到输入框输入数据。
2.切换回主页面
driver.switch_to.default_content()
五、设置标签获取等待时间
在selenium中,只有请求第一个页面的时候,会自动等待页面加载完毕后再获取标签对象。
但如果我们在流程中翻页(例如下一页),selenium则不会等待页面加载完毕,而直接去获取标签对象。有可能获取失败(标签还未加载出来)。
这时我们需要设置一个等待时间,有三种方式:
1.强制等待
import time time.sleep(3) # 强制等待3秒
2.显式等待(了解)
设置一个最长等待时间,如果在时间内未找到元素,则抛出异常:
WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,"kw"),message="")
3.隐式等待
简单的设置一个最大等待时间,单位是秒
driver.implicitly_wait(10) #隐式等待10秒
关于以上三种等待方式的优缺点,参考:https://blog.csdn.net/sinat_41774836/article/details/88965281#WebDriverWait_17
===