Python3 爬虫学习笔记 C18【爬虫框架 pyspider — 深入理解】


Python3 爬虫学习笔记第十八章 —— 【爬虫框架 pyspider — 深入理解】

文章目录

  • 【18.1】启动参数
  • 【18.2】运行单个组件
    • 【18.2.1】运行 Scheduler
    • 【18.2.2】运行 Fetcher
    • 【18.2.3】运行 Processer
    • 【18.2.4】运行 WebUI
  • 【18.3】crawl() 方法各参数
  • 【18.4】任务区分
  • 【18.5】全局配置
  • 【18.6】定时爬取


【18.1】启动参数

常用启动命令:pyspider all,完整命令结构为:pyspider [OPTIONS] COMMAND [ARGS],OPTIONS 为可选参数,包含以下参数:

  • -c, --config FILENAME:指定配置文件名称
  • –logging-config TEXT:日志配置文件名称,默认: pyspider/pyspider/logging.conf
  • –debug:开启调试模式
  • –queue-maxsize INTEGER:队列的最大长度
  • –taskdb TEXT:taskdb 的数据库连接字符串,默认: sqlite
  • –projectdb TEXT:projectdb 的数据库连接字符串,默认: sqlite
  • –resultdb TEXT:resultdb 的数据库连接字符串,默认: sqlite
  • –message-queue TEXT:消息队列连接字符串,默认: multiprocessing.Queue
  • –phantomjs-proxy TEXT:PhantomJS 使用的代理,ip:port 的形式
  • –data-path TEXT:数据库存放的路径
  • –add-sys-path / --not-add-sys-path:将当前工作目录添加到python lib搜索路径
  • –version:显示 pyspider 的版本信息
  • –help:显示帮助信息

配置文件为一个 JSON 文件,一般为 config.json 文件,常用配置如下:

{"taskdb": "mysql+taskdb://username:password@host:port/taskdb","projectdb": "mysql+projectdb://username:password@host:port/projectdb","resultdb": "mysql+resultdb://username:password@host:port/resultdb","message_queue": "amqp://username:password@host:port/%2F","webui": {"port": 5000,"username": "some_name","password": "some_passwd","need-auth": true}
}

可以设置对应的用户名,密码,端口等信息,使用命令 pyspider -c config.json all 即可运行


【18.2】运行单个组件

pyspider 的架构主要分为 Scheduler(调度器)、Fetcher(抓取器)、Processer(处理器)三个部分,都可以单独运行,基本命令: pyspider [component_name] [options]


【18.2.1】运行 Scheduler

pyspider scheduler [OPTIONS]
Options:--xmlrpc /--no-xmlrpc--xmlrpc-host TEXT--xmlrpc-port INTEGER--inqueue-limit INTEGER  任务队列的最大长度,如果满了则新的任务会被忽略--delete-time INTEGER    设置为 delete 标记之前的删除时间--active-tasks INTEGER   当前活跃任务数量配置--loop-limit INTEGER     单轮最多调度的任务数量--fail-pause-num INTEGER 上次失败时自动暂停项目暂停次数,任务失败,将0设置为禁用--scheduler-cls TEXT     Scheduler 使用的类--threads TEXT           ThreadBaseScheduler 的线程号,默认值:4--help                   显示帮助信息

【18.2.2】运行 Fetcher

pyspider fetcher [OPTIONS]
Options:--xmlrpc /--no-xmlrpc--xmlrpc-host TEXT--xmlrpc-port INTEGER--poolsize INTEGER         同时请求的个数--proxy TEXT               使用的代理--user-agent TEXT          使用的 User-Agent--timeout TEXT             超时时间--phantomjs-endpoint TEXT  phantomjs 的端点,通过 pyspider 启动 phantomjs--splash-endpoint TEXT     执行 splash 的端点:http://splash.readthedocs.io/en/stable/api.html execut--fetcher-cls TEXT         Fetcher 使用的类--help                     显示帮助信息

【18.2.3】运行 Processer

