selenium的基本信息
基本定义:
- Selenium 的核心目标是通过编程控制浏览器来实现 Web 测试和自动化任务,无需手动操作。
- Selenium 的核心是通过 WebDriver 驱动浏览器,遵循 W3C WebDriver 协议实现自动化。这使其能模拟用户行为,例如打开网址、输入文本、执行点击操作。
- Selenium 最初设计用于 Web 测试(如回归测试),但现在已广泛应用于数据抓取、UI 自动化脚本等领域。
安装虚拟环境:
python
pip install selenium
文档
- selenium python api
动态网页数据的提取
- 如果查看源代码的数据,会发现在源代码中没有数据,数据是使用动态加载完成的,所以对于动态加载的网页,必须使用browser.page_source 获取加载过后的网页才能获取到数据。
代码
python
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("https://detail.tmall.com/item.html?")
print(browser.page_source)
browser.quit()#退出浏览器
html
<html lang="en" style="height:100%;"><head>
<meta charset="utf-8">
<meta name="robots" content="noodp, noydir">
<meta name="eagleeye-trace" content="215041f517676127023577655eee13">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="-1">
<meta name="data-spm" content="a212t0">
<link rel="dns-prefetch" href="//ynuf.alipay.com">
<link rel="dns-prefetch" href="//ynuf.aliapp.org">
<link rel="dns-prefetch" href="//cf.aliyun.com">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=0">
<meta name="description" content="taobao.com">
<title>登录</title>
<link href="https://gw.alicdn.com/tps/i2/TB1nmqyFFXXXXcQbFXXE5jB3XXX-114-114.png" rel="apple-touch-icon-precomposed">
<link rel="shortcut icon" href="https://gw.alicdn.com/tps/i2/TB1nmqyFFXXXXcQbFXXE5jB3XXX-114-114.png" type="image/x-icon">
<link href="https://g.alicdn.com/vip/havana-nlogin/0.10.31/index.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" href="https://g.alicdn.com/vip/biz-assets/0.2.68/assets/taobao_pc_width_login_new.css">
<script>
window.enableWwSsoPluginLogin = true;
</script></head></html>
获取动态网页上的数据
- 正常情况下可以使用:
python
text = browser.find_element(By.XPATH,"")
- 但是由于selenium获取数据的速度比较慢,如果在scrapy爬虫框架中需要获取数据可以使用Selector。
python
from selenium import webdriver
from scrapy.selector import Selector
browser = webdriver.Chrome()
browser.get("")
print(browser.page_source)
t_selector = Selector(text=browser.page_source)
t_selector.css("")
browser.quit()
模拟登录知乎
python
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
browser = webdriver.Chrome()
browser.get("https://www.zhihu.com/signin?")
browser.switch_to.frame('frame_name')
mima_click = browser.find_element(By.XPATH,'//div[@class="SignFlow-tabs"]/div[2]')
username = browser.find_element(By.XPATH, '//form/div[@class="SignFlow-account"]//input')
username.send_keys("")
password = browser.find_element(By.XPATH, '//form/div[@class="SignFlow-password"]//input')
password.send_keys("")
browser.find_element(By.XPATH, "//form/button").click()
input("回车继续:")
time.sleep(4)
browser.refresh() #刷新网页
time.sleep(4)
cookie = browser.get_cookies() #获取cookie信息
if cookie:
print(cookie)
else :
print(cookie= list())
print(cookie)
模拟鼠标下拉
python
from selenium import webdriver
import time
browser = webdriver.Chrome()
browser.get("https://www.oschina.net/blog/")
for i in range(3):
browser.execute_script("window.scrollTo(0,document.body.scrollHeight);var lenOfPage=document.body.scrollHieght;return lenOfPage;")
time.sleep(3)
print(browser.page_source)
不加载图片
python
from selenium import webdriver
import time
chrome_options = webdriver.ChromeOptions()
prefs = {"profile.managed_default_content_settings.images": 2}
chrome_options.add_experimental_option("prefs", prefs)
browser = webdriver.Chrome(options=chrome_options)
browser.get("https://www.oschina.net/blog/")
time.sleep(5)
print(browser.page_source)
phantomjs获取动态页面
phantomjs,无界面的浏览器,多进程情况下phantomjs性能会下降很快
python
from selenium import webdriver
url = "https://example.com"
path_PhantomJS = ""
driver = webdriver.PhantomJS(excutable_path = path_PhantomJS)
driver.get(url)
print(driver.page_source.encode("utf-8"))
selenium集成到scrapy中
- 打开下载器中间件
python
DOWNLOADER_MIDDLEWARES = {
'ArticleSpider.middlewares.JSPageMiddleware': 1,
}
- 在中间件中创建
python
from selenium import webdriver
from scrapy.http import HtmlResponse
class JSPageMiddleware(object):
#通过chrome请求动态网页
def process_request(self, request, spider):
if spider.name == "爬虫名":
#创建browser。如果在这里创建,那么每经过一次,就会创建一次
# browser = webdriver.Chrome(executable_path="D:/Temp/chromedriver.exe")
spider.browser.get(request.url)
import time
time.sleep(3)
#查看访问的网址
print ("访问:{0}".format(request.url))
callback = request.callback
#HtmlResponse()的作用:数据流经过这一步,数据不会进入下载器,而是直接返回给爬虫
#encoding="utf-8":这里的encoding需要注意,并不是所有的页面都是阿斯克码需要自己去判断
return HtmlResponse(url=spider.browser.current_url, body=spider.browser.page_source, encoding="utf-8", request=request)
- 为了防止数据流每经过一次中间件,浏览器就启动一次,将创建放入spiderzhong
python
from pydispatch import dispatcher
from scrapy import signals
#可以用spider_opened: 爬虫下载器中间件替代
def __init__(self):
self.browser = webdriver.Chrome()
super(爬虫Spider,self).__init__()
#信号量
dispatcher.connect(self.handle_spider_closed, signals.spider_closed)
def spider_closed(self,spider):
#当爬虫退出的时候关闭browser
print("spider closed")
self.browser.quit()
注意:由于在中间件中使用了selenium,所以不是异步的了,为了保证异步执行,可以使用scrapy-splash,或者使用selenium-grid