当前位置:   article > 正文

python3 分布式爬虫_python分布式框架爬虫项目_python3 spider

python3 spider

image

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

image

3.3 复杂一点的栗子

问题:“防盗链”

防盗链,服务器会识别 headers 中的 referer 是不是它自己,如果不是,有的服务器不会响应,所以我们还可以在 headers 中加入 referer等信息

反“防盗链”

1、完全模拟浏览器的工作

2、构造cookie信息

3、设置header信息

4、Proxy 代理设置

其它策略

Timeout设置

3.4 动态渲染页面抓取

Splash 是一个 JavaScript 渲染服务,是一个带有 HTTP API 的轻量级浏览器,同时它对接了 Python 中的 Twisted 和 QT 库,利用它我们同样可以实现动态渲染页面的抓取。

异步方式处理多个网页渲染过程

获取渲染后的页面的源代码或截图

通过关闭图片渲染或者使用 Adblock 规则来加快页面渲染速度

可执行特定的 JavaScript 脚本

可通过 Lua 脚本来控制页面渲染过程

获取渲染的详细过程并通过 HAR(HTTP Archive)格式呈现

3.5 爬虫完整流程

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

image

四、爬虫框架

4.1 PySpider简介

一个国人编写的强大的网络爬虫系统并带有强大的WebUI。采用Python语言编写,分布式架构,支持多种数据库后端,强大的WebUI支持脚本编辑器,任务监视器,项目管理器以及结果查看器

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

image

4.2 PySpider特性

1、python 脚本控制,可以用任何你喜欢的html解析包(内置 pyquery)

2、WEB 界面编写调试脚本,起停脚本,监控执行状态,查看活动历史,获取结果产出

3、数据存储支持MySQL, MongoDB, Redis, SQLite, Elasticsearch; PostgreSQL 及 SQLAlchemy

4、队列服务支持RabbitMQ, Beanstalk, Redis 和 Kombu

5、支持抓取 JavaScript 的页面

6、组件可替换,支持单机/分布式部署,支持 Docker 部署

7、强大的调度控制,支持超时重爬及优先级设置

8、支持python2&3

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

image

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

image

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

image

4.3 Scrapy简介

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

image

4.4 Scrapy运行流程

1、调度器(Scheduler)从待下载链接中取出一个链接(URL)

2、调度器启动采集模块Spiders模块

3、采集模块把URL传给下载器(Downloader),下载器把资源下载下来

4、提取目标数据,抽取出目标对象(Item),则交给实体管道(item pipeline)进行进一步的处理;比如存入数据库、文本

5、若是解析出的是链接(URL),则把URL插入到待爬取队列当中

五、scrapy框架

5.1 Scrapy基本使用

创建项目:scrapy startproject tutorial

创建spider:scrapy genspider quotes quotes.toscrapy.com

运行项目:scrapy crawl dmoz

交互调试:scrapy shell quotes.toscrape.com

保存数据(多种格式):scrapy crawl quotes -o quoqes.json

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

image

5.2 scrapy全局指令

startproject:创建项目

genspider:创建爬虫

settings:获取Scrapy的设定

runspider:在未创建项目的情况下,运行一个编写在Python文件中的spider

shell:以给定的URL(如果给出)或者空(没有给出URL)启动Scrapy shell

fetch:使用Scrapy下载器(downloader)下载给定的URL,并将获取到的内容送到标准输出

view:在浏览器中打开给定的URL,并以Scrapy spider获取到的形式展现

Version:输出Scrapy版本

5.3 scrapy项目指令

crawl:使用spider进行爬取

check:检查项目是否有错

list: 列出当前项目中所有可用的spider,每行输出一个spider

edit:仅仅是提供一个快捷方式。开发者可以自由选择其他工具或者IDE来编写调试spiderparse

parse:获取给定的URL并使用相应的spider分析处理

bench:运行benchmark测试

5.4 scrapy选择器

BeautifulSoup 是在程序员间非常流行的网页分析库,它基于HTML代码的结构来构造一个Python对象, 对不良标记的处理也非常合理,但它有一个缺点:慢。

lxml 是一个基于 ElementTree (不是Python标准库的一部分)的python化的XML解析库(也可以解析HTML)。

Scrapy提取数据有自己的一套机制。它们被称作选择器(seletors),因为他们通过特定的 XPath 或者 CSS 表达式来“选择” HTML文件中的某个部分。

XPath 是一门用来在XML文件中选择节点的语言,也可以用在HTML上。

CSS 是一门将HTML文档样式化的语言。选择器由它定义,并与特定的HTML元素的样式相关连。

Scrapy选择器构建于 lxml 库之上,这意味着它们在速度和解析准确性上非常相似。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

image

5.5 spiders

Spider类定义了如何爬取某个(或某些)网站。包括了爬取的动作(例如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取item)。 换句话说,Spider就是您定义爬取的动作及分析某个网页(或者是有些网页)的地方。

以初始的URL初始化Request,并设置回调函数。 当该request下载完毕并返回时,将生成response,并作为参数传给该回调函数。

