Scrapy-Splash的介绍、安装以及实例

news/2024/9/9 14:16:45

scrapy-splash的介绍

  在前面的博客中,我们已经见识到了Scrapy的强大之处。但是,Scrapy也有其不足之处,即Scrapy没有JS engine, 因此它无法爬取JavaScript生成的动态网页,只能爬取静态网页,而在现代的网络世界中,大部分网页都会采用JavaScript来丰富网页的功能。所以,这无疑Scrapy的遗憾之处。
  那么,我们还能愉快地使用Scrapy来爬取动态网页吗?有没有什么补充的办法呢?答案依然是yes!答案就是,使用scrapy-splash模块!
  scrapy-splash模块主要使用了Splash. 所谓的Splash, 就是一个Javascript渲染服务。它是一个实现了HTTP API的轻量级浏览器,Splash是用Python实现的,同时使用Twisted和QT。Twisted(QT)用来让服务具有异步处理能力,以发挥webkit的并发能力。Splash的特点如下:

  • 并行处理多个网页
  • 得到HTML结果以及(或者)渲染成图片
  • 关掉加载图片或使用 Adblock Plus规则使得渲染速度更快
  • 使用JavaScript处理网页内容
  • 使用Lua脚本
  • 能在Splash-Jupyter Notebooks中开发Splash Lua scripts
  • 能够获得具体的HAR格式的渲染信息

scrapy-splash的安装

  由于Splash的上述特点,使得Splash和Scrapy两者的兼容性较好,抓取效率较高。
  听了上面的介绍,有没有对scrapy-splash很心动呢?下面就介绍如何安装scrapy-splash,步骤如下:
  1. 安装scrapy-splash模块

pip3 install scrapy-splash

  2. scrapy-splash使用的是Splash HTTP API, 所以需要一个splash instance,一般采用docker运行splash,所以需要安装docker。不同系统的安装命令会不同,如笔者的CentOS7系统的安装方式为:

sudo yum install docker

安装完docker后,可以输入命令‘docker -v’来验证docker是否安装成功。

  3. 开启docker服务,拉取splash镜像(pull the image):

sudo service docker start
sudo dock pull scrapinghub/splash

运行结果如下:

pull the image

  4. 开启容器(start the container):

sudo docker run -p 8050:8050 scrapinghub/splash

此时Splash以运行在本地服务器的端口8050(http).在浏览器中输入'localhost:8050', 页面如下:

这里写图片描述

在这个网页中我们能够运行Lua scripts,这对我们在scrapy-splash中使用Lua scripts是非常有帮助的。以上就是我们安装scrapy-splash的全部。

scrapy-splash的实例

  在安装完scrapy-splash之后,不趁机介绍一个实例,实在是说不过去的,我们将在此介绍一个简单的实例,那就是利用百度查询手机号码信息。比如,我们在百度输入框中输入手机号码‘159’,然后查询,得到如下信息:

这里写图片描述

我们将利用scrapy-splash模拟以上操作并获取手机号码信息。

  1. 创建scrapy项目phone
  2. 配置settings.py文件,配置的内容如下:

ROBOTSTXT_OBEY = FalseSPIDER_MIDDLEWARES = {'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
}DOWNLOADER_MIDDLEWARES = {'scrapy_splash.SplashCookiesMiddleware': 723,'scrapy_splash.SplashMiddleware': 725,'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810
}SPLASH_URL = 'http://localhost:8050'DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'

具体的配置说明可以参考:  https://pypi.python.org/pypi/... .

  3. 创建爬虫文件phoneSpider.py, 代码如下:

# -*- coding: utf-8 -*-
from scrapy import Spider, Request
from scrapy_splash import SplashRequest# splash lua script
script = """function main(splash, args)assert(splash:go(args.url))assert(splash:wait(args.wait))js = string.format("document.querySelector('#kw').value=%s;document.querySelector('#su').click()", args.phone)splash:evaljs(js)assert(splash:wait(args.wait))return splash:html()end"""class phoneSpider(Spider):name = 'phone'allowed_domains = ['www.baidu.com']url = 'https://www.baidu.com'# start requestdef start_requests(self):yield SplashRequest(self.url, callback=self.parse, endpoint='execute', args={'lua_source': script, 'phone':'159*******', 'wait': 5})# parse the html content def parse(self, response):info = response.css('div.op_mobilephone_r.c-gap-bottom-small').xpath('span/text()').extract()print('='*40)print(''.join(info))print('='*40)

  4. 运行爬虫,scrapy crawl phone, 结果如下:

这里写图片描述

  实例展示到此结束,欢迎大家访问这个项目的Github地址:  https://github.com/percent4/p... .当然,有什么问题,也可以载下面留言评论哦~~


http://lihuaxi.xjx100.cn/news/274027.html

相关文章

Linux主辅DNS数据不同步故障排除

Linux主辅dns数据不同步故障排除欢迎使用微信关注“云运维联盟”公众号,第一时间了解本博客动态!在互联网中,我们知道任何一台提供应用服务的主机(例如:HTTP、FTP等)都有它一个便于记忆Domain Name&#xf…

中秋将至,联合几个号主送出价值500元的中秋大礼包

转眼又是一年的中秋佳节感谢各位读者一直的陪伴为了感谢大家的陪伴联合了几位优质公众号的号主在中秋佳节之际,给大家送上中秋大礼我们会抽取一名幸运儿送出价值500的故宫坚果礼👇👇👇👇赠送规则本号的读者众多&#x…

“中文版GPT-3”来了!用64张V100训练了3周

晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI今年,OpenAI推出的自然语言模型GPT-3引起了巨大的轰动。这是迄今为止最大的NLP模型,包含1750亿参数,光是训练就调用上万块GPU,花费了460万美元的成本。但GPT-3是基于英语语料库进行训…

java中json重复数据结构_怎么将有JSON中有相同值放在一组?

处理的json是文章的列表,其中有:日期、文章标题、连接、发布时间戳等对象。做android app打算把同一天的文章都在viewpager的一页里,那应该怎么返回相应的数据结构呢?我想过将日期做为key,对应这一天的jsonArray处理好…

人工智能的下一个前沿:识别“零”和“无”

所有参与投票的 CSDN 用户都参加抽奖活动群内公布奖项,还有更多福利赠送作者 | Max Versace译者 | 夕颜出品 | AI科技大本营(ID:rgznai100)声明:本文为客座文章,仅是为作者的观点,不代表 IEEE Spectrum 或 …

MyEclipse10整合Axis2插件

1、下载axis2的eclipse插件 2、把下载好的两个插件包解压后放置myeclipse10安装目录下的dropins文件夹中 3、重启MyEclipse10后 File->New->Other 到此Axis2插件安装完毕。 转载于:https://www.cnblogs.com/dreammyle/p/4036224.html

小伙在某知名公司的Python面试题详解,希望对各位以后面试有帮助

1.到底什么是Python?你可以在回答中与其他技术进行对比 2.什么是PEP8? PEP8是一个编程规范,内容是如何让你的程序更具可读性的建议 其主要内容包括: 代码编排文档编排空格的使用注释文档描述命名规范编码建议等 什么是picklin…

Java集合框架综述,这篇让你吃透!

点击上方“方志朋”,选择“设为星标”回复”666“获取新整理的面试文章作者:平凡希cnblogs.com/xiaoxi/p/6089984.html一、集合框架图简化图:说明:对于以上的框架图有如下几点说明1、所有集合类都位于java.util包下。Java的集合类…