使用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 ...
随机推荐
- Random Forest And Extra Trees
随机森林 我们对使用决策树随机取样的集成学习有个形象的名字–随机森林. scikit-learn 中封装的随机森林,在决策树的节点划分上,在随机的特征子集上寻找最优划分特征. import numpy ...
- Redis(1)——5种基本数据结构
一.Redis 简介 "Redis is an open source (BSD licensed), in-memory data structure store, used as a d ...
- Leetcode 141题 环形链表(Linked List Cycle) Java语言求解
题目描述: 给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. Map ...
- C++走向远洋——43(人数不定的工资类,动态分配内存与释放)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- percona-toolkit 之 【pt-query-digest】介绍
背景: 做为一个MySQL DBA,分析慢查询是日常主要的工作之一,之前一直使用mysqlsla作为分析慢查询的, 因为简单并且也能满足自己对慢查询分析的要求,对于另一个工具pt-query-dige ...
- Swift和Objective-C中的协议(protocol)有什么异同
Swift和Objective-C中的protocol的相同点在于:两者可以被用作代理.Objective-C中的protocol类似于Java中的Interface,在实际开发中主要用与适配器模式( ...
- 7-40 jmu-python-统计成绩 (15 分)
输入一批学生成绩,计算平均成绩,并统计不及格学生人数. 输入格式: 每行输入一个数据,输入数据为负数结束输入 输出格式: 平均分=XX,不及格人数=XX,其中XX表示对应数据.如果没有学生数据,输出没 ...
- proxyTable的配置
在dev环境下面: proxyTable: { '/api': { target: 'http://api.douban.com/v2', //主域名,以前我都写192.168.2.57:80,这里跨 ...
- 我折腾的shell笔记
目录 Mac一些常用的快捷键记录 iTerm2或者命令行相关 Mac桌面上或者某目录下操作 一些实用脚本示例 代码无提示或者其他抽风症状,清除Xcode缓存 查看当前网络ip地址 日常提交推送git代 ...
- 关于gradle与maven对springboot项目的配置文件加载异同
先说下缘由吧,由于年后跳槽换了家公司,构建项目工具也有maven改成gradle了,所以在搭建框架进行开发打包过程中难免会遇到一些意想不到的问题. 本文简述下打包扫描加载配置文件的异同吧. maven ...