当前位置:   article > 正文

【selenium】

【selenium】

selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的。Selenium可以直接调用浏览器,它支持所有主流的浏览器。其本质是通过驱动浏览器,完成模拟浏览器操作,比如挑战,输入,点击等。

下载与打开

下载链接:CNPM Binaries Mirror

找到与自己的谷歌浏览器版本最接近的。

然后点击下载里面win32.zip即可

05b8cd85179248da9c1f2f33f944662a.png下载的压缩包解压完成后的内容放到python的安装路径。

python安装路径:可以运行一个空的py文件,第一行的第一个路径就是你的python解释器安装路径

cmd命令提示符中:pip install selenium==3.141.0

卸载:pip uninstall 模块名

  1. from selenium import webdriver
  2. # 导入其中的webdriver来驱动浏览器
  3. url = "https://www.baidu.com/"
  4. # 启动谷歌浏览器
  5. driver = webdriver.Chrome()
  6. # 在地址栏输入网址
  7. driver.get(url)

可以打开网页了。

不过可能会报错。根据报错内容查看是哪里出现了问题:

  • 问题一:下载的selenium与urllib3不兼容
    • 解决方式:cmd中输入pip install selenium==3.141.0pip install urllib3==1.26.2
  • 问题二:谷歌浏览器与下载的chromedriver驱动版本不一致
    • 解决方式:右上角三个点--帮助--关于--找到自己浏览器的版本,再对应下载驱动

浏览器对象

get(url=url):地址栏--输入url地址并确认

page_source:HTML结构源码

maxmize_window:浏览器窗口最大化

quit():关闭浏览器窗口

  1. from selenium import webdriver
  2. # 导入其中的webdriver来驱动浏览器
  3. url = "https://www.baidu.com/"
  4. # 启动谷歌浏览器
  5. driver = webdriver.Chrome()
  6. # 在地址栏输入网址
  7. driver.get(url)
  8. driver.maximize_window() # 将浏览器窗口最大化
  9. print(driver.page_source) # 打印请求头
  10. driver.quit() # 关掉浏览器

Selenium定位元素

from selenium.webdriver.common.by import By

  • find_element(By.ID, '根据标签id属性进行定位')
  • find_element(By.NAME, '根据标签name属性进行定位')
  • find_element(By.CLASS_NAME, '根据标签class属性进行定位')
  • find_element(By.XPATH, '根据xpath语法进行定位')
  • find_element(By.CSS_SELECTOR, '根据css语法进行定位')
  • find_element(By.LINK_TEXT, '根据标签文本内容进行定位')
  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. url = "https://www.baidu.com/"
  4. driver = webdriver.Chrome()
  5. driver.get(url)
  6. driver.maximize_window()
  7. driver.find_element(By.ID, "kw").send_keys("CSDN") # 在搜索框上输入CSDN
  8. driver.find_element(By.ID, 'su').click() # 点击搜索

无界面模式

from selenium import webdriver

options = webdriver.ChromeOptions()

# 添加无界面参数

options.add_argument('--headless')

browser = webdriver.Chrome(options=options)

  1. import time
  2. from selenium import webdriver
  3. from selenium.webdriver.common.by import By
  4. url = "https://www.jd.com/?cu=true&utm_source=baidu-pinzhuan&utm_medium=cpc&utm_campaign=t_288551095_baidupinzhuan&utm_term=0f3d30c8dba7459bb52f2eb5eba8ac7d_0_4f2b917133dd438ab114acdc46cd0f2c"
  5. options = webdriver.ChromeOptions()
  6. # 添加无界面参数
  7. options.add_argument('--headless')
  8. driver = webdriver.Chrome(options=options)
  9. driver.get(url)
  10. driver.execute_script(
  11. "window.scrollTo(500, document.body.scrollHeight)"
  12. )
  13. time.sleep(2)
  14. li_list = driver.find_elements(By.XPATH, '//div[@id="J_feeds"]/ul/li')
  15. i = 0
  16. for li in li_list:
  17. print(li.text)
  18. print('*'*30)
  19. i += 1
  20. print(i) # *

 打开新窗口和切换页面

通过excute_script()来执行js脚本的形式来打开新窗口。

window.excute_script("window.open('https://www.douban.com')")

打开新窗口后driver当前的页面依然是之前的。

如果想获取新窗口的源代码,就必须先切换过去 :

