标题中有个“最”字,应该很多人都是不服气的,不过继续往下看,不知能不能改变您的看法。
下面以采集http://www.scrapyd.cn/为例子
from simplified_scrapy.core.spider import Spider
class ScrapydSpider(Spider):
name = 'scrapyd-spider'#定义爬虫名称
start_urls = ['http://www.scrapyd.cn/']#初始化入口链接
models = ['auto_main','auto_obj']#配置抽取模型
上面这个就是一个完整的爬虫了,简不简单:)
要想运行这个爬虫,需要用上下面的代码:
from simplified_scrapy.simplified_main import SimplifiedMain
SimplifiedMain.startThread(ScrapydSpider())
如果想对采集做点过滤,只采集教程数据,重写下面的方法就行
#返回True表示url符合要求;False表示不符合要求,将丢弃
def urlFilter(self,url):
return url.find('/jiaocheng/')>0# 只采集教程数据
当然上面的爬虫例子是采集文章数据的通用型采集,并且抽取出的数据并不是那么准确。我们可以自定义抽取,重写方法extract,代码如下:
def extract(self, url, html, models, modelNames):
try:
html = self.removeScripts(html)# 去掉脚本数据,也可以不去
lstA = self.listA(html,url["url"])#抽取页面中的链接
data = []
ele = self.getElementByTag("h1",html)#取标题
if(ele):
title = ele.text
ele = self.getElementByClass("cont",html,"")#取正文
if(ele):
content = ele.html
ele = self.getElementsByTag("span",html,'class="title-2"','class="cont"')#取作者和时间
author = None
time = None
if(ele and len(ele)>1):
time = ele[0].text
author = ele[1].text
data.append({"Url": url["url"], "Title": title, "Content": content, "Author":author, "Time":time})
return [{"Urls": lstA, "Data": data}]#将数据返回给框架,由框架处理
except Exception as e:
print (e)
框架集成了常用的抽取方法,通常的抽取毫无压力。那么抽取出的数据放在哪里了呢?默认的情况是存放在同级目录的文件夹data下面,格式为json,如下图所示
存储为文本实在是太简单了,基本不能用在生产环境。是的,框架还提供了其他的存储方式。框架默认使用sqlite存储链接数据和页面信息,用json存储抽取出的详情信息。如果想使用其他方式存储,可以像下面这样做
from simplified_scrapy.core.redis_urlstore import RedisUrlStore
url_store = RedisUrlStore(name,{'host':'127.0.0.1','port':6379})
from simplified_scrapy.core.mongo_urlstore import MongoUrlStore
url_store = MongoUrlStore(name,{"multiQueue":True})
from simplified_scrapy.core.mongo_objstore import MongoObjStore
obj_store = MongoObjStore(name,{'host':'127.0.0.1','port':27017})
from simplified_scrapy.core.mongo_htmlstore import MongoHtmlStore
html_store = MongoHtmlStore(name)
框架还提供了mongodb,redis的存储方式,如果这些都满足不了需要,可以自己实现不同的存储方式。
对于页面的存储,需要实现下面几个方法
def popHtml(self,state=0):
def saveHtml(self,url,html):
def updateState(self,id,state):
链接数据的存储,需要实现下面的方法
def popUrl(self):
def getCount(self):
def checkUrl(self,url):
def saveUrl(self, urls,i=None):
def resetUrls(self, urls):
详情信息的存储,需要实现下面的方法
def saveObj(self, data):
下面是一个完整的例子:
from simplified_scrapy.core.spider import Spider
class ScrapydSpider(Spider):
name = 'scrapyd-spider'
start_urls = ['http://www.scrapyd.cn/']
# models = ['auto_main','auto_obj']
def urlFilter(self,url):
return url.find('/jiaocheng/')>0# 只采集教程数据
# from simplified_scrapy.core.mongo_objstore import MongoObjStore
# obj_store = MongoObjStore(name,{'host':'127.0.0.1','port':27017})
# from simplified_scrapy.core.mongo_urlstore import MongoUrlStore
# url_store = MongoUrlStore(name,{"multiQueue":True})
# from simplified_scrapy.core.mongo_htmlstore import MongoHtmlStore
# html_store = MongoHtmlStore(name)
def extract(self, url, html, models, modelNames):
try:
html = self.removeScripts(html)# 去掉脚本数据,也可以不去
lstA = self.listA(html,url["url"])#抽取页面中的链接
data = []
ele = self.getElementByTag("h1",html)#取标题
if(ele):
title = ele.text
ele = self.getElementByClass("cont",html,"")#取正文
if(ele):
content = ele.html
ele = self.getElementsByTag("span",html,'class="title-2"','class="cont"')#取作者和时间
author = None
time = None
if(ele and len(ele)>1):
time = ele[0].text
author = ele[1].text
data.append({"Url": url["url"], "Title": title, "Content": content, "Author":author, "Time":time})
return [{"Urls": lstA, "Data": data}]#将数据返回给框架,由框架处理
except Exception as e:
print (e)
from simplified_scrapy.simplified_main import SimplifiedMain
SimplifiedMain.startThread(ScrapydSpider())#启动爬虫
对于一般的爬取需求,上面的功能基本够用了。但是如果一次只能启动一个爬虫,就太不方便管理了。是的,还有另一种组织方式。你可以把所有爬虫放在一个文件夹里(比如spiders),使用配置文件进行配置,配置文件名称默认为:setting.json。
{
"spiders":[
{"file":"spiders.scrapydSpider","class":"ScrapydSpider"}
]
}
然后在任意python文件中执行下面的方法,启动爬虫
from simplified_scrapy.simplified_main import SimplifiedMain
SimplifiedMain.startThread()
这种方式启动,只有在配置文件中配置了的爬虫才会被执行。
差不多到这里,这个框架是不是简单又好用:)
框架的安装:
pip install simplified-scrapy
如果是Python2,还需要安装futures
pip install futures
例子源码:https://download.csdn.net/download/dabingsou/11958062