pyspider processor [OPTIONS]
Options:--processor-cls TEXT  Processor 使用的类--process-time-limit INTEGER    脚本处理时间限制--help                          显示帮助信息

【18.2.4】运行 WebUI

pyspider webui [OPTIONS]
Options:--host TEXT                   运行地址--port INTEGER                运行端口--cdn TEXT                    JS 和 CSS 的 CDN 服务器--scheduler-rpc TEXT          Scheduler 的 xmlrpc 路径--fetcher-rpc TEXT            Fetcher 的 xmlrpc 路径--max-rate FLOAT              每个项目最大的 rate 值--max-burst FLOAT             每个项目最大的 burst 值--username TEXT               Auth 验证的用户名--password TEXT               Auth 验证的密码--need-auth                   是否需要验证--webui-instance TEXT         运行时使用的 Flask 应用--process-time-limit INTEGER  调试中的脚本处理时间限制--help                        显示帮助信息

【18.3】crawl() 方法各参数

参数文档:http://docs.pyspider.org/en/latest/apis/self.crawl/


  • url:爬取目标 URL,可以定义为单个 URL 字符串,也可以定义成 URL 列表

  • callback:回调函数,指定了该 URL 对应的响应内容用哪个方法来解析,示例:
    def on_start(self):self.crawl('http://www.itrhx.com/', callback=self.index_page)
    
    代码解释:指定 callbackindex_page,代表爬取 http://www.itrhx.com/ 得到的响应会用 index_page() 方法来解析,而 index_page() 方法的第一个参数就是响应对象,如下所示:
    def index_page(self, response):pass
    

  • age:任务的有效时间,如果某个任务在有效时间内且已经被执行,则它不会重复执行,有如下两种设置方法:

    def on_start(self):self.crawl('http://www.itrhx.com/', callback=self.callback, age=10*24*60*60)
    
    @config(age=10 * 24 * 60 * 60)
    def callback(self):pass
    

  • priority:爬取任务的优先级,其值默认是 0,priority 的数值越大,对应的请求会越优先被调度,如下所示,2.html 页面将会优先爬取:
    def index_page(self):self.crawl('http://www.itrhx.com/1.html', callback=self.index_page)self.crawl('http://www.itrhx.com/2.html', callback=self.detail_page, priority=1)
    

  • exetime:设置定时任务,其值是时间戳,默认是 0,即代表立即执行,如下所示表示该任务会在 30 分钟之后执行:
    import time
    def on_start(self):self.crawl('http://www.itrhx.com/', 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())
    
    代码解释:设置 update-time 这个节点的值为 itag,在下次爬取时就会首先检测这个值有没有发生变化,如果没有变化,则不再重复爬取,否则执行爬取

  • auto_recrawl:开启时,爬取任务在过期后会重新执行,循环时间即定义的 age 时间长度,如下所示:
    def on_start(self):self.crawl('http://www.itrhx.com/', callback=self.callback, age=5*60*60, auto_recrawl=True)
    
    代码解释:定义 age 有效期为 5 小时,设置了 auto_recrawlTrue,这样任务就会每 5 小时执行一次

  • 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 表单数据,当请求方式为 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:爬取时使用的代理,支持用户名密码的配置,格式为 username:password@hostname:port,如下所示:
    def on_start(self):self.crawl('http://httpbin.org/get', callback=self.callback, proxy='127.0.0.1:9743')
    
    也可以设置 craw_config 来实现全局配置,如下所示:
    class Handler(BaseHandler):crawl_config = {'proxy': '127.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 脚本,如下所示,页面加载成功后将执行页面混动的 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:JavaScript 渲染页面时的窗口大小

  • 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:即使任务处于 ACTIVE 状态,那也会强制更新状态

【18.4】任务区分

pyspider 判断两个任务是否是重复的是使用的是该任务对应的 URL 的 MD5 值作为任务的唯一 ID,如果 ID 相同,那么两个任务就会判定为相同,其中一个就不会爬取了

某些情况下,请求的链接是同一个,但是 POST 的参数不同,这时可以重写 task_id() 方法,利用 URL 和 POST 的参数来生成 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', '')))

【18.5】全局配置

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

class Handler(BaseHandler):crawl_config = {'headers': {'User-Agent': 'GoogleBot',}'proxy': '127.0.0.1:9743'}

【18.6】定时爬取

通过 every 属性来设置爬取的时间间隔,如下代码表示每天执行一次爬取:

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

注意事项:如果设置了任务的有效时间(age 参数),因为在有效时间内爬取不会重复,所以要把有效时间设置得比重复时间更短,这样才可以实现定时爬取

错误举例:设定任务的过期时间为 5 天,而自动爬取的时间间隔为 1 天,当第二次尝试重新爬取的时候,pyspider 会监测到此任务尚未过期,便不会执行爬取:

@every(minutes=24 * 60)
def on_start(self):self.crawl('http://www.itrhx.com/', callback=self.index_page)@config(age=5 * 24 * 60 * 60)
def index_page(self):pass

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/437907.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sharepoint学习笔记—ECM系列—1 Content Type Syndication

我们可以通过Content Type Syndication来实现在Sharepoint Farm内的不同Site Collection之间共享内容类型(Content Types).也就是说,管理员可以为某个元数据服务(Metadata Service)指定一个网站集(Site Collection)来充当Content Type Hub,Content Type …

Python3 爬虫实战 — 猫眼电影TOP100【requests、lxml、Xpath、CSV 】

爬取时间:2019-09-23爬取难度:★☆☆☆☆☆请求链接:https://maoyan.com/board/4爬取目标:猫眼电影 TOP100 的电影名称、排名、主演、上映时间、评分、封面图地址,数据保存为 CSV 文件涉及知识:请求库 requ…

Sharepoint学习笔记—ECM系列--2 管理元数据服务应用Metadata Service Application

这里简单介绍一下Sharepoint2010的元数据服务应用Metadata Service Application的创建,修改和删除,在进行此类操作前,你必须是Sharepoint管理中心管理组的成员,即你有权限进入Sharepoint管理中心进行操作。 一、Metadata Service…

Python3 爬虫实战 — 豆瓣电影TOP250【requests、Xpath、正则表达式、CSV、二进制数据储存】

爬取时间:2019-09-27爬取难度:★★☆☆☆☆请求链接:https://movie.douban.com/top250 以及每部电影详情页爬取目标:爬取榜单上每一部电影详情页的数据,保存为 CSV 文件;下载所有电影海报到本地涉及知识&am…

Sharepoint学习笔记—ECM系列--3 从.CSV文件导入术语集(Term Sets)

Sharepoint2010支持直接从CSV文件导入术语集(Term Sets),也就是说你可以先直接在Excel中创建和编辑术语集,然后保存为.CSV文件,再通过Sharepoint2010管理中心提供的管理界面导入术语集到指定的Metadata Service下的指定组中,下面我们来看看如…

使用 hexo-git-backup 插件备份你的 Hexo 博客

2022-01-25 更新:博客新地址:https://www.itbob.cn/,文章距上次编辑时间较远,部分内容可能已经过时! 欢迎关注我的专栏:《个人博客搭建:HexoGithub Pages》,从搭建到美化一条龙&…

Sharepoint学习笔记—ECM系列--4 根据位置设置的默认元数据值(Location-Based Metadata Defaults)

如果有这样一个需求:客户在一个SharePoint 2010的站点的document library中创建了不同的文件夹FolderA和FolderB,对于上传到此文件夹的文件记录中有某一个列ColumnM,现在他实现当上传文件到不同的文件夹FolderA或FolderB时,列ColumnM使用不同…

Python3 爬虫实战 — 安居客武汉二手房【requests、Beautiful Soup、CSV】

爬取时间:2019-10-09爬取难度:★★☆☆☆☆请求链接:https://wuhan.anjuke.com/sale/爬取目标:爬取武汉二手房每一条售房信息,包含地理位置、价格、面积等,保存为 CSV 文件涉及知识:请求库 requ…

Sharepoint 修改密码

sharepoint安装在服务器上,比如windows 2008 R2(64), 但是在公司里面经常需要修改电脑的密码,电脑的密码一旦改变则相应的sharepoint服务器场密码也需改变,本文介绍修改sharepoint密码的简单方法,不用在命令行输入命令。 step1:打…

Python3 爬虫实战 — 虎扑论坛步行街【requests、Beautiful Soup、MongoDB】

爬取时间:2019-10-12爬取难度:★★☆☆☆☆请求链接:https://bbs.hupu.com/bxj爬取目标:爬取虎扑论坛步行街的帖子,包含主题,作者,发布时间等,数据保存到 MongoDB 数据库涉及知识&am…

Sharepoint页面里添加.net托管代码

Sharepoint页面里添加.net托管代码 在做Sharepoint门户网站定制时候,可以利用VS集成开发工具编写自定义功能的WebPart或利用VS在可视化环境下开发UserControl然后利用QuickPart用户控件包装器来将UserControl包装为WebPart,以这种方式来对Sharepoint门户…

Python3 爬虫实战 — 模拟登陆哔哩哔哩【滑动验证码对抗】

登陆时间:2019-10-21实现难度:★★★☆☆☆请求链接:https://passport.bilibili.com/login实现目标:模拟登陆哔哩哔哩,攻克滑动验证码涉及知识:滑动验证码的攻克、自动化测试工具 Selenium 的使用完整代码&…

SharePoint 编程指南(转)

网站相关的对象模型 作为一个应用原型系统,SharePoint提供了很多强大的应用及管理功能,但是,在实际的应用中,这些原有的功能很难满足用户的需求。因此,SharePoint也提供了一套非常完整的对象模型作为底层接口&#xf…

Python3 爬虫实战 — 模拟登陆12306【点触验证码对抗】

登陆时间:2019-10-21实现难度:★★★☆☆☆请求链接:https://kyfw.12306.cn/otn/resources/login.html实现目标:模拟登陆中国铁路12306,攻克点触验证码涉及知识:点触验证码的攻克、自动化测试工具 Selenium…

SharePoint无代码工作流设计开发实例——交通费报销流程(一)

开发环境: (1)SharePoint Designer 2010 (2)SharePoint Online(Office 365) 关于Office 365和SharePoint Online的相关信息请参见以下链接 http://blog.csdn.net/miragesky2049/article/details/7242982 1、需求分析 组织结构: 用户类型&#xff1a…

Python3 爬虫实战 — 58同城武汉出租房【加密字体对抗】

爬取时间:2019-10-21爬取难度:★★★☆☆☆请求链接:https://wh.58.com/chuzu/爬取目标:58同城武汉出租房的所有信息涉及知识:网站加密字体的攻克、请求库 requests、解析库 Beautiful Soup、数据库 MySQL 的操作完整代…

SharePoint无代码工作流设计开发实例——交通费报销流程(二)

3、InfoPath表单的设计及发布 (1)数据源和页面设计 域(元素)和域(属性)如下: 白色为域(元素),该类型的字段,发布时,提升成字段后,列表库的数据是…

【Python CheckiO 题解】All the Same

CheckiO 是面向初学者和高级程序员的编码游戏,使用 Python 和 JavaScript 解决棘手的挑战和有趣的任务,从而提高你的编码技能,本博客主要记录自己用 Python 在闯关时的做题思路和实现代码,同时也学习学习其他大神写的代码。 Chec…

SharePoint学习札记[6] — WebPart之基础

Asp.net中的Web Part与MOSS中的Web Part有什么区别?WebPart怎么开发怎么部署? MOSS2007基础:Windows SharePoint Services 3.0中的Web Part [Sunmoonfire撰写] MOSS2007基础:开发自定义WebPart [Sunmoonfire撰写] MOSS2007基础…

【Python CheckiO 题解】House Password

CheckiO 是面向初学者和高级程序员的编码游戏,使用 Python 和 JavaScript 解决棘手的挑战和有趣的任务,从而提高你的编码技能,本博客主要记录自己用 Python 在闯关时的做题思路和实现代码,同时也学习学习其他大神写的代码。 Chec…