第8章 scrapy进阶开发(2)
8-4 selenium集成到scrapy中
其实也没什么好说的直接上代码
这是在middlewares.py中定义的一个class:
from selenium.common.exceptions import TimeoutException
from scrapy.http import HtmlResponse #传递js加载后的源代码,不会返回给download
class JSPageMiddleware(object):
#通过chrome请求动态网页
def process_request(self, request, spider):
if spider.name == "JobBole":
try:
spider.browser.get(request.url)
except TimeoutException:
print('30秒timeout之后,直接结束本页面')
spider.browser.execute_script('window.stop()')
import time
time.sleep(3)
print("访问:{0}".format(request.url)) return HtmlResponse(url=spider.browser.current_url, body=spider.browser.page_source, encoding="utf-8", request=request)
'''编码默认是unicode'''
spider中的代码:
name = "JobBole"
allowed_domains = ["jobbole.com"]
start_urls = ['http://blog.jobbole.com/all-posts/'] def __init__(self):
'''chrome放在spider中,防止每打开一个url就跳出一个chrome'''
self.browser=webdriver.Chrome(executable_path='E:/chromedriver.exe')
self.browser.set_page_load_timeout(30)
super(JobboleSpider, self).__init__()
dispatcher.connect(self.spider_close,signals.spider_closed) def spider_close(self,spider):
#当爬虫退出的时候关闭Chrome
print("spider closed")
self.browser.quit()
把selenium集成到scrapy中主要改变的就是这两处地方。
以上的在scrapy中嵌入selenium的chrome并不是异步的,所以效率会变差。
这里都是部分代码,完整代码链接:https://github.com/pujinxiao/jobbole_spider
8-5 其余动态网页获取技术介绍-chrome无界面运行、scrapy-splash、selenium-grid, splinter
1.chrome无界面运行
主要是以下代码(不能在windows上运行):
from pyvirtualdisplay import Display
display = Display(visible=0, size=(800, 600))
display.start() browser = webdriver.Chrome()
browser.get()
2.scrapy-splash
Splash是一个Javascript渲染服务。它是一个实现了HTTP API的轻量级浏览器,Splash是用Python实现的,同时使用Twisted和QT。Twisted(QT)用来让服务具有异步处理能力,以发挥webkit的并发能力。
可以在scrapy中处理ajax来抓取动态的数据,没有chrome那么稳定。
更多介绍 传送门
3.selenium-grid(自行百度查看)
4.splinter
8-6 scrapy的暂停与重启
在命令行:scrapy crawl lagou -s JOBDIR=job_info/001
只要按一次 ctrl+c 就会暂停爬虫,重新启动一样的命令再运行一边。
会生成以下文件:

在requests.queue文件中有以下文件:

如果要保存在不同的文件那就修改不同路径就好了,spider会重新从第一个url开始爬取。
8-7 scrapy url去重原理
相关代码都在dupefilter.py中
其实就是做了一个哈希摘要,放在set中,去查新的url是否在set中。
8-8 scrapy telnet服务
详细的介绍在scrapy文档中都有,传送门。
你可以在cmd中监听spider中的变量。先要在控制面板中打开telnet客户端和服务端,在cmd中输入 telnet localhost 6023 即可。

但是不知道为什么,win10中没有telnet服务端,而且我打开telnet的后不能输入字母(待解决)
8-9 spider middleware 详解
平时也没怎么用到,理解的也不够透彻。scrapy的中文文档中也写的很详细,传送门,大家可以参考。
主要是这么几个文件:

depth.py:爬取深度的设置
httperror.py:状态的设置,比如是不是要把404的也抓取下来,等等。
其他的话自己了解把,需要的时候在深入了解做下笔记。
8-10 scrapy的数据收集 和 8-11 scrapy信号详解
文档说明,数据收集传送门。在工作中没有用到,用到了再细写,这样理解更好。
scrapy信号是非常重要的,之前在selenium中chrome就是用信号量,当spider关闭时,再关闭chrome。信号量详解传送门。
实例就是伯乐在线的例子:
部分代码如下(可以借鉴,其实也包含了8-11信号量的代码):
#收集伯乐在线所有404的url以及404页面数
handle_httpstatus_list = [404] def __init__(self, **kwargs):
self.fail_urls = []
dispatcher.connect(self.handle_spider_closed, signals.spider_closed) def handle_spider_closed(self, spider, reason):
self.crawler.stats.set_value("failed_urls", ",".join(self.fail_urls)) def parse(self, response):
"""
1. 获取文章列表页中的文章url并交给scrapy下载后并进行解析
2. 获取下一页的url并交给scrapy进行下载, 下载完成后交给parse
"""
#解析列表页中的所有文章url并交给scrapy下载后并进行解析
if response.status == 404:
self.fail_urls.append(response.url)
self.crawler.stats.inc_value("failed_url") post_nodes = response.css("#archive .floated-thumb .post-thumb a")
for post_node in post_nodes:
image_url = post_node.css("img::attr(src)").extract_first("")
post_url = post_node.css("::attr(href)").extract_first("")
yield Request(url=parse.urljoin(response.url, post_url), meta={"front_image_url":image_url}, callback=self.parse_detail)
全部代码移步github:https://github.com/pujinxiao/jobbole_spider/blob/master/bole/spiders/JobBole.py
结果: (错误的url也被统计记录下来了)

