hello,兄弟姐妹们!我是喔的嘛呀。今天我们来学习scrapy的第一部分。(总共分为三部分)
目录
一、安装 Scrapy:
二、创建 Scrapy 项目:
三、创建spider
四、Selectors:
CSS 选择器
XPath 选择器
选择器的选择
五、**Items:
一、安装 Scrapy:
安装 Scrapy 非常简单,只需在命令行中运行以下命令:
pip install scrapy
这将使用 pip 工具从 Python 包索引(PyPI)安装最新版本的 Scrapy。安装完成后,我们就可以开始使用 Scrapy 构建和运行网络爬虫了。(在pycharm中点击Terminal打开终端命令窗口然后输入上面的命令)
二、创建 Scrapy 项目:
要创建一个新的 Scrapy 项目,我们要在终端命令行中运行以下命令:
scrapy startproject project_name
创建成功后在就能看到图片左边的scrapy项目的结构
项目结构:
- Scrapy项目通常包含多个模块和文件,如
spiders
(用于编写爬虫逻辑)、items.py
(定义要抓取的数据结构)、middlewares.py
(中间件,用于处理请求和响应)、pipelines.py
(数据管道,用于处理抓取到的数据)等。
三、创建spider
-
进入项目目录:
使用
cd
命令进入我们刚创建的项目目录的spiders目录。cd (你自己的目录)
-
生成Spider:
使用
scrapy genspider
命令来生成一个新的Spider。我们需要提供Spider的名称和你想要爬取的网站的域名。scrapy genspider myspider example.com
在这个例子中,
myspider
是Spider的名称,example.com
是我们想要爬取的网站的域名。这个命令将在spiders
目录下生成一个名为myspider.py
的文件。 -
编辑Spider:
打开
spiders/myspider.py
文件,并编辑Spider类。我们需要至少定义start_urls
和parse
方法。import scrapy class MySpider(scrapy.Spider): name = 'myspider' # Spider的名称 allowed_domains = ['example.com'] # 允许爬取的域名列表 start_urls = ['<http://example.com/>'] # 初始爬取的URL列表 def parse(self, response): # 在这里编写你的爬取逻辑 # 使用选择器提取数据 # 生成新的请求或者返回提取的数据 pas
-
编写爬取逻辑:
在
parse
方法中,使用Scrapy的选择器(如CSS或XPath选择器)来提取页面中的数据。你也可以生成新的请求来跟进页面中的链接。def parse(self, response): # 使用CSS选择器提取标题 for title in response.css('h1.title::text').getall(): yield {'title': title} # 跟进页面中的链接 for next_page in response.css('a.next-page::attr(href)').getall(): next_page_url = response.urljoin(next_page) yield scrapy.Request(next_page_url, self.parse)
-
运行Spider:
在项目的根目录下,使用
scrapy crawl
命令来运行我们的Spider。scrapy crawl myspider
Scrapy将开始执行你的Spider,发送请求,接收响应,并调用你在Spider中定义的回调函数来处理数据。
-
查看输出:
默认情况下,Scrapy会将提取的数据输出到控制台。我们也可以配置Scrapy将数据导出到文件(如JSON、CSV)或数据库。
四、Selectors:
Scrapy 使用了类似于 CSS 和 XPath 的选择器来从 HTML 或 XML 文档中提取数据。这些选择器提供了非常强大且灵活的方式来定位和提取页面中的特定元素。以下是关于这两种选择器的简要说明:
CSS 选择器
CSS 选择器是基于层叠样式表(CSS)的选择器语法。它们通常用于选择 HTML 文档中的元素,并为这些元素应用样式。在 Scrapy 中,你也可以使用 CSS 选择器来提取数据。
CSS 选择器的一些基本示例:
div
:选择所有的<div>
元素。.class
:选择所有带有指定类的元素。#id
:选择具有指定 ID 的元素。div p
:选择所有<div>
元素内部的<p>
元素。div > p
:选择所有直接子元素为<p>
的<div>
元素。
在 Scrapy 中使用 CSS 选择器提取数据的示例:
response.css('div.class_name::text').get() # 提取带有特定类的 div 元素中的文本内
XPath 选择器
XPath 是一种在 XML 文档中查找信息的语言,它可以用来在 XML 文档中对元素和属性进行遍历。由于 HTML 可以被视为一种特殊的 XML(尽管它的语法更加宽松),因此 XPath 也可以用于从 HTML 中提取数据。
XPath 选择器的一些基本示例:
/
:从文档的根节点选择。element
:选择名为element
的所有元素。element[@attribute='value']
:选择带有指定属性和值的元素。parent/child
:选择parent
元素下的所有child
元素。element/..
:选择element
的父元素。
在 Scrapy 中使用 XPath 选择器提取数据的示例:
response.xpath('//div[@class="class_name"]/text()').get() # 提取带有特定类的 div 元素中的文本内容
选择器的选择
选择使用 CSS 选择器还是 XPath 选择器主要取决于你的个人偏好和具体需求。CSS 选择器通常更简洁、易读,特别是对于前端开发者来说,因为它们与 CSS 样式定义中的选择器语法相同。而 XPath 选择器则提供了更强大和灵活的功能,特别是在处理复杂的 HTML 结构时。
在 Scrapy 中,你可以混合使用这两种选择器,根据你的需求选择最适合的方法。在实际应用中,你可能需要查看目标网页的 HTML 结构,以确定使用哪种选择器更为方便和高效。
五、Items:
Items是Scrapy用来收集爬取数据的容器,它们定义数据结构,使得爬取到的数据可以方便地存储和导出。**
Scrapy中的Items是用于收集爬取数据的容器。它们为爬取到的数据提供了一个结构化的定义,使得数据可以更加清晰地组织和存储,并方便地导出到不同的格式或数据库。
在Scrapy项目中,通常会定义一个或多个Item类,每个类代表一个数据模型,用于描述爬取的数据结构。这些Item类继承自scrapy.Item
,并通过定义类属性来指定数据的字段。
以下是一个简单的Item定义的例子:
import scrapy class MyItem(scrapy.Item): # 定义数据字段 title = scrapy.Field() link = scrapy.Field() description = scrapy.Field() price = scrapy.Field() last_updated = scrapy.Field()
在这个例子中,MyItem
类定义了五个字段:title
、link
、description
、price
和last_updated
。每个字段都是scrapy.Field
的实例,表示该字段可以存储任何类型的数据。
在Spider中,当解析页面并提取出数据后,可以创建一个Item实例,并给它的字段赋值。然后,这个Item实例可以通过Scrapy的Pipeline系统进行进一步的处理,比如清洗数据、验证数据的有效性,或者将数据保存到数据库或文件中。
下面是一个在Spider中使用Item的例子:
def parse(self, response): for product in response.css('div.product'): item = MyItem() # 创建Item实例 item['title'] = product.css('h2.title::text').get() item['link'] = product.css('a.link::attr(href)').get() item['description'] = product.css('p.description::text').get() item['price'] = product.css('span.price::text').get() item['last_updated'] = response.headers.get('Last-Modified') yield item # 提交Item到Scrapy引擎
在这个parse
方法中,对于每个产品,我们创建一个MyItem
实例,并使用CSS选择器提取数据并赋值给Item的字段。最后,我们使用yield
关键字将这个Item实例提交给Scrapy引擎,Scrapy引擎会将其传递给后续的Pipeline进行处理。
通过定义和使用Items,Scrapy项目能够以一种结构化和清晰的方式组织和处理爬取到的数据,使得数据的存储和导出变得更加方便。
好了,兄弟姐妹们!今天的学习就到这里了。我们下一天再见啦。拜拜喽