scrapy-splash java,小白程序员-运用Scrapy-splash爬取动态js页面
Scapy框架相关的内容,这里不在搬砖,官方给出的中文文档,已经足够详尽清晰。
Scrapy框架上手非常简单,跟着教程一步步走就可以了,爬取一些静态资源是毫无问题的,但现如今,大部分网站为了封禁爬虫,都会采取一些防爬策略,最典型的是通过ajax动态渲染界面,以爬取图片为例,网页用js加载图片使得scrapy.request url时获得的response中不暴露图片url,而是一大段js函数,为解决这个问题,可以结合使用Python scrapy-splash拓展包。
1. 爬取动态页面环境准备
1.1 安装scrapy-splash,终端直接运行
pip install scrapy-splash
1.2. 安装scrapy-splash服务
docker pull scrapinghub/splash
1.3. 启动一个splash服务容器,运行:
docker run -p 8050:8050 scrapinghub/splash
如有疑问,可直接参考scrapy-splash项目地址https://github.com/scrapy-plugins/scrapy-splash
1.4.splash服务有啥用呢? 尝试用浏览器访问http://localhost:8050 可以看到如下界面:
试着在右边输入框输入任意一个ajax动态网页,点击render me! 稍等片刻后,便会看到页面返回了splash渲染后的结果。
2. 配置你的scrapy项目
2.1 在项目settings.py里面添加如下配置:
SPLASH_URL = 'http://localhost:8050'
DOWNLOADER_MIDDLEWARES = {
'scrapy_splash.SplashCookiesMiddleware': 723,
'scrapy_splash.SplashMiddleware':725,
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}
SPIDER_MIDDLEWARES = { 'scrapy_splash.SplashDeduplicateArgsMiddleware': 100, }
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
2.2 在项目爬虫文件中修改scrapy.Request为SplashRequest,这样Scrapy engine访问Url时SplashRequest直接把请求发给sracpy-splash服务端,sracpy-splash服务端成功访问url后将渲染后的结果返回给scrapy-engine,代码如下:
script = """
function main(splash, args)
assert(splash:go(args.url))
assert(splash:wait(args.wait))
return { html = splash:html(),}
end
"""
classExampleSpider(scrapy.Spider):
defstart_requests(self):
for url in self.start_urls:
yield SplashRequest(url=url, callback=self.parse, endpoint='execute',args={'lua_source': script, 'wait': 0.5})
defparse(self, response):
pass
注意这里的request是通过执行lua脚本转发的,当然你也可以通过手动在要访问的url外面封装一层,让splash服务直接访问封装后的url。
2.2 接下来的就是爬虫具体的业务了,例如你如果想爬取某个网站并将网站上的图片保存到本地,
首先需要在项目items.py文件中新建imagepipeline,如:
import scrapyfrom scrapy.exceptions
import DropItemfrom scrapy.pipelines.images
import ImagesPipelineclass
MyImagesPipeline(ImagesPipeline):
defget_media_requests(self, item, info):
for image_url in item['image_urls']:
# 注意这里一定要用 scrapy.Request访问图片url,不能用SplashRequest访问url,
# 因为scrapy框架引擎本身不能解析SplashResponse,需要重写部分方法。
yield scrapy.Request(image_url)
defitem_completed(self, results, item, info):
image_paths = [x['path'] for ok, x in results if ok]
ifnot image_paths:
raise DropItem("Item contains no images")
item['image_paths'] = image_paths
return item
同样在项目settings.py里面配置下载中间件相关的配置:
ITEM_PIPELINES = {'你的项目名称.pipelines.MyImagesPipeline': 300}
IMAGES_STORE = '你项目保存图片的目录/'IMAGES_EXPIRES = 90
你的爬虫里面也需要重写parse函数,及时yield出imageItem给下载中间件,自动下载图片,代码如下:
defparse(self, response):
list_imgs = response.xpath('//div[@class="text"]/p/img/@src').extract()
# xpath需要修改成目标网站中你想提取的内容,如图片url等
iflist_imgs:
item = ImageItem()
item['image_urls'] = list_imgs
yield item
OK, 完成以上工作,就可以运行你的爬虫了,尽情的爬取网站中的各种小姐姐吧(手动偷笑)!
scrapy-splash java,小白程序员-运用Scrapy-splash爬取动态js页面相关推荐
- 聊天没有表情包被嘲讽,程序员直接用python爬取了十万张表情包
聊天没有表情包被嘲讽,程序员直接用python爬取了十万张表情包 前言 分析页面 具体实现 解析页面 获取网页内容 解析网页内容 文件下载 多线程下载 成果 总结 前言 事情要从几天前说起,我有一个朋 ...
- java爬虫 京东_java爬虫webmagic 案例爬取动态(ajax+js) 网站京东售价格
爬取京东手机ID与名称 爬取京东手机ID与价格 组织json 为啥没合并在一起,原因:其中有个组织价格URL的过程 项目采用maven管理 工程pom.xml文件见下一个博文 package org. ...
- 为什么阿里巴巴最爱招Java开发程序员?
为什么阿里巴巴最爱招Java开发程序员?因为java本身设计特性就是大规模工程语言. 它有三个根本性的特征 1.适应各种业务,你目前知道的几乎所有的业务都可以用java写.有很多语言做不到这一点. 2 ...
- 从小白程序员一路晋升为大厂高级技术专家我看过哪些书籍?(建议收藏)
大家好,我是冰河~~ 有句话叫做:投资啥都不如投资自己的回报率高. 从参加工作到现在,短短的几年内,我投资在自己身上的钱已超过三十多万,光买书籍的钱就已超过总投资的三分之一,买了不少于上千本书,有实体 ...
- 从小白程序员到大厂高级技术专家我看过哪些书籍?
大家好,我是冰河~~ 有句话叫做:投资啥都不如投资自己的回报率高. 从参加工作到现在,短短的几年内,我投资在自己身上的钱已超过三十多万,光买书籍的钱就已超过总投资的三分之一,买了不少于上千本书,有实体 ...
- 阿里P10毕玄:Java大牛程序员的学习成长路线
采访作者:云篆,再次编辑:徐雷 在这篇<Java大牛程序员的成长路线>里,阿里基础设施负责人P10毕玄结合自己的经历跟大家讲述了他在各个角色上成长的感受. 在他的职业经历中,从小白到大牛的 ...
- Java后端程序员技术栈
Java后端程序员技术栈 它可以是知识提纲,便于快速复习与查阅 它也可以是你的学习规划,帮助小白快速了解学Java要走的路(当然你也可以选择搭配我的学习路线一起享用!) 相关链接: <gitee ...
- Java高级程序员(5年左右)面试的题目集
Java高级程序员(5年左右)面试的题目集 https://blog.csdn.net/fangqun663775/article/details/73614850?utm_source=blogxg ...
- 为什么3年的Java高级程序员薪水仅仅8k-10k,而一个Linux底层C语言程序员两年经验就敢要1...
为什么80%的码农都做不了架构师?>>> 为什么3年的Java高级程序员薪水仅仅8k-10k,而一个Linux底层C语言程序员两年经验就敢要10k的薪水? 由于目前国内嵌入 ...
最新文章
- 熵增学院-Anders-剑走偏锋,了解Spring Boot内部Servlet容器
- Data Lake Analytics的Geospatial分析函数
- 一文搞定深度优先搜索(DFS)与广度优先搜索(BFS)【含完整源码】
- javascript之预编译
- label 标签里面元素点击事件
- hadoop和kerberos的整合总结
- IDEA配置Docker一键部署SpringBoot项目(企业级做法)
- 统计图学习-类型介绍
- AngularJS学习笔记之directive—scope选项与绑定策略
- Struts2学习笔记(十九) 验证码
- 1034. 有理数四则运算(20)-PAT乙级真题
- JavaScript-面向对象(构造函数,实例成员,静态成员)
- SAP HANA Express Edition (HXE)-二进制安装使用步骤
- Android8.1 Camera2+HAL3之HIDL open()流程(二十)
- 【渝粤题库】陕西师范大学210024 学前儿童科学教育 作业 (专升本)
- 小D课堂 - 零基础入门SpringBoot2.X到实战_第9节 SpringBoot2.x整合Redis实战_39、SpringBoot2.x整合redis实战讲解...
- Windows安装RabbitMQ集群的几个注意点
- cad导出pdf_CAD手机看图软件中dwg格式图纸导出为PDF格式后没有颜色怎么办?
- 关于SOME/IP的理解
- 圆排列公式推导_【圆面积公式计算】圆形面积计算公式