使用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 ...
随机推荐
- 使用Handler的步骤
使用Handler的大致流程: 1.首先创建一个Handler对象,可以直接使用Handler无参构造函数创建Handler对象,也可以继承Hander类,重写HandleMessage方法来创建Ha ...
- Mysql SQL Mode简介
MySQL服务器能够工作在不同的SQL模式下,并能针对不同的客户端以不同的方式应用这些模式.这样,应用程序就能对服务器操作进行量身定制以满足自己的需求.这类模式定义了MySQL应支持的SQL语法,以及 ...
- 【WPF学习】第五十三章 动画类型回顾
创建动画面临的第一个挑战是为动画选择正确的属性.期望的结果(例如,在窗口中移动元素)与需要使用的属性(在这种情况下是Canvas.Left和Canvas.Top属性)之间的关系并不总是很直观.下面是一 ...
- Mysql报错:Authentication .....Reading from the stream has failed
连接Mysql5.7版本的数据库出现报错:Authentication to host '171.13.164.***' for user 'root' using method 'mysql_nat ...
- 【译】使用FormData对象
系列文章说明 原文 FormData对象能让你生成一系列用于XMLHttpRequest发送的键值对.它主要的目的在于发送表单数据,但也能独立用于传输有键形式的数据.其传输的数据格式和表单使用subm ...
- web前端性能优化的技巧
1. 请减少HTTP请求 基本原理: 在浏览器(客户端)和服务器发生通信时,就已经消耗了大量的时间,尤其是在网络情况比较糟糕的时候,这个问题尤其的突出. 一个正常HTTP请求的流程简述:如在浏览器中输 ...
- Python爬虫抓取微博评论
第一步:引入库 import time import base64 import rsa import binascii import requests import re from PIL impo ...
- web页面上展示图片时,图片不显示,报错:ERR_CONTENT_LENGTH_MISMATCH
问题描述 前端页面加载css,和js文件的时候,经常出现ERR_CONTENT_LENGTH_MISMATCH的报错情况. 查找问题 在单独打开hearder中css,js的网络地址是能打开的 ...
- JavaScript的数组系列
数组 今天逆战班的学习主题关于Javascript的数组,主要有数组的概念.创建.分类.方法.遍历.经典算法...... 一.数组是什么呢?怎么写数组呢?数组有多少种呢? 数组的概念 对象是属性的无序 ...
- Function.prototype.call.apply()方法
在看uncurrying化函数时候,碰到了Function.prototype.call.apply()的用法: 先说说uncurrying()函数: Function.prototype.uncur ...