使用scrapy-selenium, chrome-headless抓取动态网页
自带buff 人气:0
在使用scrapy抓取网页时, 如果遇到使用js动态渲染的页面, 将无法提取到在浏览器中看到的内容. 针对这个问题scrapy官方给出的方案是scrapy-selenium, 这是一个把selenium集成到scrapy的开源项目, 它使用selenium抓取已经渲染好(js代码已经执行完成)的动态网页.
事实上selenium自己也没有渲染动态网页的能力,它还是得依赖浏览器, 用浏览器作为动态网页的渲染引擎. 目前主流的浏览器都能以headless模式运行, 即没有图形界面只有命令行界面. 同时提供了驱动程序和headless模式运行的浏览器交互的驱动, 驱动程序提供了一些API, 用于控制浏览器的行为, 如: 拖动滚动条, 生成网页缩略图等. selenium整合了这些浏览器驱动, 让用户可以用统一的接口和不同的浏览器进行交互, 所以selenium本质上就是一个adapter.
本文以chrome浏览器为网页渲染引擎, 完整地讲解抓取动态网页的方法.
## 第一步 安装chrome
本人长期在linux服务器平台下工作, 所以使用的环境是ubuntu-18.04.3-live-server. 以前还没在服务器安装过浏览器, 也挺陌生的. 首先进入chrome的官网https://www.google.cn/chrome/ 下载安装包google-chrome-stable_current_amd64.deb. 在页面底部,有个”其他平台“链接, 点进去找到这个安装包.
安装chrome: sudo dpkg -i google-chrome-stable_current_amd64.deb 出现依赖问题, 修复: sudo apt --fix-broken install 再次安装就可以了.
找个网站验证一下chrome是否能够正常工作: google-chrome --headless --no-sandbox --disable-gpu --dump-dom https://www.gushiwen.org/ >> index.html 如果在当前目录下能够正常的生成index.html文件,表示chrome已经安装成功.
## 第二步 安装scrapy-selenium, chromedriver 安装scrapy-selenium: pip install scrapy-selenium 查看你的chrome版本: google-chrome --version Google Chrome 80.0.3987.149 在这里http://chromedriver.storage.googleapis.com/index.html找到对应版本的chromedriver. 我用的dirver是http://chromedriver.storage.googleapis.com/80.0.3987.16/chromedriver_linux64.zip. 手动安装dirver: unzip chromedriver_linux64.zip chmod a+x chromedriver cp chromedriver /usr/bin/ 这样就把chromedriver安装到/usr/bin目录下了. ## 第三步 为你的scrapy项目配置好scrapy-selenium 在scrapy项目的settings.py文件中添加如下代码配置scrapy-selenium ```python SELENIUM_DRIVER_NAME = 'chrome' #浏览器driver名字 SELENIUM_DRIVER_EXECUTABLE_PATH = '/usr/bin/chromedriver' #浏览器driver的位置 #chrome浏览器的参数 SELENIUM_DRIVER_ARGUMENTS=['--headless', '--no-sandbox', '--disable-gpu'] #下载器中间件配置 DOWNLOADER_MIDDLEWARES = { 'scrapy_selenium.SeleniumMiddleware': 800 } ``` 创建一个spider验证一下scrapy-selenium是否可用 ```python import scrapy from scrapy_selenium import SeleniumRequest class Myspider(scrapy.Spider): name = "myspider" def start_requests(self): #这里使用SeleniumRequest抓取页面, 在parse中抓取页面也要用它 yield SeleniumRequest(url='https://www.gushiwen.org/', callback=self.parse) def parse(self, response): with open('index.html', 'wb') as f: f.write(response.body) ``` 运行这个spider scrapy crawl myspider 在当前目录就会有一个index.html文件. 如果正常的话会发现使用js动态生成的内容已经被渲染到dom文档中了. 现在已经成功地抓取到一个动态页面啦!
安装chrome: sudo dpkg -i google-chrome-stable_current_amd64.deb 出现依赖问题, 修复: sudo apt --fix-broken install 再次安装就可以了.
找个网站验证一下chrome是否能够正常工作: google-chrome --headless --no-sandbox --disable-gpu --dump-dom https://www.gushiwen.org/ >> index.html 如果在当前目录下能够正常的生成index.html文件,表示chrome已经安装成功.
## 第二步 安装scrapy-selenium, chromedriver 安装scrapy-selenium: pip install scrapy-selenium 查看你的chrome版本: google-chrome --version Google Chrome 80.0.3987.149 在这里http://chromedriver.storage.googleapis.com/index.html找到对应版本的chromedriver. 我用的dirver是http://chromedriver.storage.googleapis.com/80.0.3987.16/chromedriver_linux64.zip. 手动安装dirver: unzip chromedriver_linux64.zip chmod a+x chromedriver cp chromedriver /usr/bin/ 这样就把chromedriver安装到/usr/bin目录下了. ## 第三步 为你的scrapy项目配置好scrapy-selenium 在scrapy项目的settings.py文件中添加如下代码配置scrapy-selenium ```python SELENIUM_DRIVER_NAME = 'chrome' #浏览器driver名字 SELENIUM_DRIVER_EXECUTABLE_PATH = '/usr/bin/chromedriver' #浏览器driver的位置 #chrome浏览器的参数 SELENIUM_DRIVER_ARGUMENTS=['--headless', '--no-sandbox', '--disable-gpu'] #下载器中间件配置 DOWNLOADER_MIDDLEWARES = { 'scrapy_selenium.SeleniumMiddleware': 800 } ``` 创建一个spider验证一下scrapy-selenium是否可用 ```python import scrapy from scrapy_selenium import SeleniumRequest class Myspider(scrapy.Spider): name = "myspider" def start_requests(self): #这里使用SeleniumRequest抓取页面, 在parse中抓取页面也要用它 yield SeleniumRequest(url='https://www.gushiwen.org/', callback=self.parse) def parse(self, response): with open('index.html', 'wb') as f: f.write(response.body) ``` 运行这个spider scrapy crawl myspider 在当前目录就会有一个index.html文件. 如果正常的话会发现使用js动态生成的内容已经被渲染到dom文档中了. 现在已经成功地抓取到一个动态页面啦!
加载全部内容