文章目录
Scrapy
一. Scrapy简介
Scrapy是一个用于抓取网站和提取结构化数据的应用程序框架,可用于各种有用的应用程序,如数据挖掘、信息处理或历史存档。
尽管 Scrapy 最初是为网络抓取设计的,但它也可以用于使用 API(如Amazon Associates Web Services)提取数据,或用作通用网络爬虫。
其支持:
-
使用扩展 CSS 选择器和 XPath 表达式,以及使用正则表达式进行提取的帮助器方法,内置支持从 HTML/XML 源中选择和提取数据。
-
一个交互式外壳控制台(IPython 识别),用于尝试 CSS 和 XPath 表达式以抓取数据,在编写或调试爬虫时非常有用。
-
内置支持生成信息导出,格式多样(JSON、CSV、XML),并将其存储在多个后端(FTP、S3、本地文件系统)中。
-
强大的编码支持和自动检测,用于处理外来、非标准和损坏的编码声明。
-
强大的可扩展性支持,允许您使用信号和明确定义的 API(中间件、扩展和管道)插入您自己的功能。
-
用于处理的内置扩展和中间件范围广泛
-
cookie 和会话处理
-
HTTP 功能,如压缩、身份验证、缓存
-
用户代理欺骗
-
robots.txt
-
抓取深度限制
-
以及更多
-
-
一个Telnet 控制台,用于连接到 Scrapy 进程中运行的 Python 控制台,以自省和调试您的爬虫
以及其他好处,例如可重复使用的爬虫,用于从站点地图和 XML/CSV 信息中抓取站点,用于自动下载图像(或任何其他媒体)的媒体管道与抓取的项目相关联,一个缓存 DNS 解析器,以及更多!
二. Scrapy的安装
建议在专用虚拟环境 中安装(如 Anaconda 或 Miniconda), 以避免安装时与系统发生冲突。
1. 进入项目所在目录
在文件路径处输入cmd进入命令提示符
2. 安装软件包Scrapy
pip install Scrapy
3. 验证是否安装成功
进入激活后的虚拟环境对应项目目录,输入:
scrapy version
若出现对应scrapy版本号,即说明安装成功
三. Scrapy的基础使用
1. 创建项目
在开始爬取之前,您必须设置一个新的 Scrapy 项目。进入您想要存储代码的目录并运行
scrapy startproject tutorial
这将创建一个 tutorial 目录,其中包含以下内容
tutorial/
scrapy.cfg # deploy configuration file
tutorial/ # project's Python module, you'll import your code from here
__init__.py
items.py # project items definition file
middlewares.py # project middlewares file
pipelines.py # project pipelines file
settings.py # project settings file
spiders/ # a directory where you'll later put your spiders
__init__.py
2. 在tutorial/spiders目录下创建保存爬虫代码的项目文件
这里保存为quotes_spider.py
from pathlib import Path
import scrapy
class QuotesSpider(scrapy.Spider):
name = "quotes"
def start_requests(self):
urls = [
"https://quotes.toscrape.com/page/1/",
"https://quotes.toscrape.com/page/2/",
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
page = response.url.split("/")[-2]
filename = f"quotes-{page}.html"
Path(filename).write_bytes(response.body)
self.log(f"Saved file {filename}")
其中
def start_requests(self):
urls = [
"https://quotes.toscrape.com/page/1/",
"https://quotes.toscrape.com/page/2/",
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
# 可以替换为
# 不要实现 start_requests() 方法,该方法从 URL 生成 scrapy.Request 对象,您只需定义一个 start_urls 类属性,其中包含 URL 列表。然后,start_requests() 的默认实现将使用此列表为您的 spider 创建初始请求。
# 这是因为 parse() 是 Scrapy 的默认回调方法,它针对未明确分配回调的请求调用。
start_urls = {
"https://quotes.toscrape.com/page/1/",
"https://quotes.toscrape.com/page/2/",
}
3.运行爬虫
在该项目顶级目录下输入一下命令(在tutorial下):
scrapy crawl quotes
这里的quotes必须跟 quotes_spider.py中的name属性保持一致
现在,检查当前目录中的文件,可以发现创建了两个新文件:quotes-1.html 和 quotes-2.html,其中包含各个 URL 的内容,与代码文件中的parse函数的指示一致。
过程为:
Scrapy 调度 scrapy.Request 对象,由 Spider 的 start_requests 方法返回。在收到每个对象的响应后,它实例化 Response 对象并调用与请求关联的回调方法(在本例中,是 parse 方法),将响应作为参数传递。
4.利用css选择器+Scrapy Shell提取数据
注意:在 Windows 上,要使用双引号将参数URL括起来
例如:
在shell命令中输入一下命令
scrapy shell "https://quotes.toscrape.com/page/1/"
运行结果如下:
例如:
response.css("title")
[<Selector query='descendant-or-self::title' data='<title>Quotes to Scrape</title>'>]
response.css("title::text").getall()
['Quotes to Scrape']
response.css("title").getall()
['<title>Quotes to Scrape</title>']
response.css("title::text").get()
'Quotes to Scrape'
response.css("title::text").re(r"Quotes.*")
['Quotes to Scrape']
response.css("title::text").re(r"Q\w+")
['Quotes']
response.css("title::text").re(r"(\w+) to (\w+)")
['Quotes', 'Scrape']
官方文档见:https://docs.scrapy.net.cn/en/latest/