window.switch_to.window(driver.window_handles[1])

  1. from selenium import webdriver
  2. url = 'https://www.baidu.com/'
  3. driver = webdriver.Chrome()
  4. driver.get(url)
  5. driver.maximize_window()
  6. js = 'open("https://www.douban.com/")'
  7. driver.execute_script(js)
  8. print(driver.page_source) # 获取到的是百度页面的信息
  9. driver.quit()

切换:

  1. from selenium import webdriver
  2. url = 'https://www.baidu.com/'
  3. driver = webdriver.Chrome()
  4. driver.get(url)
  5. driver.maximize_window()
  6. js = 'open("https://www.douban.com/")'
  7. driver.execute_script(js)
  8. driver.switch_to_window(js)
  9. # print(driver.window_handles)
  10. print(driver.page_source)
  11. driver.quit()
  1. import time
  2. from selenium import webdriver
  3. from selenium.webdriver.common.by import By
  4. class JdSpider():
  5. def __init__(self):
  6. self.url = 'https://search.jd.com/Search?keyword=%E6%95%B0%E7%A0%81&enc=utf-8&wq=%E6%95%B0%E7%A0%81&pvid=34b0fcf7ed434840a74c057bc97be346'
  7. self.driver = webdriver.Chrome()
  8. def get_url(self):
  9. self.driver.get(self.url)
  10. self.driver.execute_script(
  11. "window.scrollTo(0, document.body.scrollHeight)"
  12. )
  13. time.sleep(2)
  14. li_list = self.driver.find_elements(By.XPATH, '//div[@id="J_goodsList"]/ul/li')
  15. detail_urls = []
  16. for li in li_list:
  17. a = li.find_element(By.XPATH, './/a')
  18. detail_urls.append(a.get_attribute('href'))
  19. for detail_url in detail_urls:
  20. js = f'open("{detail_url}")'
  21. self.driver.execute_script(js)
  22. self.driver.switch_to_window(self.driver.window_handles[1])
  23. time.sleep(2)
  24. self.get_detail()
  25. self.driver.close()
  26. self.driver.switch_to_window(self.driver.window_handles[0])
  27. def get_detail(self):
  28. print('获取详情')
  29. name = self.driver.find_element(By.CSS_SELECTOR, 'body > div:nth-child(10) > div > div.itemInfo-wrap > div.sku-name').text
  30. print(name)
  31. if __name__ == '__main__':
  32. spider = JdSpider()
  33. spider.get_url() # *

selenium-iframe

网页中嵌套了网页,先切换到iframe,再执行其他操作

切换到要处理的iframe

browaer.switch_to.frame(frame节点对象)

  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. import infos
  4. url = 'https://douban.com/'
  5. driver = webdriver.Chrome()
  6. driver.get(url)
  7. iframe = driver.find_element(By.XPATH, '//div[@class="login"]/iframe')
  8. # print(iframe)
  9. driver.switch_to.frame(iframe) # 切进来
  10. # 点击密码登录
  11. driver.find_element(By.XPATH, '/html/body/div[1]/div[1]/ul[1]/li[2]').click()
  12. # 输入账号密码
  13. driver.find_element(By.XPATH, '//*[@id="username"]').send_keys(infos.username)
  14. driver.find_element(By.XPATH, '//*[@id="password"]').send_keys(infos.username)
  15. # 点击登录
  16. driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div[1]/div[5]/a').click()

验证码处理

数字验证码:

img = driver.find_element(By.XPATH, '复制验证码所在代码段的XPATH(右击--copy)')

img.screenshot("1.png")     # 将图片截取下来

【网站:www.ttshitu.com---登录--开发文档--python--可以找到相应代码】

  1. def base64_api(uname, pwd, img, typeid):
  2. with open(img, 'rb') as f:
  3. base64_data = base64.b64encode(f.read())
  4. b64 = base64_data.decode()
  5. data = {"username": uname, "password": pwd, "typeid": typeid, "image": b64}
  6. result = json.loads(requests.post("http://api.ttshitu.com/predict", json=data).text)
  7. if result['success']:
  8. return result["data"]["result"]
  9. else:
  10. return result["message"]
  11. img_path = "1.jpg"
  12. result = base64_api(uname='你的账号', pwd='你的密码', img=img_path, typeid=3)
  13. print(result) # 记得导包

