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页面相关推荐

  1. 聊天没有表情包被嘲讽,程序员直接用python爬取了十万张表情包

    聊天没有表情包被嘲讽,程序员直接用python爬取了十万张表情包 前言 分析页面 具体实现 解析页面 获取网页内容 解析网页内容 文件下载 多线程下载 成果 总结 前言 事情要从几天前说起,我有一个朋 ...

  2. java爬虫 京东_java爬虫webmagic 案例爬取动态(ajax+js) 网站京东售价格

    爬取京东手机ID与名称 爬取京东手机ID与价格 组织json 为啥没合并在一起,原因:其中有个组织价格URL的过程 项目采用maven管理 工程pom.xml文件见下一个博文 package org. ...

  3. 为什么阿里巴巴最爱招Java开发程序员?

    为什么阿里巴巴最爱招Java开发程序员?因为java本身设计特性就是大规模工程语言. 它有三个根本性的特征 1.适应各种业务,你目前知道的几乎所有的业务都可以用java写.有很多语言做不到这一点. 2 ...

  4. 从小白程序员一路晋升为大厂高级技术专家我看过哪些书籍?(建议收藏)

    大家好,我是冰河~~ 有句话叫做:投资啥都不如投资自己的回报率高. 从参加工作到现在,短短的几年内,我投资在自己身上的钱已超过三十多万,光买书籍的钱就已超过总投资的三分之一,买了不少于上千本书,有实体 ...

  5. 从小白程序员到大厂高级技术专家我看过哪些书籍?

    大家好,我是冰河~~ 有句话叫做:投资啥都不如投资自己的回报率高. 从参加工作到现在,短短的几年内,我投资在自己身上的钱已超过三十多万,光买书籍的钱就已超过总投资的三分之一,买了不少于上千本书,有实体 ...

  6. 阿里P10毕玄:Java大牛程序员的学习成长路线

    采访作者:云篆,再次编辑:徐雷 在这篇<Java大牛程序员的成长路线>里,阿里基础设施负责人P10毕玄结合自己的经历跟大家讲述了他在各个角色上成长的感受. 在他的职业经历中,从小白到大牛的 ...

  7. Java后端程序员技术栈

    Java后端程序员技术栈 它可以是知识提纲,便于快速复习与查阅 它也可以是你的学习规划,帮助小白快速了解学Java要走的路(当然你也可以选择搭配我的学习路线一起享用!) 相关链接: <gitee ...

  8. Java高级程序员(5年左右)面试的题目集

    Java高级程序员(5年左右)面试的题目集 https://blog.csdn.net/fangqun663775/article/details/73614850?utm_source=blogxg ...

  9. 为什么3年的Java高级程序员薪水仅仅8k-10k,而一个Linux底层C语言程序员两年经验就敢要1...

    为什么80%的码农都做不了架构师?>>>    为什么3年的Java高级程序员薪水仅仅8k-10k,而一个Linux底层C语言程序员两年经验就敢要10k的薪水?   由于目前国内嵌入 ...

最新文章

  1. 熵增学院-Anders-剑走偏锋,了解Spring Boot内部Servlet容器
  2. Data Lake Analytics的Geospatial分析函数
  3. 一文搞定深度优先搜索(DFS)与广度优先搜索(BFS)【含完整源码】
  4. javascript之预编译
  5. label 标签里面元素点击事件
  6. hadoop和kerberos的整合总结
  7. IDEA配置Docker一键部署SpringBoot项目(企业级做法)
  8. 统计图学习-类型介绍
  9. AngularJS学习笔记之directive—scope选项与绑定策略
  10. Struts2学习笔记(十九) 验证码
  11. 1034. 有理数四则运算(20)-PAT乙级真题
  12. JavaScript-面向对象(构造函数,实例成员,静态成员)
  13. SAP HANA Express Edition (HXE)-二进制安装使用步骤
  14. Android8.1 Camera2+HAL3之HIDL open()流程(二十)
  15. 【渝粤题库】陕西师范大学210024 学前儿童科学教育 作业 (专升本)
  16. 小D课堂 - 零基础入门SpringBoot2.X到实战_第9节 SpringBoot2.x整合Redis实战_39、SpringBoot2.x整合redis实战讲解...
  17. Windows安装RabbitMQ集群的几个注意点
  18. cad导出pdf_CAD手机看图软件中dwg格式图纸导出为PDF格式后没有颜色怎么办?
  19. 关于SOME/IP的理解
  20. 圆排列公式推导_【圆面积公式计算】圆形面积计算公式

热门文章

  1. 承认吧,你就是个意志力很差的人
  2. SpringBoot整合Shiro详细用法
  3. 总谐波失真--THD
  4. Matlab计算波形的总谐波失真--THD(附完整代码)
  5. iOS用户行为追踪——无侵入埋点
  6. centos 7升级内核,yum方式升级内核,编译方式升级内核
  7. java集成RSA非对称加密数据传输
  8. 网游点卡接口说明文档
  9. Java fx 变速播放音乐_变速变声播放器(Impulse Media Player)
  10. 服务器维护 藏宝阁交易,梦幻西游藏宝阁角色交易条件,藏宝阁买角色多久可以交易角色...