Scrapy Spider类介绍
一.介绍
Spider是定义如何抓取某一个站点(或一组站点的类),包括如何执行Crawl,以及如何从其页面中提取结构化数据。
对于spider,抓取周期是这样的:
1)首先生成初始请求以抓取第一个 URL,并指定一个回调函数以使用从这些请求下载的响应调用。
第一个要执行的请求是通过调用start_requests() (默认情况下) 请求指定的url是通过start_urls一个列表,parse方法是一个回调函数,用来获取响应的网页。
2)使用qequest对象请求,还将包含一个回调、然后由scrapy下载,由指定的回调函数处理它们的响应
3)在回调函数中,可以解析页面内容,通常使用选择器(也可以使用 BeautifulSoup、lxml 或您喜欢的任何机制)并使用解析的数据生成items。
4)最后从spider返回的items通常会保存到数据库。
二. scrapy.Spider类
这是一个python类,是最简单的spider, 也是所有其它spider都必须继承的,它不提供任何特殊功能。它只是提供了一个默认start_requests()实现,通过start_urls(spider类的属性)发送请求,然后parse处理每一个响应。
class ToScrapeCSSSpider(scrapy.Spider): name = "cnblogsapi" start_urls = [ 'https://www.cnblogs.com/SunSpring/p/16193997.html', ] def parse(self, response): pass
1.name属性
定义spider名称的字符串,用于scrapy定位和实例化spider的方式,因此它必须是唯一的,此属性是必须的。
如果spider抓取单个 域,通常创建一个spider的做法是:“域_spider.py" (如quotes_spider.py)。name就是取的域名。
2.allowed_domains属性
包含允许此spider抓取的域的可选字符串列表。
假设您的目标网址是https://www.example.com/1.html,然后添加'example.com'到列表中
3.start_urls属性
这是一个url的list列表类型,spider在启动时爬取的url列表,初始请求由它定义,request将根据start_urls中包含的数据依次生成。
4.custom_settings属性
覆盖全局的settings文件设置,如下所示:
custom_settings = { 'DOWNLOADER_MIDDLEWARES':{ 'gerapy_pyppeteer.downloadermiddlewares.PyppeteerMiddleware': 543 }, 'CONCURRENT_REQUESTS' : 3, 'GERAPY_PYPPETEER_LOGGING_LEVEL' : logging.DEBUG }
6.settings
settings实例,读取settings.py的内容,下面是callback回调方法中获取设置内容
def parse(self, response): print(self.settings['ROBOTSTXT_OBEY'])
7.logger
记录日志,如下所示
def parse(self, response): self.logger.info('c')
8.start_requests()
此方法必须返回一个迭代器,其中包含要为spider爬取的第一个请求。当打开spider进行爬取时,它被scrapy调用。 scrapy只调用它一次,因此start_requests() 作为生成器实现是安全的。
默认实现Request(url, dont_filter=True)从start_urls中循环每一个url
11. parse(response)
这是scrapy用来处理下载响应的默认回调,start_urls里面的链接的请求完成下载后,parse方法就会被调用,返回的响应就会作为唯一的参数传递给parse方法。
12.arguments属性
spider可以接收修改其行为的参数,下面是一个示例:
import scrapy class MySpider(scrapy.Spider): name = 'myspider' def __init__(self, category=None, *args, **kwargs): super(MySpider, self).__init__(*args, **kwargs) self.start_urls = [f'http://www.example.com/categories/{category}'] # ...
scrapy crawl myspider -a category=electronics
11.基它属性:
1) state:一个 dict 可以用来在批次之间保持一些spider状态
12.基它方法:
1) from_crawler(crawler,*.args,**kwargs),创建类的方法,默认实现充当该__init__()方法的代理。
三.scrapy.Spider.CrawlSpider 类
这是爬取常规网站最常用的爬虫,因为它通过定义一组规则为跟踪链接提供了一种方便的机制。
它继承了spider的属性,该类还支持一个新的属性:
rules属性对象:这是一个或多个rule对象的列表,每个rule定义了爬取网站的特定行为,如果多个规则匹配同一个链接,将使用每一个,根据在此属性中定义的顺序。
rules对象包括:
link_extractor(链接提取器对象)
callback(可调用的回调方法)
cb_wargs是一个包含要传递给回调函数的关键字参数的字典
fllow一个布尔值,是否从使用规则提取的每个响应中遵循转接头,如果callback是None 默认为True,否则是False
警告:基于crawlspider爬取时为新请求显示设置回调;否则可能会发生意外行为。
下面是一个带有规则的示例:
import scrapy from scrapy.spiders import CrawlSpider, Rule from scrapy.linkextractors import LinkExtractor class MySpider(CrawlSpider): name = 'example.com' allowed_domains = ['example.com'] start_urls = ['http://www.example.com'] rules = ( # Extract links matching 'category.php' (but not matching 'subsection.php') # and follow links from them (since no callback means follow=True by default). Rule(LinkExtractor(allow=('category\.php', ), deny=('subsection\.php', ))), # Extract links matching 'item.php' and parse them with the spider's method parse_item Rule(LinkExtractor(allow=('item\.php', )), callback='parse_item'), ) def parse_item(self, response): self.logger.info('Hi, this is an item page! %s', response.url) item = scrapy.Item() item['id'] = response.xpath('//td[@id="item_id"]/text()').re(r'ID: (\d+)') item['name'] = response.xpath('//td[@id="item_name"]/text()').get() item['description'] = response.xpath('//td[@id="item_description"]/text()').get() item['link_text'] = response.meta['link_text'] url = response.xpath('//td[@id="additional_data"]/@href').get() return response.follow(url, self.parse_additional_page, cb_kwargs=dict(item=item)) def parse_additional_page(self, response, item): item['additional_data'] = response.xpath('//p[@id="additional_data"]/text()').get() return item
浙公网安备 33010602011771号