spider中初始的request是通过调用 startrequests() 来获取的。 startrequests() 读取 start_urls 中的URL, 并以 parse 为回调函数生成 Request 。

在回调函数内分析返回的(网页)内容,返回 Item 对象、dict、 Request 或者一个包括三者的可迭代容器。 返回的Request对象之后会经过Scrapy处理,下载相应的内容,并调用设置的callback函数(函数可相同)。

在回调函数内,您可以使用 选择器(Selectors) (您也可以使用BeautifulSoup, lxml 或者您想用的任何解析器) 来分析网页内容,并根据分析的数据生成item。

最后,由spider返回的item将被存到数据库(由某些 Item Pipeline 处理)或使用 Feed exports 存入到文件中。

属性

name: 定义spider名字的字符串(string)

allowed_domains: 包含了 spider 允许爬取的域名(domain)列表(list)

start_urls: URL列表。当没有制定特定的URL时,spider将从该列表中开始进行爬取

custom_settings: 该设置是一个dict.当启动spider时,该设置将会覆盖项目级的设置. 由于设置必须在初始化(instantiation)前被更新,所以该属性 必须定义为class属性

crawler: 该属性在初始化class后,由类方法 from_crawler() 设置, 并且链接了本spider实例对应的 Crawler 对象

settings: crawler 的配置管理器,扩展(extensions)和中间件(middlewares)使用它用来访问 Scrapy 的配置

logger: self.logger.info(‘日志:%s’, response.status)

方法

from_crawler: 如果存在,则调用此类方法以从 Crawler 创建 pipeline 实例。它必须返回一个新的pipeline实例。 Crawler 对象提供对所有 Scrapy 核心组件(如settings 和 signals)的访问; 它是 pipeline 访问它们并将其功能挂钩到Scrapy中的一种方法

start_requests: 该方法必须返回一个可迭代对象(iterable)。该对象包含了spider用于爬取的第一个Request

make_requests_from_url: 该方法接受一个URL并返回用于爬取的 Request 对象

parse: 当response没有指定回调函数时,该方法是Scrapy处理下载的response的默认方法

log: 使用 scrapy.log.msg() 方法记录(log)message

closed: 当spider关闭时,该函数被调用

5.6 Item Pipeline

当 Item 在 Spider 中被收集之后,它将会被传递到Item Pipeline,一些组件会按照一定的顺序执行对Item的处理。每个item pipeline组件(有时称之为“Item Pipeline”)是实现了简单方法的Python类。他们接收到Item并通过它执行一些行为,同时也决定此Item是否继续通过pipeline,或是被丢弃而不再进行处理。

以下是item pipeline的一些典型应用:

1、清理HTML数据

2、验证爬取的数据(检查item包含某些字段)

3、查重(并丢弃)

4、将爬取结果保存到数据库中

方法

process_item(self, item, spider): 每个item pipeline组件都需要调用该方法,这个方法必须返回一个具有数据的dict,或是 Item (或任何继承类)对象, 或是抛出 DropItem 异常,被丢弃的item将不会被之后的pipeline组件所处理。

open_spider: 当spider被开启时,这个方法被调用。

close_spider: 当spider被关闭时,这个方法被调用

from_crawler: 获取setting 配置信息

例子:数据持久化到mongo

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

image

5.7 Downloader Middleware

下载器中间件是介于 Scrapy 的 request/response 处理的钩子框架。 是用于全局修改Scrapy request 和 response 的一个轻量、底层的系统。

激活

要激活下载器中间件组件,将其加入到DOWNLOADER_MIDDLEWARES 设置中。 该设置是一个字典(dict),键为中间件类的路径,值为其中间件的顺序(order)。

方法

1、process_request(request, spider): 当每个request通过下载中间件时,该方法被调用

2、processresponse(request, response, spider): processrequest() 必须返回以下之一: 返回一个 Response 对象、 返回一个 Request 对象或raise一个 IgnoreRequest 异常。如果其返回一个 Response (可以与传入的response相同,也可以是全新的对象), 该response会被在链中的其他中间件的 process_response() 方法处理。

3、processexception(request, exception, spider): 当下载处理器(download handler)或 processrequest() (下载中间件)抛出异常(包括 IgnoreRequest 异常)时, Scrapy调用 process_exception()

例子:添加代理

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

image

六、scrapy 搭建项目

6.1 爬虫思路

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

image

6.2 实际项目分析

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

image

起始页

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

image

项目结构

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

image

七、分布式爬虫

7.1 单主机爬虫架构

本机维护一个爬虫队列,scheduler 进行调度

Q:多台主机协作的关键是什么?

A:共享爬虫队列

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

image

单主机爬虫架构

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

image

7.2 分布式爬虫架构

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

image

分布式爬虫架构

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

image

7.3 问题

Q1:队列怎么选?

A1: Redis队列

Redis 非关系型数据库,key-value形式存储,结构灵活

是内存中的数据结构存储系统,处理速度快,性能好

提供队列、集合等多种存储结构,方便队列维护

现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。

分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里无偿获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
、集合等多种存储结构,方便队列维护

现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。

分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里无偿获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/1011745
推荐阅读
相关标签
  

闽ICP备14008679号