Python爬虫框架之Scrapy中Spider的用法


Posted in Python onJune 28, 2021

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

对spider来说,爬取的循环类似下文:

1.以初始的URL初始化Request,并设置回调函数。当该request下载完毕并返回时,将生成response,并作为参数传给该回调函数。spider中初始的request是通过调用start_requests()来获取的。start_requests()读取start_urls中的URL,并以parse为回调函数生成Request。

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

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

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

虽然该循环对任何类型的spider都(多少)适用,但Scrapy仍然为了不同的需求提供了多种默认spider。之后将讨论这些spider。

Spider

scrapy.spider.Spider是最简单的spider。每个其他的spider必须继承自该类(包括Scrapy自带的其他spider以及您自己编写的spider)。其仅仅请求给定的start_urls / start_requests,并根据返回的结果(resulting responses)调用spider的 parse方法。

name

定义spider名字的字符串(string)。spider的名字定义了Scrapy如何定位(并初始化) spider,所以其必须是唯一的。不过您可以生成多个相同的spider实例(instance),这没有任何限制。name是spider最重要的属性,而且是必须的。

如果该spider爬取单个网站(single domain),一个常见的做法是以该网站(domain)(加或不加后缀)来命名spider。例如,如果spider爬取 mywebsite.com,该spider通常会被命名为mywebsite。

allowed_domains

可选。包含了spider允许爬取的域名(domain)列表(list)。当OffsiteMiddleware启用时,域名不在列表中的URL不会被跟进。

start_urls

URL列表。当没有制定特定的URL时,spider将从该列表中开始进行爬取。因此,第一个被获取到的页面的URL将是该列表之一。后续的URL将会从获取到的数据中提取。

start_requests()

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

当spider启动爬取并且未制定URL时,该方法被调用。当指定了URL时,make_requests_from_url()将被调用来创建Request对象。该方法仅仅会被Scrapy调用一次,因此您可以将其实现为生成器。

该方法的默认实现是使用start_urls的url生成Request。

如果您想要修改最初爬取某个网站的Request对象,您可以重写(override)该方法。例如,如果您需要在启动时以POST登录某个网站,你可以这么写:

def start_requests(self) :
    return [scrapy.FormRequest("http : / /ww. example.com/login",
        formdata={ 'user' : 'john', ' pass ' : 'secret'},
        ca77back=se1f.1ogged_in)]
 
def logged_in(self,response) :
## here you would extract links to follow and return Requests for
## each of them,with another ca77back
pass

parse

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

parse负责处理response并返回处理的数据以及(/或)跟进的URL。Spider对其他的Request的回调函数也有相同的要求。

该方法及其他的Request回调函数必须返回一个包含Request 及(或) ltem的可迭代的对象。

参数: response-用于分析的response

启动方式

start_urls

start_urls是一个列表

start_requests

使用start_requests()重写start_ur1s,要使用Request()方法自己发送请求:

def start_requests(se7f):
    """重写start_urls 规则"""
    yield scrapy.Request(ur1='http://quotes.toscrape.com/page/1/'cal1back=self.parse)

scrapy.Request

scrapy.Request是一个请求对象,创建时必须制定回调函数。

数据保存

可以使用-o将数据保存为常见的格式(根据后缀名保存)
支持的格式有下面几种:

  • json
  • jsonlines
  • jl
  • csv
  • xml
  • marshal
  • pickle

使用方式:

scrapy crawl quotes2 -o a.json

案例: Spider样例

##一*- coding: utf-8 -*-
 
import scrapy
 
clTass Quotes2spider(scrapy.spider):
    name = 'quotes2'
    a7lowed_domains = [ 'toscrape.com ' ]
    start_urls = [ ' http: //quotes.toscrape.com/ page/2/ ']
 
    def parse(self,response):
        quotes = response.css('.quote ' )
        for quote in quotes:
            text = quote.css( '.text: : text ' ).extract_first()
            auth = quote.css( '.author : :text ').extract_first()
            tages = quote.css('.tags a: :text' ).extract()
            yield dict(text=text , auth=auth, tages=tages)

