数据之路 - Python爬虫 - PySpider框架

1.PySpider基本功能

  • 提供方便易用的WebUI系统,可视化地编写和调试爬虫。
  • 提供爬取进度监控、 爬取结果查看、爬虫项目管理等功能。
  • 支持多种后端数据库,如MySQL、 MongoDB、 Redis、 SQLite、 Elasticsearch、 PostgreSQL。
  • 支持多种消息队列,如RabbitMQ、 Beanstalk、 Redis、 Kombu。
  • 提供优先级控制、失败重试、定时抓取等功能。
  • 对接了PhantomJS,可以抓取JavaScript渲染的页面。
  • 支持单机和分布式部署,支持Docker部署。

2.PySpider架构

pyspider的架构主要分为Scheduler(调度器)、Fetcher( 抓取器)、Processer(处理器)三个部分,整个爬取过程受到Monitor (监控器)的监控,抓取的结果被Result Worker (结果处理器)处理。

Scheduler发起任务调度,Fetcher负责抓取网页内容,Processer负责解析网页内容,然后将新生成的Request发给Scheduler进行调度,将生成的提取结果输出保存。

  • 每个pyspider 的项目对应一个Pythonj阅本,该脚本中定义了一个Handler 类,它有一个on_start()方法。 爬取首先调用on_start()方法生成最初的抓取任务,然后发送给Scheduler进行调度。
  • Scheduler将抓取任务分发给Fetcher进行抓取,Fetcher执行并得到响应,随后将响应发送给Processer。
  • Processer 处理响应并提取出新的 URL生成新的抓取任务,然后通过消息队列的方式通知Schduler 当前抓取任务执行情况,并将新生成的抓取任务发送给Scheduler。 如果生成了新的提取结果,则将其发送到结果队列等待ResultWorker处理。
  • Scheduler接收到新的抓取任务,然后查询数据库,判断其如果是新的抓取任务或者是需要重试的任务就继续进行调度,然后将其发送回Fetcher进行抓取。
  • 不断重复以上工作,直到所有的任务都执行完毕,抓取结束。
  • 抓取结束后,程序会回调on_finished()方法,这里可以定义后处理过程。

3.PySpider使用

pyspider all,启动pyspider的所有组件,包括PhantomJS、ResultWorker、Processer、Fetcher、 Scheduler、WebUI,这些都是pyspider运行必备的组件。

crawl()方法实现心情求的生成,指定URL、Callback,参数配置如下:

- url:url是爬取时的URL,可以定义为单个URL字符串,也可以定义成URL列表。

- callback:callback是回调函数,指定了该URL对应的响应内容用哪个方法来解析。

