电商老板,经理都可能需要爬自己经营的网站,目的是监控网页,追踪网站流量,寻找优化机会等。
对于其中的每一项,均可以通过离散工具,网络抓取工具和服务来帮助监控网站。只需相对较少的开发工作,就可以创建自己的站点爬网程序和站点监视系统。
构建自定义的爬虫站点和监控程序, 第一步是简单地获取网站上所有页面的列表。本文将介绍如何使用Python编程语言和一个名为Scrapy的整洁的Web爬网框架来轻松生成这些页面的列表。
你需要一个服务器,Python和Scrapy
这是一个开发项目。需要安装Python和Scrapy的服务器。还需要通过终端应用程序或SSH客户端对该服务器的命令行进行访问。还可以从Python.org的文档部分获取有关安装Python的信息。Scrapy网站还有很好的安装文档。请确认您的服务器已准备好安装Python和Scrapy。
创建一个Scrapy项目
使用像Putty for Windows这样的SSH客户端或Mac,Linux计算机上的终端应用程序,导航到要保留Scrapy项目的目录。使用内置的Scrapy命令startproject,我们可以快速生成所需的基本文件。
本文将抓取一个名为Business Idea Daily的网站,因此将该项目命名为“bid”。
生成一个新的Scrapy Web Spider
为方便起见,Scrapy还有另一个命令行工具,可以自动生成新的Web Spider。
scrapy genspider -t crawl getbid businessideadaily.com
第一个术语,scrapy,参考Scrapy框架。接下来,有genspider命令告诉Scrapy我们想要一个新的web spider,或者,如果您愿意,还想要一个新的网络爬虫。
-t告诉Scrapy我们想要选择一个特定的模板。genspider命令可以生成四个通用Web Spider模板中的任何一个:basic,crawl,csvfeed和xmlfeed。直接在-t之后,我们指定了想要的模板。在这个例子中,我们将创建被Scrapy称为CrawlSpider的模板。 “getbid”这个词就是spider的名字。
该命令的最后一部分告诉Scrapy我们想要抓取哪个网站。框架将使用它来填充一些新spider的参数。
定义Items
在Scrapy中,Items是组织我们spider爬行特定网站时收集东西的方式/模型。虽然我们可以很容易地完成我们的目标- 获取特定网站上所有页面的列表- 不使用Items,但如果我们想稍后扩展我们的爬虫,则不使用Items可能会限制我们。
要定义一个Item,只需打开我们生成项目时创建的Scrapy的items.py文件。在其中,将有一个名为BidItem的类。类名基于我们为项目提供的名称。
class BidItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
pass
将pass替换为名为url的新字段的定义。
url = scrapy.Field()
保存做好的文档
构建Web Spider
接下来打开项目中的蜘蛛目录,查找生成的新Spider Scrapy。 在这个例子中,这个蜘蛛叫做getbid,所以文件是getbid.py。
在编辑器中打开此文件时,您应该看到如下所示的内容。
# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from bid.items import BidItem
class GetbidSpider(CrawlSpider):
name = 'getbid'
allowed_domains = ['businessideadaily.com']
start_urls = ['http://www.businessideadaily.com/']
rules = (
Rule(LinkExtractor(allow=r'Items/'), callback='parse_item', follow=True),
)
def parse_item(self, response):
i = BidItem()
#i['domain_id'] = response.xpath('//input[@id="sid"]/@value').extract()
#i['name'] = response.xpath('//div[@id="name"]').extract()
#i['description'] = response.xpath('//div[@id="description"]').extract()
return i
我们需要对为我们生成的代码Scrapy进行一些小的更改。 首先,我们需要在规则下修改LinkExtractor的参数。删除括号中的所有内容。
Rule(LinkExtractor(), callback='parse_item', follow=True),
通过此更新,我们的spider将在起始页面(主页)上找到每个链接,将单个链接传递给parse_item方法,并按照指向网站下一页的链接来确保我们获取每个链接页面。
接下来,我们需要更新parse_item方法。 删除所有注释行。这些线条只是Scrapy为我们提供的例子。
def parse_item(self, response):
i = BidItem()
return i
我喜欢使用有意义的变量名。 所以我要将i更改为href,这是HTML链接中属性的名称,如果有的话,它将保存目标链接的地址。
def parse_item(self, response):
href = BidItem()
return href
现在奇迹发生了,我们捕获页面URL为Items。
def parse_item(self, response):
href = BidItem()
href['url'] = response.url
return href
这就对了。 新Spider已经准备好爬行了。
抓取网站,获取数据
从命令行,我们想要导航到我们的项目目录。 进入该目录后,我们将运行一个简单的命令来发送我们的新蜘蛛并获取一个页面列表。
scrapy crawl getbid -o 012916.csv
该命令有几个部分。 首先,我们参考Scrapy框架。 我们告诉Scrapy我们想爬行。 我们指定要使用getbid蜘蛛。
-o告诉Scrapy输出结果。 该命令的012916.csv部分告诉Scrapy将结果放在带有该名称的逗号分隔值(.csv)文件中。
在示例中,Scrapy将返回三个页面地址。 我为这个例子选择这个网站的原因之一是它只有几页。 如果你在一个有数千页的网站上瞄准一个类似的蜘蛛,它将需要一些时间来运行,但它会返回一个类似的响应。
url
https://businessideadaily.com/auth/login
https://businessideadaily.com/
https://businessideadaily.com/password/email
只需几行代码,您就可以为自己的站点监控应用程序奠定基础。
本文由数据星河原创内容