当前位置: 首页 > 后端技术 > Python

Scrapy框架初探

时间:2023-03-26 00:00:51 Python

Scrapy基本介绍Scrapy是一个爬虫框架,提供了相当成熟的模板,大大减少了程序员在编写爬虫时的劳动需求。命令行工具&项目结构要使用scrapy,需要先创建一个scrapy项目,然后在项目文件夹路径下生成一个spider(爬虫)文件。写完程序,运行爬虫(手动指定保存文件)。以上过程通过命令行执行,如下:scrapystartprojectscrapygenspiderscrapycrawl[-ofilename]后两条命令必须在myproject文件夹路径下(第一个myproject)接下来执行。第一条命令创建的scrapy项目结构如下:myproject/scrapy.cfgmyproject/__init__.pyitems.pymiddlewares.pypipelines.pysettings.pyspiders/__init__.pyspider_name.pyScrapy概述上图为scrapy基本结构,不难看出scrapy的程序执行和数据流都是由引擎调度和控制的。具体结构解释见:scrapy文档概述.ScrapySpider详解scrapy的基本使用一般只需要写在spider_name.py中,这个文件是我们使用scrapygenspider命令后自动创建的。该文件还会自动导入scrapy并自动创建一个模板蜘蛛类(自动继承自scrapy.Spider)。这里介绍蜘蛛的功能:scrapydocumentspider。下面是scrapy.Spider类的一些常用的属性和方法:attribute:name:name属性就是我们在使用命令行时指定的spider_name,在scrapy框架中用来标识spider,每个spider必须有一个唯一的名字。allowed_domains:该属性是一个包含字符串元素的列表,每个元素字符串是一个域,限制了爬虫可以爬取的网址。start_urls:该属性也是一个包含字符串元素的列表,每个元素字符串对应一个完整的url,也就是蜘蛛启动时需要爬取的初始url。custom_settings:该属性的形式是dict,比如修改user-agent,开启pipeline,指定log_level等,限于httpheader。method:start_requests:该方法用于在scrapy开始爬取时返回一个Requestiterable或者一个带有start_urls的generator。该方法在一个爬虫过程中只会被调用一次。它的默认实现是:Request(url,dont_filter=True)foreachurlinstart_urls。parse:这是蜘蛛类中最重要的方法。根据scrapy文档中对蜘蛛的介绍,蜘蛛每次发出一个Request,都要处理这个Request的Response。处理函数称为回调函数,即一个Request对应一个Callback。而parse是默认的回调函数,负责解析返回的response(xpath),提取数据(itemdict-likeobject)并交给,同时根据需要发出新的Request请求。和start_requests一样,它的返回值也需要是一个可迭代对象或生成器。一般来说,先yielditem,然后根据response解析得到一个新的url到yieldRequest(url,callback)。响应的解析和数据提取这里略过,具体可以看b站的教程。从上面的介绍可以看出对于start_request和parse方法的返回值要求,scrapy框架的内部代码逻辑应该像for循环一样轮询两者的返回值。对于parse方法,还需要判断返回值的类型(item/Request)来区分。ScrapyRequest和Response通常,Request对象在蜘蛛中生成并穿过系统,直到它们到达Downloader,Downloader执行请求并返回Response对象,该对象返回到发出请求的蜘蛛。请求对象scrapy,Request(callback,method="GET",headers=None,body=None,cookies=None,meta=None,...,dont_filter=False)其中url参数就是我们要爬取的url回调request对应的网站返回response时的处理函数method是http请求方法,常用的:“GET”,“POST”headers是请求头,dictbody形式是http请求的请求数据,也就是一般形式的数据,以bytesstring的形式cookies的形式是dict。先说dont_filter。默认值为假。在scrapy中,默认不会重复抓取同一个url,所以同一个url会被过滤器丢弃,而有时候我们需要抓取同一个url(比如抓取某个不断更新的论坛页面),就需要设置值为TruemetaRequest.meta属性的初始值。如果给定,传入此参数的字典将被浅拷贝。该参数也是字典形式,spider类在多个parse函数之间传递信息,见知乎。注意Response对象也有一个它对应的Request对象:生成这个响应的Request对象。这个属性是在Scrapy引擎中赋值的,在响应和请求经过所有下载器中间件之后特别是,这意味着:HTTP重定向将导致原始请求(到重定向前的URL)被赋值给重定向的响应(重定向后的最终URL)。Response.request.url并不总是等于Response.url此属性仅在蜘蛛代码和蜘蛛中间件中可用,但在下载器中间件中不可用(尽管您可以通过其他方式)和response_downloaded信号的处理程序。但与Response.request属性不同,Response.meta属性是沿着重定向和重试传播的,因此您将获得从您的蜘蛛发送的原始Request.meta。Responseobejct这里仅介绍一些reponse对象的属性:url即该response的来源urlstatus即该response的状态码headersresponse的响应头,form是dictbodyresponse对应的databody,form是bytesrequestresponse对应的Request对象,上面已经介绍过,即Response.url可能不等于Response.request.url,因为重定向.SettingsSettings可以使用不同的机制来填充,每个机制都有不同的优先级。下面按照优先级从高到低依次列出:命令行选项(最优先)Settingsper-spiderProjectsettingsmodule(settings.py)Defaultsettingsper-commandDefaultglobalsettings(lessprecedence)一般我们直接在settings中修改.py文件。常见的增改有:user-agent规范、ITEM_PIPELINES取消注释启用管道功能、LOG_LEVEL和LOG_FILE规范、ROBOTSTXT_OBEY设置为False等。