Python爬虫——Scrapy Spiders

tech2022-09-15  105

Scrapy Spiders

spider是定义一个特定站点(或一组站点)如何被抓取的类,包括如何执行抓取(即跟踪链接)以及如何从页面中提取结构化数据(即抓取项)。换言之,spider是为特定站点(或者在某些情况下,一组站点)定义爬行和解析页面的自定义行为的地方。

抓取周期:

生成对第一个URL进行爬网的初始请求,然后指定一个回调函数,该函数使用从这些请求下载的响应进行调用  要执行的第一个请求是通过调用 start_requests() (默认)生成的方法 Request 对于中指定的URL start_urls 以及 parse 方法作为请求的回调函数在回调函数中,解析响应(网页)并返回提取数据的dict, Item 对象, Request 对象,或这些对象中的一个不可重复的对象。这些请求还将包含回调(函数可以相同),然后由scrappy下载,然后由指定的回调处理它们的响应在回调函数中,解析页面内容,通常使用 选择器 (也可以使用beautifulsoup、lxml或任何机制)并使用解析的数据生成项最后,从spider返回的项目通常被持久化到数据库(在某些 Item Pipeline )或者使用 Feed 导出

Spider

class scrapy.spiders.Spider

Spider是最简单的spider。每个其他的spider必须继承自该类(spiders.Spider)(包括Scrapy自带的其它spider,还有你自己写的蜘蛛)。它不提供任何特殊功能。它只是提供了一个默认值 start_requests() 从发送请求的实现 start_urls spider属性并调用spider的方法 parse 对于每个结果响应。

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

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

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

custom_settings:该设置是一个dict,当启动spider时,该设置可以覆盖整个settings文件,将会覆盖整个项目的设置。由于设置必须在初始化(instantiation)前被更新,所以该属性必须定义为class属性。

crawler:该属性在初始化class后,由类方法 from_crawler() 设置, 并且链接了本spider实例对应的 Crawler 对象.

Crawler包含了很多项目中的组件,作为单一的入口点 (例如插件,中间件,信号管理器等)是扩展scrapy核心组件和挂载scrapy的唯一途径

Settings:控制包括核心插件和其它一些spider组件的配置

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

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

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

eg:爬取httpbin的post页面

class HttpbinSpider(scrapy.Spider): name = 'httpbin' allowed_domains = ['httpbin.org'] start_urls = ['http://httpbin.org/post'] def start_requests(self): yield scrapy.Request(url='http://httpbin.org/post',method='POST',callback=self.parse_post) def parse(self, response): pass def parse_post(self, response): print('Hello',response.text)

 输出:

Hello {   "args": {},   "data": "",   "files": {},   "form": {},   "headers": {     "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",     "Accept-Encoding": "gzip,deflate",     "Accept-Language": "en",     "Content-Length": "0",     "Host": "httpbin.org",     "User-Agent": "Scrapy/1.0.1 (+https://scrapy.org)",     "X-Amzn-Trace-Id": "Root=1-5f5054fa-95788485e064feec9d51f126"   },   "json": null,   "origin": "117.136.4.15",   "url": "http://httpbin.org/post" }

 make_requests_from_url(url):接受一个URL并返回用于爬取的 Request 对象。 该方法在初始化request时被 start_requests() 调用,也被用于转化url为request

默认未被复写(overridden)的情况下,该方法返回的Request对象中, parse() 作为回调函数,dont_filter参数也被设置为开启

eg:爬取百度

class BaiduSpider(scrapy.Spider): name = 'baidu' allowed_domains = ['www.baidu.com'] start_urls = ['http://www.baidu.com/'] def make_requests_from_url(self, url): return scrapy.Request(url=url, callback=self.parse_index) def parse(self, response): pass def parse_index(self, response): print('Baidu',response.status)

输出:

Baidu 200

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

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

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

 

最新回复(0)