17.1 动态HTML技术
17.2 Selenium和PhantomJS入门
17.2.1 Selenium
- Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开 发的,Selenium可以直接运行在浏览器上,它支持所有主流的浏览器 (包括PhantomJS这些无界面的浏览器),可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏
17.2.2 PhantomJS
- PhantomJS 是一个基于Webkit的“无界面”(headless)浏览器,它会把 网站加载到内存并执行页面上的JavaScript
- http://selenium-python-zh.readthedocs.io/en/latest/waits.html
17.2.3 加载网页
- from selenium import webdriver
- driver =webdriver.PhantomJS(“c:…/pantomjs.exe”)
- driver.get(“http://www.baidu.com/”)
- driver.save_screenshot(“长城.png”)
17.2.4 定位和操作
- driver.find_element_by_id(“kw”).send_keys(“长城”)
- driver.find_element_by_id(“su”).click()
17.2.5 查看请求信息
- driver.page_source
- driver.get_cookies()
- driver.current_url
17.2.6 退出
- driver.close() #退出当前页面
- driver.quit() #退出浏览器
17.3 页面元素定位
17.3.1 用法
- find_element_by_id (返回一个)
- find_elements_by_xpath (返回一个列表)
- find_elements_by_link_text
- find_elements_by_partial_link_text
- find_elements_by_tag_name
- find_elements_by_class_name
- find_elements_by_css_selector
17.3.2 注意点
- find_element 和find_elements的区别:返回一个和返回一个列表
- by_link_text和by_partial_link_text的区别:全部文本和包含某个文本
- by_css_selector的用法: #food span.dairy.aged
- by_xpath中获取属性和文本需要使用get_attribute() 和.text
17.4 Cookie相关用法
- {cookie[‘name’]: cookie[‘value’] for cookie in driver.get_cookies()}
- driver.delete_cookie(“CookieName”)
- driver.delete_all_cookies()
17.5 页面等待
- 为什么需要等待
- 如果网站采用了动态html技术,那么页面上的部分元素出现时间便不能确定,这个时候就可以设置一个等待时间,强制要求在时间内出现,否则报错
- 强制等待
- time.sleep(10)
- 显式等待(了解)
- 显式等待指定某个条件,然后设置最长等待时间。如果在这个时间还没有找到元素,那么便会抛出异常了.
- WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,“myDynamicElement”))
- 隐式等待(了解)
- 就是简单地设置一个最大等待时间,单位为秒。
- driver.implicitly_wait(10)
17.6 Selenium总结
- 应用场景:
- 动态html页面请求
- 登录获取cookies
- 如何使用
- 导包并且实例化driver
- 发送请求
- 定位获取数据
- 保存
- 退出driver
- Cookies相关方法:
- get_cookies()
- 页面等待
- 强制等待
17.7 实验
In:
pip install selenium
out:
Requirement already satisfied: selenium in d:\programdata\anaconda3\lib\site-packages (3.141.0)
Requirement already satisfied: urllib3 in d:\programdata\anaconda3\lib\site-packages (from selenium) (1.24.2)
Note: you may need to restart the kernel to use updated packages.
In:
from selenium import webdriver
driver和chrome浏览器的版本必须一致,版本号为84.0.4147.89
In:
chrome_driver = "D:\Software\chromedriver_win32\chromedriver.exe"
driver = webdriver.Chrome(executable_path=chrome_driver)
In:
driver.get("http://www.baidu.com")
driver.save_screenshot("baidu.jpg")
out:
D:\ProgramData\Anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py:1031: UserWarning: name used for saved screenshot does not match file type. It should end with a `.png` extension
"type. It should end with a `.png` extension", UserWarning)
True
In:
driver.find_element_by_id("kw").send_keys("山西")
driver.find_element_by_id("su").click()
In:
driver.page_source #查看源码
out:
'<html><head>\n\t\t\n\t\t<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">\n\t\t<meta http-equiv="content-type" content="text/html;charset=utf-8">\n\t\t<meta content="always" name="referrer">\n <meta name="theme-color" content="#2932e1">\n <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">\n <link rel="icon" sizes="any" mask="" href="//www.baidu.com/img/baidu_85beaf5496f291521eb75ba38eacbd87.svg">\n <link rel="search" type="application/opensearchdescription+xml" href="/content-search.xml" title="百度搜索">\n\t\t\n\t\t\n<title>的萨芬的萨芬山西_百度搜索</title>\n\n\t\t\n\n\t\t\n<style data-for="result" type="text/css"
......
In:
driver.current_url
out:
'https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E7%9A%84%E8%90%A8%E8%8A%AC%E7%9A%84%E8%90%A8%E8%8A%AC%E5%B1%B1%E8%A5%BF&fenlei=256&rsv_pq=999ca4840000d309&rsv_t=ffe7EbbRbObB30eH4uFmugYG6zb3XYJrnju4aImfAsmh3lGVl1t0SHiFjiI&rqlang=cn&rsv_enter=0&rsv_dl=tb&rsv_sug3=12&rsv_sug1=2&rsv_sug7=100&rsv_btype=i&inputT=183235&rsv_sug4=183495&rsv_jmp=slow'
In:
driver.get_cookies()[0]['domain']
out:
'.baidu.com'
In:
driver.close()
driver.quit()
猎聘
In:
lp_drv = webdriver.Chrome(executable_path=chrome_driver)
lp_drv.get("https://www.liepin.com/zhaopin/?key=大数据分析工程师")
In:
joblist = lp_drv.find_elements_by_xpath("//div[@class='job-info']/h3")
In:
#get_attribute获取webelement的属性
for webelm in joblist:
title = webelm.get_attribute('title')
print(title)
out:
招聘大数据分析工程师
招聘大数据分析工程师/算法工程师
招聘高级测试工程师(大数据分析方向)
招聘大数据分析-AE工程师
招聘大数据分析工程师
招聘大数据分析工程师
招聘大数据分析工程师
招聘大数据分析工程师
招聘大数据分析工程师
招聘大数据分析工程师
招聘大数据分析工程师
招聘大数据分析工程师
招聘大数据分析工程师
招聘大数据分析工程师
招聘大数据分析工程师
招聘大数据分析工程师
招聘大数据分析工程师
招聘大数据分析工程师
招聘数据科学家/算法工程师/大数据分析师Data Scientist
招聘大数据分析开发工程师
招聘25926-用户画像大数据分析工程师
招聘大数据分析工程师
招聘大数据分析工程师
招聘大数据分析工程师
招聘大数据分析工程师
招聘大数据分析工程师
招聘大数据分析工程师
招聘大数据分析工程师
招聘大数据分析工程师
招聘大数据分析工程师
招聘大数据分析工程师
招聘大数据分析工程师-风险咨询部门
招聘大数据分析工程师
招聘大数据分析挖掘工程师-昆山-05417
招聘大数据分析工程师
招聘大数据分析工程师
招聘大数据分析工程师(实习生)
招聘大数据分析工程师
招聘IP网络大数据分析工程师
招聘大数据分析工程师
In:
salaries = lp_drv.find_elements_by_xpath("//div[@class='job-info']/p/span[1]")
In:
#text获取文本值
for webelm in salaries:
salary = webelm.text
print(salary)
out:
面议
投递后:72小时反馈
10-15k·12薪
投递后:7个工作日内反馈
10-20k·12薪
投递后:72小时反馈
10-15k·13薪
投递后:7个工作日内反馈
10-20k·12薪
投递后:10个工作日内反馈
7-15k·12薪
投递后:10个工作日内反馈
7-13k·12薪
投递后:7个工作日内反馈
15-25k·12薪
35-60k·14薪
35-55k·14薪
22-30k·14薪
20-40k·14薪
35-55k·14薪
面议
投递后:10个工作日内反馈
10-20k·12薪
投递后:7个工作日内反馈
6-10k·13薪
投递后:7个工作日内反馈
20-30k·12薪
15-25k·12薪
15-25k·12薪
投递后:7个工作日内反馈
15-30k·13薪
投递后:72小时反馈
面议
投递后:72小时反馈
25-40k·12薪
投递后:72小时反馈
30-40k·15薪
15-25k·13薪
15-25k·13薪
8-13k·14薪
投递后:72小时反馈
8-15k·12薪
投递后:5个工作日内反馈
15-25k·12薪
投递后:7个工作日内反馈
15-25k·12薪
15-28k·12薪
20-25k·12薪
10-17k·12薪
投递后:10个工作日内反馈
30-50k·14薪
8-12k·12薪
投递后:72小时反馈
面议
投递后:24小时反馈
5-10k·12薪
投递后:24小时反馈
2-3k·12薪
投递后:10个工作日内反馈
20-30k·12薪
15-25k·12薪
14-16k·12薪
投递后:24小时反馈
In:
lp_drv.find_element_by_link_text("下一页").get_attribute("href")
out:
'https://www.liepin.com/zhaopin/?compkind=&dqs=&pubTime=&pageSize=40&salary=&compTag=&sortFlag=°radeFlag=0&compIds=&subIndustry=&jobKind=&industries=&compscale=&key=%E5%A4%A7%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E5%B7%A5%E7%A8%8B%E5%B8%88&siTag=ZYUcLeLtvQM4R0EVN5PTzQ%7EfA9rXquZc5IkJpXC-Ycixw&d_sfrom=search_unknown&d_ckId=a05fccca9f296298eb85beddd04aa804&d_curPage=0&d_pageSize=40&d_headId=a05fccca9f296298eb85beddd04aa804&curPage=1'
In:
lp_drv.find_elements_by_tag_name("div")[0]
out:
<selenium.webdriver.remote.webelement.WebElement (session="cb6e96aa388e2a1e5a93cce03b591525", element="384f6c74-929a-4168-a0cb-6966104119ac")>
In:
lp_drv.find_element_by_class_name("last").get_attribute("href")
out:
'https://www.liepin.com/zhaopin/?compkind=&dqs=&pubTime=&pageSize=40&salary=&compTag=&sortFlag=°radeFlag=0&compIds=&subIndustry=&jobKind=&industries=&compscale=&key=%E5%A4%A7%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E5%B7%A5%E7%A8%8B%E5%B8%88&siTag=ZYUcLeLtvQM4R0EVN5PTzQ%7EfA9rXquZc5IkJpXC-Ycixw&d_sfrom=search_unknown&d_ckId=a05fccca9f296298eb85beddd04aa804&d_curPage=0&d_pageSize=40&d_headId=a05fccca9f296298eb85beddd04aa804&curPage=3'