简介
Selenium 是一个自动化测试工具,利用它可用驱动浏览器执行特定的动作,如点击、下拉等操作,同时还可以获取浏览器当前呈现的页面的源代码,做到可见即可爬。对于一些 JavaScript 动态渲染的页面来说,此中抓取方式非常有效。
安装
安装 selenium
pip install selenium
这样做还不够,因为我们还需要用浏览器(如 Chrome、Firefox 等)来配合 Selenium 工作。
谷歌
http://chromedriver.storage.googleapis.com/index.html
火狐
https://github.com/mozilla/geckodriver/releases
把下载的驱动(chromedriver.exe)文件拖到 Python 的 Scripts 目录下,也可以单独将其所在路径配置到环境变量。
访问页面
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('http://www.taobao.com')
print(browser.page_source)
browser.close()
练习
接下来爬取小说页面 http://chuangshi.qq.com/bk/xx/AGoEMl1lVjAAOFRjATkBYg-r-1.html
这是创世中文网的一个章节,内容是 JavaScript 生成的
如果直接用 requests 爬取是不行的
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
# 设置启动 chrome 时不可见
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"')
# browser = webdriver.Firefox() # 火狐浏览器
browser = webdriver.Chrome(options=chrome_options) # 谷歌浏览器
browser.get("http://chuangshi.qq.com/bk/xx/AGoEMl1lVjAAOFRjATkBYg-r-1.html")
html = browser.page_source
with open('practise.txt','w',encoding='utf-8') as f:
f.write(html)
browser.close()
待解决的问题
- 再次爬取上面的网站后不会出现内容
解决方法: 延时等待
-
隐式等待
from selenium import webdriver with webdriver.Chrome() as browser: browser.implicitly_wait(10)
-
显示等待
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC with webdriver.Chrome() as browser: browser.get("http://chuangshi.qq.com/bk/xx/AGoEMl1lVjAAOFRjATkBYg-r-1.html") wait = WebDriverWait(browser,10) wait.until(EC.presence_of_element_located((By.XPATH,"//div[@class='bookreadercontent']/p"))) content = browser.find_elements_by_xpath("//div[@class='bookreadercontent']/p") for c in content: print(c.text)
-
time.sleep(2)