滑动验证码: 

  1. button = driver.find_element(By.CSS_SELECTOR, '复制验证码所在代码的CSS路径')
  2. action = ActionChains(driver)
  3. action.click_and_hold(button).perform() # 点击且不松开
  4. action.move_by_offset(int(result) - 30, 0) # 滑块与左边框距离30
  5. action.release().perform()

selenium翻页操作

取到第一页数据:

  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. url = 'https://www.maoyan.com/board/4?offset=0'
  4. driver = webdriver.Chrome()
  5. driver.get(url)
  6. driver.maximize_window()
  7. dds = driver.find_elements(By.XPATH, '//*[@id="app"]/div/div/div[1]/dl/dd')
  8. for dd in dds:
  9. print(dd.text.split('\n'))
  10. print('-'*30)

翻页爬取:

  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. url = 'https://www.maoyan.com/board/4?offset=0'
  4. option = webdriver.ChromeOptions()
  5. option.add_argument('--headless') # 加上这两句就不会弹出页面了(无头模式),,当然也可以不添加
  6. driver = webdriver.Chrome()
  7. driver.get(url)
  8. driver.maximize_window()
  9. dds = driver.find_elements(By.XPATH, '//*[@id="app"]/div/div/div[1]/dl/dd')
  10. def get_data():
  11. """一页的数据"""
  12. dds = driver.find_elements(By.XPATH, '//*[@id="app"]/div/div/div[1]/dl/dd')
  13. for dd in dds:
  14. print(dd.text.split('\n'))
  15. print('-' * 30)
  16. while True:
  17. get_data()
  18. try:
  19. driver.find_element(By.LINK_TEXT, '下一页').click() # 点击下一页的文本
  20. except Exception as e: # 做异常处理,数据爬取100个后就没有下一页,会报错的
  21. print(e)
  22. print('数据爬取完成') # 没有下一页代表完成
  23. driver.quit()
  24. break

 操作cookie

获取cookie:driver.get_cookies()

根据cookie的key获取value:value=driver.get_cookie(key)

删除所有的cookie:driver.delete_all_cookies()

删除某个cookie:driver.delete_cookie(key)

  1. import time
  2. from selenium import webdriver
  3. from selenium.webdriver.common.by import By
  4. import infos
  5. url = 'https://douban.com/'
  6. driver = webdriver.Chrome()
  7. driver.get(url)
  8. iframe = driver.find_element(By.XPATH, '//div[@class="login"]/iframe')
  9. # print(iframe)
  10. driver.switch_to.frame(iframe) # 切进来
  11. # 点击密码登录
  12. driver.find_element(By.XPATH, '/html/body/div[1]/div[1]/ul[1]/li[2]').click()
  13. # 输入账号密码
  14. driver.find_element(By.XPATH, '//*[@id="username"]').send_keys(infos.username)
  15. driver.find_element(By.XPATH, '//*[@id="password"]').send_keys(infos.password)
  16. # 点击登录
  17. driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div[1]/div[5]/a').click()
  18. time.sleep(20)
  19. cookies = driver.get_cookies()
  20. cookies_dict = {}
  21. for cookie in cookies:
  22. name = cookie['name']
  23. value = cookie['value']
  24. cookies_dict[name] = value
  25. url = 'https://douban.com/'
  26. import requests
  27. headers = {
  28. 'User-Agent': '# 将User-Agent复制过来'
  29. }
  30. print(requests.get(url, cookies=cookies_dict, headers=headers).text) # 获取到登陆后的数据

隐式等待和显式等待 

隐式等待:指定一个时间,在这个时间内会一直处于等待状态。使用:driver.implicitly_wait

显式等待:指定在某个时间内,如果某个条件满足了,就不会在等待。使用:from selenium.webdriver.support.ui import WebDriverWait

  1. from selenium.webdriver.support import expected_conditions as EC
  2. driver = webdriver.Chrome()
  3. driver.get("https://www.baidu.com")
  4. # 隐式等待:后续的标签定位都会建立在5秒之内
  5. # 后续的某个标签在5秒内加载出来就进行爬取,否则继续下一页
  6. driver.implicitly_wait(5)
  7. # 显式等待:针对某一个标签定位
  8. WebDriverWait(driver, 10).until(
  9. EC.presence_of_all_elements_located((By.LINK_TEXT, "地图"))
  10. ).click()

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/89815
推荐阅读
相关标签
  

闽ICP备14008679号