到此这篇关于Python爬虫框架之Scrapy中Spider的用法的文章就介绍到这了,更多相关Spider的用法内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python的三目运算符和not in运算符使用示例
Mar 03 Python
python实现定时自动备份文件到其他主机的实例代码
Feb 23 Python
python爬虫框架scrapy实现模拟登录操作示例
Aug 02 Python
python 发送和接收ActiveMQ消息的实例
Jan 30 Python
Python获取网段内ping通IP的方法
Jan 31 Python
通过Python编写一个简单登录功能过程解析
Sep 04 Python
如何安装2019Pycharm最新版本(详细教程)
Sep 26 Python
python GUI库图形界面开发之PyQt5复选框控件QCheckBox详细使用方法与实例
Feb 28 Python
Window版下在Jupyter中编写TensorFlow的环境搭建
Apr 10 Python
Python通过文本和图片生成词云图
May 21 Python
Python通过kerberos安全认证操作kafka方式
Jun 06 Python
python爬取代理ip的示例
Dec 18 Python
简单谈谈Python面向对象的相关知识
Jun 28 #Python
Python利用机器学习算法实现垃圾邮件的识别
浅谈Python中的正则表达式
Jun 28 #Python
python中subplot大小的设置步骤
手把手教你实现PyTorch的MNIST数据集
PyMongo 查询数据的实现
Jun 28 #Python
浅谈哪个Python库才最适合做数据可视化
You might like
解析php中如何调用用户自定义函数
2013/08/06 PHP
CodeIgniter上传图片成功的全部过程分享
2013/08/12 PHP
Yii框架 session 数据库存储操作方法示例
2019/11/18 PHP
基于thinkphp5框架实现微信小程序支付 退款 订单查询 退款查询操作
2020/08/17 PHP
用javascript实现无刷新更新数据的详细步骤 asp
2006/12/26 Javascript
javascript options属性集合操作代码
2009/12/28 Javascript
firefox firebug中文入门教程 脚本之家新年特别版
2010/01/02 Javascript
js 在定义的时候立即执行的函数表达式(function)写法
2013/01/16 Javascript
基于jquery扩展漂亮的CheckBox(自己编写)
2013/11/19 Javascript
用js控制组织结构图可以任意拖拽到指定位置
2014/01/17 Javascript
jQuery获得IE版本不准确webbrowser的解决方法
2014/02/23 Javascript
JSP中使用JavaScript动态插入删除输入框实现代码
2014/06/13 Javascript
js实现简单的左右两边固定广告效果实例
2015/04/10 Javascript
详解JavaScript中setSeconds()方法的使用
2015/06/11 Javascript
JavaScript中SetInterval与setTimeout的用法详解
2015/11/10 Javascript
JS DOM实现鼠标滑动图片效果
2020/09/17 Javascript
jquery控制页面的展开和隐藏实现方法(推荐)
2016/10/15 Javascript
jsTree事件和交互以及插件plugins详解
2017/08/29 Javascript
Vue中props的使用详解
2018/06/15 Javascript
基于Vue实现的多条件筛选功能的详解(类似京东和淘宝功能)
2019/05/07 Javascript
[03:11]不朽宝藏三外观展示
2020/09/18 DOTA
Python对文件和目录进行操作的方法(file对象/os/os.path/shutil 模块)
2017/05/08 Python
Python错误处理操作示例
2018/07/18 Python
对python中基于tcp协议的通信(数据传输)实例讲解
2019/07/22 Python
pycharm不能运行.py文件的解决方法
2020/02/12 Python
Django跨域资源共享问题(推荐)
2020/03/09 Python
python eventlet绿化和patch原理
2020/11/21 Python
python获取天气接口给指定微信好友发天气预报
2020/12/28 Python
python使用Windows的wmic命令监控文件运行状况,如有异常发送邮件报警
2021/01/30 Python
中学生校园广播稿
2014/01/16 职场文书
无刑事犯罪记录证明
2014/09/18 职场文书
2015年事业单位工作总结
2015/04/27 职场文书
外出考察学习心得体会
2016/01/18 职场文书
礼仪培训心得体会
2016/01/22 职场文书
python 自动化偷懒的四个实用操作
2021/04/11 Python
使用 Koa + TS + ESLlint 搭建node服务器的过程详解
2022/05/30 NodeJs