起手式
1.pycharm在File->settings->Project interpreter->里面下载好selenium模块,试试import一下这个包,如果成功则说明下载成功。(一般都没问题
2.还需要下载一下对应你的chrome浏览器版本的驱动,可以查看一下note.txt确定适用的版本,网址如下。
http://chromedriver.storage.googleapis.com/index.html
下载完后随意解压在一个地方(路径最好不要有中文),在代码中说明驱动路径就可以了,不一定要在环境变量里添加(我自己添加的时候出了问题。。wtcl)
完成这些以后,可以尝试一下试试模拟一下baidu搜索python,如果成功则说明一切准备就绪,脚本如下(暂时不需要知道整个代码是甚么)
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import time
chrome_driver = 'C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe' #chromedriver的文件位置
browser = webdriver.Chrome(executable_path = chrome_driver)
try:
browser.get("https://www.baidu.com")
input=browser.find_element_by_id("kw")
input.send_keys("Python")
input.send_keys(Keys.ENTER)
wait=WebDriverWait(browser,10)
wait.until(EC.presence_of_element_located((By.ID,"content_left")))
print(browser.current_url)
print(browser.get_cookies())
print(browser.page_source)
time.sleep(10)
finally:
browser.close()
元素定位(八种)
爬虫肯定离不开对页面元素的定位,包括输入、发送请求、抓取文本等等,参考链接:https://blog.csdn.net/qq_30990097/article/details/81386750
1.通过id或name定位
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">
这里是一个网页前端代码,可以通过name或者id属性进行定位,id属性肯定是唯一的,name的话也是get的一个参数,可能会有其他地方也使用这个
browser = webdriver.Chrome(executable_path = chrome_driver)
brower.find_element_by_id("kw")
brower.find_element_by_name("wd")
2.通过class name或tag name定位
<div class="jstEditor">
<textarea cols="60" rows="10" accesskey="e" class="wiki-edit" name="issue[description]" id="issue_description">
</textarea>
</div>
通过元素中带的class属性定位
brower.find_element_by_class_name("iki-edit")
通过元素中的tag标签定位,这种定位方式极不靠谱,不推荐采取此种方式。
brower.find_element_by_tag_name("div")
附加说明,如果class属性含有空格,那么取其中一个不重复的字段就可以了,例子:
<a title="新建版本" tabindex="200" class="icon-only icon-add" data-remote="true" data-method="get" href="/projects/bk_community/versions/new">新建版本</a>
其中class的属性值为“icon-only icon-add”,取其中“icon-only”、“ icon-add”都可以,但最好是取其中唯一的。
brower.find_element_by_class_name("icon-add")
3.通过link text和partial link text定位
<a href="http://news.baidu.com" target="_blank" class="mnav">新闻</a>
通过text link定位元素
brower.find_element_by_link_text("新闻")
通过partial link text定位元素,当文字链接很长时,可以通过此方式取其中一部分,只要取的部分可以作为唯一标识。
brower.find_element_by_partial_link_text("新")
4.xpath定位
此种定位方式需知晓xpath路径,通过火狐浏览器就可以知道,具体如何操作,可以通过火狐或者chrome的插件安装一个xpath finder,来查看元素的xpath
有时候你还可以f12,把dom树单独分屏,然后点击左上那个鼠标样子的东西,可以自行定位,就有时候它就给你个id,但是这个id是不固定的,那你只能通过它的上下层来判断。
调用的方法为:
brower.find_element_by_xpath("/html/body/div[1]/div/div[2]/ul/li[2]")
也可以通过相对路径自行填写,例如:
//*[@id="su"]/form/span/input #通过上三级目录的id属性定位
当然也可以通过某一级的name属性定位。
对于不熟悉xpath的,可以看看w3school或者菜鸟教程
还有一个老师傅的博客可以参考参考,算是速成
5.CSS定位
这个。。说实话我感觉用处不大,暂时略,如果后面觉得它很好用我就重新补充。
我错了,我是sb。
css定位还是很牛的,这得好好记录一下
temp_input = browser.find_element_by_css_selector("input[data-caption='当天晨检体温']")
这里为什么我觉得css强呢。。是因为它不仅匹配了input这个
它还能根据里面的属性判断是哪个input,我感觉这个属性是人为定义的,所以只要找到它独一无二的属性就可以很轻松的定位了。
各种模拟操作
1.点击操作
根据元素定位获得元素后,可以对元素进行点击(各种)。
newday = browser.find_element_by_xpath('/html/body/main/article/section/div[2]/div[1]')
newday.click() #左键单击
newday.context_click() #右键点击
newday.double_click(on_element=None) #双击
click_and_hold(on_element=None) #点击并抓起
drag_and_drop(source, target)
#在source元素上点击抓起,移动到target元素上松开放下。
drag_and_drop_by_offset(source, xoffset, yoffset)
#在source元素上点击抓起,移动到相对于source元素偏移xoffset和yoffset的坐标位置放下
2.赋值
比如在框框(input)里填入内容
send_keys(*keys_to_send)
将键发送到当前聚焦的元素。值是字符串就行
send_keys_to_element(element, *keys_to_send)
将键发送到指定的元素。
clear()
清除元素的值
填入内容之后并没有发送请求,还需要对对应的元素进行点击
user=browser.find_element_by_xpath("//*[@id='username']")
user.clear()
user.send_keys("123123")
passwd=browser.find_element_by_xpath("//*[@id='password']")
passwd.clear()
passwd.send_keys("123123")
log=browser.find_element_by_xpath("//*[@id='xsfw']")
log.click()
3.等待
①显示等待
指定在某个时间内,如果某个条件满足了,那么就不会再等待,如果在指定的时间内条件都不满足,那么就不会再等待了。
要使用显示等待还需要载入一些selenium的包
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
其实完全使用import selenium是可以的,但是载入这么多包,运行起来就会比较慢,如果整个操作只需要几个模块,就无需载入完整的selenium。
下面是显示等待的用法:
WebDriverWait(browser, 30).until(EC.presence_of_element_located(
(By.XPATH, "/html/body/div[1]/div[2]/div[1]/div/div[2]/div/a[2]")))
只要这个元素出现就停止等待,不然最多等待30秒,期间每0.5秒检查一下这个元素是否出现
这里的By.XPATH是指通过xpath来寻找元素并等待,同理还有classname什么的,pycharm会给补全
②隐式等待
这个等待比较弱,它只是让驱动在等待过程中,查看有没有元素,只要有元素它就不再等待
具体使用方法:
browser.implicitly_wait(10)
其实这个比较鸡肋,一开始我以为这东西很好用,其实不然,还是要等确切的元素出现再点击,才不容易出错
4.切换窗口
有时候点击完了浏览器就会弹出一个新的窗口,这个时候需要你进行切换,因为你目前的操作句柄还在之前的页面,需要切换到最新的页面上去。
windows = browser.window_handles# 转换到最新打开的窗口
browser.switch_to.window(windows[-1])#即最新的窗口
如果要切换其他的窗口,也可以先打印所有句柄,然后
pageSource = browser.page_source
print(pageSource)
查看当前源代码
5.查看元素是否存在
因为我是个小萌新,代码水平有限,有时候要检查某个元素是否存在,进行测试,好像selenium没有这个函数,所以得自己写一个,具体如下:
def isElementExist_byxpath(driver, element):
flag = True
try:
driver.find_element_by_xpath(element)
return flag
except:
flag = False
return flag
这里的xpath是根据你使用的查找方法设定的,可以自行修改。