AI写作智能体 自主规划任务,支持联网查询和网页读取,多模态高效创作各类分析报告、商业计划、营销方案、教学内容等。 广告
[TOC] ## **1.Scrapy框架** ![](https://img.kancloud.cn/06/d8/06d857c5c4c55673d2a093ee450e37d0_944x522.png) **ENGINE** 引擎,框架的核心,控制其他组件协同工作。 **SCHEDULER** 调度器,负责对SPIDER提交的下载请求进行调度 **DOWNLOADER** 下载器,负责下载页面 **SPIDER** 爬虫,负责提取页面中的数据,并产生新的请求 **MIDDLEWARE** 中间件,负责对Request对象和Response对象进行处理 **ITEM PIPELINE** 数据管道,负责对爬取到的数据进行处理 ## **2.安装** ``` pip install scrapy # 检查安装是否成功 scrapy ``` ## **3.基本使用** ### **3.1.创建项目** ``` scrapy startproject example ``` 目录结构: ![](https://img.kancloud.cn/4f/0e/4f0efb9f5529cec7e4451114b0108e97_235x187.png) ### **3.2.实现爬虫** 在`spiders`目录下创建文件如`books_spider.py`。 ![](https://img.kancloud.cn/cd/1e/cd1eefc3162467d543091dc9c7c2098a_823x735.png) * name:一个项目中有多个爬虫,name属性是唯一标识; * start_urls:爬虫的起始页面; * parse:当一个页面下载完成后,Scrapy会回调一个指定的解析函数来解析页面, 通常完成两个任务:提取数据和提取链接。 ### **3.3.运行爬虫** ``` scrapy crawl books -o books.csv ``` ## **4.编写Spider** ### **4.1.继承scrapy.Spider** ``` import scrapy class BookSpider(scrapy.Spider): ... ``` Spider基类实现了供Scrapy引擎调用的接口,供用户使用的工具函数,以及供用户访问的属性。 ### **4.2.Spider命名** ``` import scrapy class BookSpider(scrapy.Spider): name = "books" ... ``` `name`属性来区分的唯一标识。 ### **4.3.设置爬虫起点** ``` import scrapy class BookSpider(scrapy.Spider): name = "books" start_urls = ['http://books.toscrape.com/'] ... ``` `start_urls`通常为一个列表,里面放置的是爬虫起点的url。 ### **4.4.页面解析** 页面解析函数就是构造Request对象时通过callback参数指定的回调函数。 一般完成两个工作:使用选择器提取数据,将数据封装提交个Scrapy引擎;使用选择器或者LinkExtractor提取链接。 ## **5.Selector提取数据** ### **5.1.创建对象** Selector类的实现位于scrapy.selector模块。 ``` from scrapy.selector import Selector text = ''' <html> ... ... </html> ''' selector = Selector(text=text) ``` 也可以使用Response对象构造Selector对象,传递给Selector构造器方法的response参数。 ``` from scrapy.selector import Selector from scrapy.http import HtmlResponse body = ''' <html> ... ... </html> ''' response = HtmlResponse(url='http://****.com', body=body) selector = Selector(response=response) ``` ### **5.2.筛选数据** 使用xpath方法或者css方法,返回一个SelectorList对象,可以使用for语句来迭代。 ``` selector_list = selector.xpath('//h1') for sel in selector_list: print(sel.xpath('./text()')) ``` ### **5.3.提取数据** 调用Selector或SelectorList对象可用以下方法来提取数据: * extract() 返回一个列表 * re() 返回指定内容 * extract_first() (SelectorList专有) 返回第一个结果 * re_first() (SelectorList专有) 返回第一个结果 ## **6.XPath语法** XPath即XML路径语言(XML Path Language) xml文档的节点有以下几种类型: * **根节点** 整个文档的根 * **元素节点** html、body、div、p、a * **属性节点** href * **文本节点** Hello World 节点之间的关系有父子、兄弟、祖先后代。 **基础语法** | 表达式 | 描述 | | --- | --- | | / | 选中文档的根(root) | | . |选中当前节点 | | .. | 选中当前节点的父节点 | | E | 选中子节点中所有E元素节点 | | //E | 选中后代节点中所有E元素节点 | | * | 选中所有元素子节点 | | text() | 选中所有文本子节点 | | @ATTR | 选中名为ATTR的属性节点 | | @* | 选中所有属性节点 | | [谓语] | 用来查找某个特定的节点或者包含某个特定的节点 | ## **7.CSS选择器** **基本语法** | 表达式 | 描述 | 例子 | | --- | --- | --- | | * | 选中所有元素 | * | | E |选中E元素 | p | | E1,E2 | 选中E1,E2 | div,pre | | E1 E2 | 选中E1后代中的E2 | div p | | E1>E2 | 选中E1子元素中的E2 | div>p | | E1+E2 | 选中E1兄弟元素中E2 | p+strong | | .CLASS | 选中class属性包含CLASS的元素 | .info | | #ID | 选中id属性包含ID的元素| #main | | [ATTR] | 选中包含ATTR属性的元素 | [href] | | [ATTR=VALUE] | 选中包含ATTR属性且值为VALUE的元素 | [method=post] | |[ATTR~=VALUE] | 选中包含ATTR属性且值包含VALUE的元素 | [class~=clearfix] | | E:nth-child(n) E:nth-last-child(n) | 选中E元素,且该元素必须是其父元素的(倒数)第n个子元素。 | a:nth-child(1) | | E:first-child E:last-child | 选中E元素,其该元素必须是其父元素的(倒数) 第一个子元素 | a:first-child | | E:empty | 选中没有子元素的E元素 | div:empty | | E::text | 选中E元素的文本节点(Text Node) | p::text | ## **8.Item封装数据** ### **8.1.Item和Field** * Item基类 自定义数据类的基类 * Field类 用来描述自定义数据类包含哪些字段