为什么要使用模拟器?
在使用request的时候,大型网站都有很多的反爬机制,典型比如滑动验证码、弹窗广告、弹窗验证、登录认证、Ajax异步加载...等等,这些是request很难绕过去的。这时候可以使用selenium模拟器来模拟用户操作:Selenium可以根据的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生等.
pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple
pip list

① 使用SergeyPirogov (Sergey Pirogov) · GitHub自动下载驱动管理器(推荐)
pip install webdriver-manager -i https://pypi.tuna.tsinghua.edu.cn/simple
②手动下载并指定驱动

- import time
- from selenium import webdriver
- from selenium.webdriver.chrome.service import Service as ChromeService
- from selenium.webdriver.common.by import By
- from webdriver_manager.chrome import ChromeDriverManager
-
- if __name__ == '__main__':
- # 初始化驱动
- service = ChromeService(executable_path=ChromeDriverManager().install())
- # 配置
- options = webdriver.ChromeOptions()
- # 无头模式
- # options.add_argument('--headless')
- # 获取浏览器实例
- driver = webdriver.Chrome(service=service, options=options)
-
- # 访问百度
- driver.get("https://www.baidu.com/")
- # 全屏
- driver.maximize_window()
- # 获取关键字输入框
- input_element = WebDriverWait(driver, timeout=3).until(lambda d: d.find_element(By.ID, "kw"))
- # 输入搜索关键字
- input_element.send_keys("苍穹之跃")
- # 获取【百度一下】按钮
- search_button_element = WebDriverWait(driver, timeout=3).until(lambda d: d.find_element(By.ID, "su"))
- # 点击
- search_button_element.click()
- # 获取当前页面
- print(driver.page_source.encode('utf-8'))
- # 页面停留
- time.sleep(30)
- # 销毁实例
- driver.quit()
- from selenium import webdriver
- from selenium.webdriver.chrome.service import Service as ChromeService
- from selenium.webdriver.common.by import By
- from webdriver_manager.chrome import ChromeDriverManager
-
- class SeleniumMiddleware(object):
- def process_response(self, request, response, spider):
- # 初始化驱动
- service = ChromeService(executable_path=ChromeDriverManager().install())
- # 配置
- options = webdriver.ChromeOptions()
- # 无头模式
- # options.add_argument('--headless')
- # 获取浏览器实例
- driver = webdriver.Chrome(service=service, options=options)
-
- # 访问网页
- driver.get(request.url)
- # 全屏
- # driver.maximize_window()
- # 一般用于异步加载-等待特定元素出现:driver就是浏览器驱动,timeout就是等待的时长,until后是判断元素是否出现的
- wdw = WebDriverWait(driver, timeout=10).until(lambda d: d.find_element(By.CLASS_NAME, "lm_tabe"))
- # network记录,这里可以获得所有ajax请求的结果
- # logs = get_xhr_logs(driver)
- # 动态加载后的网页
- html = driver.page_source
- # 退出浏览器
- driver.quit()
- return scrapy.http.HtmlResponse(url=request.url, body=html.encode('utf-8'), encoding='utf-8', request=request)
- DOWNLOADER_MIDDLEWARES = {
- 'announcement.middlewares.SeleniumMiddleware': 543,
- }