def on_start(self):
    self.crawl(‘http://scrapy.org/‘, callback=self.index_page) 

- age:任务的有效时间。 如果某个任务在有效时间内且已经被执行,则它不会重复执行。

def on_start(self):
    self.crawl(‘http://www.example.org/‘, callback=self.callback, age=10*24*60*6o)
===================================================================================
@config(age=10 * 24 * 60 * 60)
def callback(self):
    pass 

- priority:爬取任务的优先级,其值默认是0, priority的数值越大,对应的请求会越优先被调度。

def index_page(self):
  self.crawl(‘http://www.example.org/page.html‘, callback=self.index_page)
  self.crawl(‘http://www.example.org/233.html’, callback=self .detail_page, priority=l) 

- exetime:设置定时任务,其值是时间戳,默认是0,即代表立即执行。

import  time
def on_start(self):
  self.crawl(’http://www.example.org/‘, callback=self.callback, exetime=time.time()+30*60) 

- retries:可以定义重试次数,其值默认是3。

- itag:设置判定网页是存发生变化的节点值,在爬取时会判定次当前节点是否和上次爬取到的节点相同。 如果节点相同,则证明页面没有更新,就不会重复爬取。

def index_page(self,response):
    for item in response.doc(‘.item’).items():
        self.crawl(item.find(‘a‘).attr.url, callback=self.detail_page, itag=item.find(‘.update-time’).text()) 

- auto_recrawl:当开启时,爬取任务在过期后会重新执行,循环时间即定义的age时间长度。

def on_start(self):
    self.craw1(‘http://www.example.org/‘, callback=self.callback, age=5*60*60, auto_recrawl=True) 

- method:HTTP请求方式,它默认是GET。 如果想发起POST请求,可以将method设置为POST。

- params:用于定义GET请求参数。

def on_start(self):
    self.crawl(’http://httpbin.org/get’, callback=self.callback, params={‘a‘:123, ‘b‘:‘c‘})
    self.crawl(‘http://httpbin.org/get?a=123&b=c’, callback=self.callback) 

- data:用于传递POST表单数据。

def on_start(self):
    self.crawl(‘http://httpbin.org/post‘, callback=self.callback, method=‘POST’, data={‘a‘:123, ‘b‘:‘c‘}) 

- files:上传的文件,需要指定文件名。

def on_start(self):
    self.crawl(’http://httpbin.org/post‘, callback=self.callback, method=’POST’, files={field:{filename:‘content‘}})

- user_agent:爬取使用的User-Agent。

- headers:爬取时使用的Headers,即Request Headers。

- cookies:爬取时使用的Cookies,为字典格式。

- connect_timeout:初始化连接时的最长等待时间,它默认是20秒。

- timeout:抓取网页时的最长等待时间,它默认是120秒。

- allow_redirects:确定是否自动处理重定向,它默认是True。

- validate_cert:确定是否验证证书,此选项对HTTPS请求有效,默认是True。

- proxy:爬取时使用的代理,它支持用户名密码的配置。

def on_start(self):
    self.crawl(’http://httpbin.org/get‘, callback=self.callback, proxy=’127.0.0.1:9743‘)
=========================================================================================
class Handler(BaseHandler):
    crawl_config = { ‘proxy‘:  ‘121.0.0.1:9743‘ }

- fetch_type:开启PhantomJS渲染。如果遇到JavaScript渲染的页面,指定此字段即可实现PhantomJS的对接,pyspider将会使用PhantomJS进行网页的抓取。

def on_start(self):
    self.crawl(‘https://www.taobao.com‘, callback=self.index_page, fetch_type=’js‘)

- js_script:页面加载完毕后执行的JavaScript脚本。

def on_start(self):
    self.crawl(‘http://www.example.org/,callback=self.callback, fetch_type=’js’, js_script=‘‘‘
    function() {
        window. scrollTo(0, document.body.scrollHeight);
        return 123;
               }‘‘‘)

- js_run_at:JavaScript脚本运行的位置,是在页面节点开头还是结尾,默认是结尾,即document-end。

- js_viewport_width/js_viewport_height:渲染页面时的窗口大小。

- load_ images:加载JavaScript页面时确定是否加载图片,它默认是否。

- save

def on_start(self):
    self.crawl(’http://www.example.org/‘, callback=self.callback, save={‘page‘: 1})
===================================================================================
def callback(self,  response):
    return response.save[‘page‘] 

- cancel:是取消任务,如果一个任务是ACTIVE状态的,则需要将force_update设置为True。

- force_ update

4.任务区分

在pyspider判断两个任务是否是重复的是使用的是该任务对应的URL的MD5值作为任务的唯一ID,如果D相同,那么两个任务就会判定为相同,其中一个就不会爬取了。很多情况下请求的链接可能是同一个,但是POST的参数不同。

这时可以重写task_id()方法,改变这个ID的计算方式来实现不同任务的区分。

import json
from pyspider.libs.utils import md5string
def get_taskid(self, task):
    return md5string(task[‘url‘]+json.dumps(task[‘fetch‘].get(‘data‘,‘‘))) 

5.全局配置

pyspider可以使用crawl_config来指定全局的配置,配置中的参数会和crawl()方法创建任务时的参数合井。

class Handler(BaseHandler):
    crawl_config = {‘headers‘:{‘User-Agent‘:‘GoogleBot‘}}

6.定时爬取

通过every属性来设置爬取的时间间隔。

@every(minutes=24 * 60)
def on_start(self):
    for url in urllist:
        self.crawl(url, callback=self.index_page) 

7.项目状态

每个项目都有6个状态,分别是TODO、 STOP、 CHECKING、 DEBUG、 RUNNING、 PAUSE。

  • TODO:它是项目刚刚被创建还未实现时的状态。
  • STOP:如果想停止某项目的抓取,可以将项目的状态设置为STOP。
  • CHECKING:正在运行的项目被修改后就会变成CHEC阻NG状态,项目在中途出错需要调整的时候会遇到这种情况。
  • DEBUG/RUNNING:这两个状态对项目的运行没有影响,状态设置为任意一个,项目都可以运行,但是可以用二者来区分项目是否已经测试通过。
  • PAUSE:当爬取过程中出现连续多次错误时,项目会自动设置为PAUSE状态,并等待一定时间后继续爬取。

原文地址:https://www.cnblogs.com/Iceredtea/p/11107890.html

时间: 2024-07-30 23:22:20

数据之路 - Python爬虫 - PySpider框架的相关文章

数据之路 - Python爬虫 - Scrapy框架

一.Scrapy框架入门 1.Scrapy框架介绍 Scrapy是一个基于Twisted的异步处理框架,是纯Python实现的爬虫框架,其架构清晰,榄块之间的榈合程度低,可扩展性极强,可以灵活完成各种需求. Engine:引擎,处理整个系统的数据流处理.触发事务,是整个框架的核心. Item:项目,它定义了爬取结果的数据结构,爬取的数据会被赋值成该Item对象. Scheduler:调度器,接受引擎发过来的请求并将其加入队列中, 在引擎再次请求的时候将请求提供给引擎. Downloader:下载

数据之路 - Python爬虫 - Ajax

一.Ajax数据爬取 1.Ajax介绍 Ajax,全称为Asynchronous JavaScript and XML,即异步的JavaScript和XML. 它不是一门编程语言,而是利用JavaScript在保证页面不被刷新.页面链接不改变的情况下与服务器交换数据并更新部分网页的技术.发送Ajax请求到网页更新过程,简单分为以下3步:发送请求:解析内容:渲染网页.Ajax具有特殊的请求类型,它叫作xhr. 2.Ajax数据爬取 # 首先,定义一个方法来获取每次请求的结果. 在请求时,page是

数据之路 - Python爬虫 - Json模块与JsonPath

一.什么是Json? json简单说就是javascript中的对象和数组,所以这两种结构就是对象和数组两种结构,通过这两种结构可以表示各种复杂的结构. 对象:对象在js中表示为{ }括起来的内容,数据结构为 { key:value, key:value, ... }的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为 对象.key 获取属性值,这个属性值的类型可以是数字.字符串.数组.对象这几种. 数组:数组在js中是中括号[ ]括起来的

数据之路 - Python爬虫 - 正则表达式

一.常用匹配模式 \w 匹配字母数字及下划线 \W 匹配f非字母数字下划线 \s 匹配任意空白字符,等价于[\t\n\r\f] \S 匹配任意非空字符 \d 匹配任意数字 \D 匹配任意非数字 \A 匹配字符串开始 \Z 匹配字符串结束,如果存在换行,只匹配换行前的结束字符串 \z 匹配字符串结束 \G 匹配最后匹配完成的位置 \n 匹配一个换行符 \t 匹配一个制表符 ^ 匹配字符串的开头 $ 匹配字符串的末尾 . 匹配任意字符,除了换行符,re.DOTALL标记被指定时,则可以匹配包括换行符

数据之路 - Python爬虫 - PyQuery库

一.什么是PyQuery? PyQuery库也是一个非常强大又灵活的网页解析库. 官网地址:http://pyquery.readthedocs.io/en/latest/ 二.PyQuery基本库使用 html = ''' <div> <ul> <li class="item-0">first item<lli> <li class="item-1"><a href="link2.html

python爬虫scrapy框架——人工识别登录知乎倒立文字验证码和数字英文验证码(2)

操作环境:python3 在上一文中python爬虫scrapy框架--人工识别登录知乎倒立文字验证码和数字英文验证码(1)我们已经介绍了用Requests库来登录知乎,本文如果看不懂可以先看之前的文章便于理解 本文将介绍如何用scrapy来登录知乎. 不多说,直接上代码: import scrapy import re import json class ZhihuSpider(scrapy.Spider): name = 'zhihu' allowed_domains = ['www.zhi

(转)Python爬虫--通用框架

转自https://blog.csdn.net/m0_37903789/article/details/74935906 前言: 相信不少写过Python爬虫的小伙伴,都应该有和笔者一样的经历吧只要确定了要爬取的目标,就开始疯狂的写代码,写脚本经过一番努力后,爬取到目标数据:但是回过头来,却发现自己所代码复用性小,一旦网页发生了更改,我们也不得不随之更改自己的代码,而却自己的程序过于脚本化,函数化,没有采用OPP的思维方式:没有系统的框架或结构. 指导老师看了笔者的爬虫作品后,便给出了以下三点建

Python爬虫&mdash;&mdash;Scrapy框架安装

在编写python爬虫时,我们用requests和Selenium等库便可完成大多数的需求,但当数据量过大或者对爬取速度有一定要求时,使用框架来编写的优势也就得以体现.在框架帮助下,不仅程序架构会清晰许多,而且爬取效率也会增加,所以爬虫框架是编写爬虫的一种不错的选择. 对于python爬虫框架,目前较为热的是Scrapy,其是一个专门爬取web结构性数据的应用框架.Scrapy是一个强大的框架,所依赖的库也较多,比如有lxml,pyOpenSSL和Twisted等,这些库在不同的平台下要求也不一

Python爬虫Scrapy框架入门(0)

想学习爬虫,又想了解python语言,有个python高手推荐我看看scrapy. scrapy是一个python爬虫框架,据说很灵活,网上介绍该框架的信息很多,此处不再赘述.专心记录我自己遇到的问题以及解决方案吧. 给几个链接吧,我是根据这几个东西来尝试学习的: scrapy中文文档(0.24版,我学习的时候scrapy已经1.1了,也许有些过时): http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/overview.html 大神的博客介绍: