使用scrapy-selenium, chrome-headless抓取动态网页
在使用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
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是否可用
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文档中了.
现在已经成功地抓取到一个动态页面啦!
使用scrapy-selenium, chrome-headless抓取动态网页的更多相关文章
- scrapy和selenium结合抓取动态网页
1.安装python (我用的是2.7版本的) 2.安装scrapy: 详情请参考 http://blog.csdn.net/wukaibo1986/article/details/8167590 ...
- selenium抓取动态网页数据
1.selenium抓取动态网页数据基础介绍 1.1 什么是AJAX AJAX(Asynchronouse JavaScript And XML:异步JavaScript和XML)通过在后台与服务器进 ...
- 【转】详解抓取网站,模拟登陆,抓取动态网页的原理和实现(Python,C#等)
转自:http://www.crifan.com/files/doc/docbook/web_scrape_emulate_login/release/html/web_scrape_emulate_ ...
- python网络爬虫抓取动态网页并将数据存入数据库MySQL
简述以下的代码是使用python实现的网络爬虫,抓取动态网页 http://hb.qq.com/baoliao/ .此网页中的最新.精华下面的内容是由JavaScript动态生成的.审查网页元素与网页 ...
- Python:利用 selenium 库抓取动态网页示例
前言 在抓取常规的静态网页时,我们直接请求对应的 url 就可以获取到完整的 HTML 页面,但是对于动态页面,网页显示的内容往往是通过 ajax 动态去生成的,所以如果是用 urllib.reque ...
- Chrome + Python 抓取动态网页内容
用Python实现常规的静态网页抓取时,往往是用urllib2来获取整个HTML页面,然后从HTML文件中逐字查找对应的关键字.如下所示: import urllib2 url="http: ...
- scrapy 抓取动态网页
-- coding: utf-8 -- ''' gouwu.sogou.com Spider, Created on Dec, 2014 version: 1.0 author: chenqx @ht ...
- selenium +chrome headless Adhoc模式渲染网页
mannual和adhoc模式比较 Manual vs. Adhoc In the script above, we start the ChromeDriver server process whe ...
- selenium +chrome headless Manual 模式渲染网页
可以看看这个里面的介绍,写得很好.https://duo.com/blog/driving-headless-chrome-with-python from selenium import webdr ...
随机推荐
- SolrJ 的运用
SolrJ 是操作 Solr 的 Java 客户端,它提供了增加.修改.删除.查询 Solr 索引的 Java 接口.SolrJ 针对 Solr 提供了 REST 的 Http 接口进行了封装, So ...
- CSRF之POST
最近重温<白帽子讲web安全>一书,看到第4章CSRF的时候,发现有个错误的地方,第116页底部的代码中有个坑,那段代码是运行不了的.原因是在form表单中有个<input type ...
- Gnome Ubuntu16安装Nvidia显卡396驱动,CUDA9.2以及cudnn9.2
深度学习环境配置,安装Nvidia显卡驱动,CUDA以及cudnn OS:ubuntu 16.04;driver: nvidia 396;CUDA: 9.2cudnn: 9.2 卸载原有Nvidia驱 ...
- 【深入理解Java虚拟机】类的初始化过程
类的初始化过程 类的加载过程.png 加载 将 Class 文件以二进制的形式加载到内存中 验证 校验 Class 文件是否安全,是否被正确的修改等 准备 为类变量申请内存,设置默认值,(初始化变量的 ...
- 小程序中,设置Sticky定位,距离上面会有一个缝隙
近日,在小程序中使用sticky定位实现吸顶效果,不料入了一个大坑. 定位后,距离有position: relative:的上级元素有个1px大小的缝隙条,透过缝隙,滑动时可看到定位标题下的内容. 此 ...
- 随手撸一个简单的带检查的printf
#include <stdio.h> #include <iostream> #include <vector> #include <string> # ...
- OpenFlow(OVS)下的“路由技术”
前言 熟悉这款设备的同学,应该也快到不惑之年了吧!这应该是Cisco最古老的路由器了.上个世纪80年代至今,路由交换技术不断发展,但是在这波澜壮阔的变化之中,总有一些东西在嘈杂的机房内闪闪发光,像极了 ...
- Linux系统简单文件操作命令
项目 内容 作业课程归属 班级课程链接 作业要求 作业要求链接 学号-姓名 17041419-刘金林 作业学习目标 1)学习Linux的基本操作命令:2)在终端上运用命令行去实现基本文件操作 1.查看 ...
- excel排序技术记录
问题: 给了我一个excel,要求以奖项和编码同时进行排序(奖项优先),但是单元格大小不一样,有数列都是合并了单元格的,同时编码的格式还不一样,有些是SMM-2-07,有些是2-07,所以根本无法进行 ...
- php实现post跳转
大家否知道php可以利用header('Location')实现get请求跳转. php利用curl可以实现模拟post请求. 但是却找不到php现成的实现post跳转.那么问题来了,如果有这个需求该 ...