8-12 scrapy扩展开发
扩展之间看文档,传送门。
作者:今孝
出处:http://www.cnblogs.com/jinxiao-pu/p/6815845.html
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
觉得好就点个推荐吧!
第8章 scrapy进阶开发(2)的更多相关文章
- 第8章 scrapy进阶开发(1)
8-1 selenium动态网页请求与模拟登录知乎 Ⅰ.介绍selenium 1.什么是selenium:selenium百度百科 2.selenium的构架图: 如果要操作浏览器,还需要一个driv ...
- 【odoo14】第十三章、网站开发(对外服务)
本章我们将介绍一些关于odoo web服务方面的基础知识.进阶的内容,将在第十四章介绍. odoo中的web请求是由python的werkzeug库驱动的.odoo为了操作方便,对werkzeug进行 ...
- 【SharePoint学习笔记】第1章 SharePoint Foundation开发基础
SharePoint Foundation开发基础 第1章 SharePoint Foundation开发基础 SharePoint能做什么 企业信息门户 应用程序工具集(文档库.工作空间.工作流.维 ...
- SharePoint 2010 最佳实践学习总结------第1章 SharePoint Foundation开发基础
----前言 这段时间项目出在验收阶段,不是很忙,就潜心把SharePoint学一下,不求有多深刻,初衷只是先入门再说.后续会发布一系列的学习总结.主要学习的书籍为<SharePoint2010 ...
- 第一章 搭建Qt开发环境
第一章 搭建Qt开发环境 1.到http://download.qt-project.org/archive/上下载Qt的源码包.我下载的是qt-everywhere-opensource-src-4 ...
- 编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则)
编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则) 目录 建议1: 不要在常量和变量中出现易混淆的字母 建议2: 莫让常量蜕变成变量 建议3: 三元操作符的类型务 ...
- Android群英传笔记——第二章:Android开发工具新接触
Android群英传笔记--第二章:Android开发工具新接触 其实这一章并没什么可讲的,前面的安装Android studio的我们可以直接跳过,如果有兴趣的,可以去看看Google主推-Andr ...
- 【STM32H7教程】第2章 STM32H7的开发环境搭建
完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第2章 STM32H7的开发环境搭建 本章主要为大 ...
- 第三百九十四节,Django+Xadmin打造上线标准的在线教育平台—Xadmin后台进阶开发配置2,以及目录结构说明
第三百九十四节,Django+Xadmin打造上线标准的在线教育平台—Xadmin后台进阶开发配置2,以及目录结构说明 设置后台列表页面可以直接修改字段内容 在当前APP里的adminx.py文件里的 ...
随机推荐
- NET Core 拓展方法和中间件集合(支持NET Core2.0+)
# Pure.NETCoreExtentensions https://github.com/purestackorg/Pure.NETCoreExtensions NET Core 拓展方法和中间件 ...
- Syncthing源码解析 - 第三方库
1,AudriusButkevicius/cli 网址:https://github.com/AudriusButkevicius/cli 2,bkaradzic/go-lz4 网址:https:// ...
- 2018-2019 20165219 网络对抗 Exp5 MSF基础
实验内容 本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路.具体需要完成: 1.1一个主动攻击实践,如ms08_067; (1分) 1.2 一个针对浏览器的攻击,如ms ...
- “全栈2019”Java第八十九章:接口中能定义内部类吗?
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- Mybatis框架 使用接口Mapper实现数据库的crud操作
Mybatis的Mapper接口方式实现简单crud操作: 1.创建实体类 与数据库对应 我的实体类是<Student> package com.hxzy.mybatis.pojo; ...
- Bootstrap框架常用总结
Bootstrap框架常用标签: 标题标签:<h1>-<h6> bootstrap中也设置的相同的样式 - 若要使用 必须使用空标签来定义 比如<s ...
- powerdesign设计、实现简单的数据库模型
1,新建CDM,打开powerdesign,选择Categories----Infoomation------Conceptual Data.开始画图,如果此时如表示关系的图标是灰色的.Tools-- ...
- DC010的精华分享【首发速看】
世界黑客大会[DC010] 是全球安全圈最神秘.最前沿的黑客大派对 而作为中国首个受DEFCON授权支持成立的 地区性 信息 安全 技术交流平台 DEFCONGROUP 010(DC010) 在国内 ...
- SpringMvc @RequestMapping原理
讲这个之前,我们得先知道在SpringMvc启动时,会加载所有的Bean类,就是加了@Controller,@Component等组件标识的类,然后会把@RequestMapping的方法也加入到一个 ...
- dubbo服务器启动后报错端口被占用
环境:maven工程,ssm框架,tomcat 情景:dubbo的服务注册方服务器启动 问题原因: 经过网络查找,结果是Root WebApplicationContext 启动了两次,第二次报错,d ...