目录
0.0、Scrapy基础
Python2:适合爬取非中文
Python3:适合爬取中文
Scrapy是一种快速的高级Web爬行和Web抓取框架,用于抓取网站并从其页面中提取结构化数据。它可用于各种用途,从数据挖掘到监控和自动化测试。
0.1、Scrapy 框架图
0.2、Scrapy主要包括了以下组件:
- 引擎(Scrapy): 用来处理整个系统的数据流处理, 触发事务(框架核心)
- 调度器(Scheduler): 用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址
- 下载器(Downloader): 用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)
- 爬虫(Spiders): 爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面
- 项目管道(Pipeline): 负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。
- 下载器中间件(Downloader Middlewares): 位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。
- 爬虫中间件(Spider Middlewares): 介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出。
- 调度中间件(Scheduler Middewares): 介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。
0.3、Scrapy简单示例如下:
我们将以最简单的方式运行蜘蛛,它在将访问并获取 http://quotes.toscrape.com上的名言(文本)、作者 :
import scrapy
class QuotesSpider(scrapy.Spider):
name = 'quotes'
start_urls = [
'http://quotes.toscrape.com/',
]
def parse(self, response):
for quote in response.css('div.quote'):
yield {
'text': quote.css('span.text::text').get(),
'author': quote.css('small.author::text').get(),
}
next_page = response.css('li.next a::attr("href")').get()
if next_page:
yield response.follow(response.urljoin(next_page), self.parse)
将以上代码放在一个文本文件中,将其命名为quotes_spider.py
,并使用 以下命令运行蜘蛛:
scrapy runspider quotes_spider.py -o quotes.json
运行上述命令后,代码将在命令运行的目录下创建一个名为quotes.json
的文件,该文件包含JSON格式的列表,其中包含文本和作者,如下所示(为了更好的可读性,此处重新格式化):
[
{
"text": "\u201cThe world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.\u201d",
"author": "Albert Einstein"
},
{
"text": "\u201cIt is our choices, Harry, that show what we truly are, far more than our abilities.\u201d",
"author": "J.K. Rowling"
},
{
"text": "\u201cThere are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.\u201d",
"author": "Albert Einstein"
},
...省略97条...
]
0.4、Scrapy运行流程如下:
当我们运行“scrapy runspider quotes_spider.py”命令时,Scrapy会查找Spider的定义并通过其爬虫引擎运行它;
通过向start_urls 属性中定义的URL发出请求(在上述示例中即:start_urls = ['http://quotes.toscrape.com/'])开始爬行,并调用默认回调方法parse,将响应对象作为参数进行传递;
在parse回调方法中,我们使用CSS Selector循环遍历quote元素,并将提取的名言文本和作者生成Python dict,除此之外我们还查找指向下一页的链接,将获得的下一页链接再次以同样的方式进行请求处理;
在这里,我们可以看到Scrapy的一个主要优点:请求是 异步调度与处理的。
这意味着Scrapy不需要等待请求完成和处理,它可以在此期间发送另一个请求或执行其他操作。
这也意味着即使某些请求失败或在处理错误时发生错误,其他请求也可以继续运行。
虽然这使得我们能够进行非常快速的爬网(以容错的方式同时发送多个并发请求),但Scrapy还可以通过一些设置让我们的蜘蛛以更加绅士的方式去爬网。
我们可以执行以下操作:在每个请求之间设置下载延迟,限制每个域或每个IP的并发请求数量,甚至使用自动限制扩展,以尝试自动解决这些问题。
注意:我们在这里使用的是Feed导出生成JSON文件,除此之外我们还可以轻松更改导出格式(例如XML或CSV),存储于后端服务(例如FTP或Amazon S3),还可以编写 item pipeline 用以将 items 存储在数据库中。
运行流程小结:
- 首先,引擎从调度器中取出一个链接(URL)用于接下来的抓取;
- 引擎把URL封装成一个请求(Request)传给下载器,下载器把资源下载下来,并封装成应答包(Response);
- 然后,爬虫解析Response;
- 若是解析出实体(Item),则交给实体管道进行进一步的处理;
- 若是解析出的是链接(URL),则把URL交给Scheduler等待抓取。
0.5、还有什么?
通过上述实践,我们已经了解了如何使用Scrapy从网站中提取和存储项目,但这只是表面。
Scrapy提供了许多强大的功能,可以帮助我们轻松高效地进行抓取,例如:
内置支持使用扩展的CSS选择器和XPath表达式,让我们可以高效地从HTML / XML源代码中选择和提取数据,并使用正则表达式提取辅助方法;
提供交互式Shell控制台(支持IPython),用于尝试使用CSS和XPath表达式来抓取数据,在编写或调试蜘蛛时非常有用;
内置支持以多种格式(JSON,CSV,XML)生成Feed导出并将其存储在多个后端服务(FTP、S3、数据库、本地文件系统)中;
强大的编码支持和自动检测,用于处理外部,非标准和损坏的编码声明;
强大的可扩展性支持,允许使用Signals(信号)和定义良好的API(中间件,扩展和 管道)插入自己的自定义功能;
-
诸多的内置扩展和中间件用于处理:
- Cookie和会话处理
- HTTP功能,如压缩,身份验证,缓存
- User-Agent 代理请求
- robots.txt
- 爬行深度限制...
一个Telnet控制台,用于连接到Scrapy进程内运行的Python控制台,用以调试爬虫;
还有其他好东西,比如可重复使用的蜘蛛,可以从Sitemaps(站点地图:网站管理员向搜索引擎通知可用于爬行的网站页面的一种简单方法。)和XML / CSV Feed中抓取网站,自动下载与抓取项目相关联的图像(或任何其他媒体)的媒体管道,缓存DNS解析器等等!
0.6、下一步是什么?
接下来的步骤是安装Scrapy, 按照教程学习如何创建一个完整的Scrapy项目。感谢加入社区,谢谢大家的关注!
原文链接:
0.Python 爬虫之Scrapy入门实践指南(Scrapy基础知识)
(完)