scrapy 2.3 scrapy.Spider
scrapy.Spider
- class
scrapy.spiders.
Spider
-
这是最简单的蜘蛛,也是每个蜘蛛都必须继承的蜘蛛(包括与碎屑捆绑在一起的蜘蛛,还有你自己写的蜘蛛)。它不提供任何特殊功能。它只是提供了一个默认值
start_requests()
从发送请求的实现 start_urls
spider属性并调用spider的方法parse
对于每个结果响应。name
-
定义此蜘蛛名称的字符串。spider名称是scrappy定位(和实例化)spider的方式,因此它必须是唯一的。但是,没有什么可以阻止您实例化同一个蜘蛛的多个实例。这是最重要的蜘蛛属性,也是必需的。
如果蜘蛛 爬取 一个域,通常的做法是在域后命名蜘蛛,无论有没有 TLD . 例如,一只爬行的蜘蛛
mywebsite.com
经常被称为mywebsite
.
allowed_domains
-
包含允许此蜘蛛爬行的域的字符串的可选列表。对于不属于此列表(或其子域)中指定的域名的URL请求,如果
OffsiteMiddleware
启用。假设您的目标URL是
https://www.example.com/1.html
然后添加'example.com'
列在名单上。
custom_settings
-
运行此spider时,将从项目范围配置中重写的设置字典。它必须被定义为类属性,因为在实例化之前更新了设置。
有关可用内置设置的列表,请参阅: 内置设置参考 .
crawler
-
此属性由
from_crawler()
初始化类后的类方法,并链接到 Crawler
此蜘蛛实例绑定到的对象。Crawler封装了项目中的许多组件,用于它们的单入口访问(例如扩展、中间件、信号管理器等)。见 爬虫API 了解更多。
settings
-
用于运行此蜘蛛的配置。这是一个
Settings
实例,请参见 设置 有关此主题的详细介绍。
logger
-
用蜘蛛创建的python记录器
name
. 您可以使用它通过它发送日志消息,如中所述 从蜘蛛记录 .
from_crawler
(crawler, *args, **kwargs)-
这是Scrapy用来创建蜘蛛的类方法。
您可能不需要直接重写它,因为默认实现充当
__init__()
方法,使用给定参数调用它args
和命名参数kwargs
.尽管如此,此方法设置了
crawler
和 settings
新实例中的属性,以便稍后在蜘蛛代码中访问它们。
start_requests
()-
此方法必须返回一个iterable,其中包含对此spider进行爬网的第一个请求。当蜘蛛被打开爬取的时候,它被称为 Scrapy。Scrapy只调用一次,因此可以安全地实现
start_requests()
作为发电机。默认实现生成
Request(url, dont_filter=True)
对于每个URL start_urls
.如果要更改用于开始抓取域的请求,这是要重写的方法。例如,如果您需要从使用POST请求登录开始,可以执行以下操作:
class MySpider(scrapy.Spider): name = 'myspider' def start_requests(self): return [scrapy.FormRequest("http://www.example.com/login", formdata={'user': 'john', 'pass': 'secret'}, callback=self.logged_in)] def logged_in(self, response): # here you would extract links to follow and return Requests for # each of them, with another callback pass
我们来看一个例子:
import scrapy
class MySpider(scrapy.Spider):
name = 'example.com'
allowed_domains = ['example.com']
start_urls = [
'http://www.example.com/1.html',
'http://www.example.com/2.html',
'http://www.example.com/3.html',
]
def parse(self, response):
self.logger.info('A response from %s just arrived!', response.url)
从单个回调返回多个请求和项目:
import scrapy
class MySpider(scrapy.Spider):
name = 'example.com'
allowed_domains = ['example.com']
start_urls = [
'http://www.example.com/1.html',
'http://www.example.com/2.html',
'http://www.example.com/3.html',
]
def parse(self, response):
for h3 in response.xpath('//h3').getall():
yield {"title": h3}
for href in response.xpath('//a/@href').getall():
yield scrapy.Request(response.urljoin(href), self.parse)
而不是 start_urls
你可以用 start_requests()
直接;给数据更多的结构,你可以使用 Item
物体::
import scrapy
from myproject.items import MyItem
class MySpider(scrapy.Spider):
name = 'example.com'
allowed_domains = ['example.com']
def start_requests(self):
yield scrapy.Request('http://www.example.com/1.html', self.parse)
yield scrapy.Request('http://www.example.com/2.html', self.parse)
yield scrapy.Request('http://www.example.com/3.html', self.parse)
def parse(self, response):
for h3 in response.xpath('//h3').getall():
yield MyItem(title=h3)
for href in response.xpath('//a/@href').getall():
yield scrapy.Request(response.urljoin(href), self.parse)