[Python自学] 爬虫selenium

Posted 风间悠香

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Python自学] 爬虫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

 

 

 

 

 

 

 

 

===

以上是关于[Python自学] 爬虫selenium的主要内容,如果未能解决你的问题,请参考以下文章

爬虫 + 自动化利器 selenium 之自学成才篇

爬虫 + 自动化利器 selenium 之自学成才篇

爬虫+自动化利器 selenium 之自学成才篇

如何入门 Python 爬虫

自学python之爬虫3股票数据爬虫

scrapy按顺序启动多个爬虫代码片段(python3)