菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
238
0

Scrapy 爬虫

原创
05/13 14:22
阅读数 39760


Scrapy 爬虫
关于如何将Scrapy集成到Django应用程序(反之亦然)有两篇文章。但是它们中的大多数都没有介绍完整的示例,其中包括从Django视图触发爬行器。因为这是一个web应用程序,所以这一定是我们的主要目标。
我们需要什么?
在我们开始之前,最好明确我们想要的是什么以及我们想要它的方式。检查这个图:
它展示了我们的应用程序应该如何工作
客户端发送一个带有URL的请求来抓取它。(1)
Django triggets scrapy可以运行一个蜘蛛来抓取那个URL。(2)
Django返回一个响应,告诉客户爬行刚刚开始。(3)
scrapy完成爬行并将提取的数据保存到数据库中。(4)
django从数据库中获取数据并将其返回给客户端。(5)
看起来很简单。
第五句话的注释
Django从数据库中获取数据并将其返回给客户端。(5)
Django和客户端都不知道Scrapy什么时候完成爬行。有一个名为pipeline_closed的回调方法,但它属于Scrapy项目。我们无法从废弃的管道中得到回应。我们使用这种方法只是为了将提取的数据保存到数据库中。
最终,在某个地方,我们不得不告诉客户:
嘿!爬行完成,我将向您发送爬行数据。
有两种可能的方法(如果你发现更多,请评论):
当爬行完成时,我们可以使用web套接字通知客户端。
或者,
我们可以开始发送请求每2秒(更多?)在我们得到“爬行开始”响应后,从客户端检查爬行状态。
Web套接字解决方案听起来更加稳定和健壮。但是它需要另一个单独运行的服务,这意味着更多的配置。我暂时跳过这个选项。但我会为我的生产级应用程序选择web套接字。
让我们写一些代码
是时候做些真正的工作了。让我们从准备我们的环境开始。
安装依赖关系
创建一个虚拟环境并激活它:
单击以展开代码
Scrapyd是一个用于运行痒蜘蛛的守护服务。你可以在这里发现它的细节。
Python -scrapyd-api是一个封装器,允许我们从Python程序中讨论scrapyd。
注意:我将在这个项目中使用Python 3.5
创建DJANGO项目
使用名为main的应用程序创建django项目:
单击以展开代码
我们还需要一个模型来保存我们的剪贴数据。让我们保持简单:
单击以展开代码
将主应用程序添加到设置中的INSTALLED_APPS中。最后一步,迁移:
单击以展开代码
让我们添加一个视图和url到我们的主应用程序:
单击以展开代码
我尽可能多地记录代码。
但主要的技巧是,unique_id。通常,我们将一个对象保存到数据库中,然后得到它的ID。爬行完成后,
客户端请求抓取数据;我们可以使用unique_id创建查询并获取结果。
这个视图的url:
单击以展开代码
创建SCRAPY项目\
如果我们在Django项目下面(或旁边)创建Scrapy项目更好。这使它们更容易连接在一起。让我们在Django项目文件夹下创建它:
单击以展开代码
现在我们需要从scrapy_app文件夹内创建第一个spider:
单击以展开代码
我把蜘蛛命名为icrawler。你可以把它命名为任何东西。看-t爬行部分。我们特产网为爬行器指定一个基本模板。你可以看到所有可用的模板:
单击以展开代码
现在我们应该有一个这样的文件夹结构:
连接SCRAPY到DJANGO
为了从Scrapy访问Django模型,我们需要将它们连接在一起。去设置。py文件在scrapy_app/scrapy_app/和put下:
Scrapy设置文件
就是这样。现在让我们开始讨论scrapyd,以确保所有内容都已正确安装和配置。在scrapy_app/文件夹内运行:
scrapyd美元

 上海写字楼出租 http://www.soolou.com
这将启动scrapyd并生成一些输出。Scrapyd还有一个非常简单的web控制台。我们在生产中不需要它,但我们可以用它来观察开发过程中活跃的工作。启动scrapyd后,可以访问http://127.0.0.1:6800,查看是否正常。

配置我们的SCRAPY项目写字楼出租 http://www.100loujia.com 
因为这篇文章不是关于scrapy的基础知识,所以我将跳过有关修改spider的部分。您可以使用官方文档创建您的spider。我将在这里展示我的例子spider:
单击以展开代码
以上是icrawler。来自scrapy_app/scrapy_app/spider的py文件。注意……的方法。……很重要。如果我们想要使一个方法或属性成为动态的,我们需要在__init__方法下定义它,这样我们就可以从Django传递参数并在这里使用它们。
我们还需要为废品项目创建一个项目管道。流水线是一个类,用于对清理过的项目进行操作。从文档:
项目管道的典型用途有:
清理HTML数据
验证剪贴数据(检查项目是否包含某些字段)
检查副本(并删除它们)
储存刮伤的i

发表评论

0/200
238 点赞
0 评论
收藏