爬虫Scrapyd服务器的技术注意点,以及部署笔记

不知道如何开头,涉及的技术点比较多,本篇笔记罗列一些我遇到的问题。方便未来回忆。 年纪长了,感觉学得快忘得更快。。。

真实的 后端爬虫前端页面 站点,应该是通过数据库 共享数据,爬虫PUT数据,网站GET数据。但是两边读写数据库谈不上麻烦,加上只是技术验证,所以这部分就省略了

直接通过爬虫的参数传入 然后通过LOG输出,网页端分析这个LOG实现数据获取。

—————————————————–

1,安装一个Scrapyd到服务器。

一般开发环境使用pip来安装这个服务器,当然商用环境也可以,但是为了方便以及更贴近大规模部署,使用Docker

A,一般安装方式

我有点忘了,似乎PIP还是Easy_install就行了。相当简单,本地开发这个足够了,甚至开发小朋友都不需要了解Scrapyd或者说,不想了解。。。哈哈。

B,Docker安装方式

在Dockerhub上面用Scrapyd查一下,有很多个镜像,随便拉一个下来就能用。比如:

docker run -p 6800 zaim/scrapyd

如果你想保存数据到宿主机 机上-v参数,需要修改端口修改 -p端口,it’s easy。

docker run -d -p 6801:6800 -v /root/scrapyd/lib:/var/lib/scrapyd -v /root/scrapyd/log:/var/log/scrapyd zaim/scrapyd

其实在公网暴露这个端口绝对不是一个好主意,谁都可以部署爬虫到你的站点,并且你要知道执行爬虫,那就是有执行权限,可以RUN的。所以建议只暴露到本地,当然开发过程公网是OK的。

docker run -d -p 127.0.0.1:6800:6800 -v /root/scrapyd/lib:/var/lib/scrapyd -v /root/scrapyd/log:/var/log/scrapyd zaim/scrapyd

这样只能本机调用,用localhost,或者127.0.0.1调用爬虫API,你甚至可以做个站点来维护这个接口,加上你需要的权限验证等等。ScrapydCloud那个收费版估计就这么搞的。

最后,通过访问6800确认服务正确安装,能访问就OK。


2,部署一个爬虫到Scrapyd服务器

本地一般使用Scrapyd-client实施Deploy,商用环境一般通过API给个鹅蛋eggs部署爬虫

A,传统方式(Client工具)

scrapyd-deploy 项目名 -p 爬虫名

B,API方式。

包括 爬虫 egg 蛋的制作 还有 通过API部署爬虫egg 以及注意点

a,制作蛋

    需要根据python安装Setuptools,比如我的环境要 setuptools-0.6c11.win32-py2.7 这个东东。然后编辑Setup.py文件,网上有很多例子,省略。重要的是一定要有这句话

    entry_points={'scrapy': ['settings = 目录(项目)名.settings']},

这句话告诉Scraypd这叫啥项目,在那个目录里面去找爬虫的Settings文件,没有这句调用addversion API回返错。

    最后,执行 python setup.py bdist_egg 生成部署包(egg)

b,部署蛋(egg)

curl http://localhost:6800/addversion.json -F project=项目名 -F version=版本号 -F [email protected]全名称

注意点

首先,包要在当前目录,要让curl命令能找到这个东西来发请求

其次,版本号用于更新,scrapyd会自动拿最新的爬虫执行。数字即可。

最后,通过访问6800站点,查看确认是否部署到位

3,开发注意点

A,Logger的使用

可能只是一个BUG,也可能是我搞错了,只要爬虫中通过Imort logging 生成的Log似乎都不在LOG文件中出现,试过各种,只有用爬虫自己的Log才有效。

self.log('Well, here is an Item: %s.' % self.Msg)

用下面这两种,经过实验都没不会再Scrapyd的LOG中输出,不知为何,只是备注一下。

import logging
logging.warning("This is a warning")
或者
logger = logging.getLogger('demolog')
self.logger.info('URL : %s' % self.Msg)

B,向爬虫传递参数

写好个爬虫,比如解析特定网页,这个网页需要想爬虫传入,我就用这个方式

   def __init__(self, PARA=None, *args, **kwargs):
   #这个PARA就是参数名

使用的时候可以通过CURL命令 -d来传入

curl http://IPADDRESS:6800/schedule.json -d project=项目名 -d spider=爬虫名 -d PARA=内容

因为是POST请求,在JAVA端封一个也是很简单的

        	String url = "http://IPADDRESS:6800/schedule.json";
    		HttpPost post = new HttpPost(url);
    		// 添加请求头
    		post.setHeader("User-Agent", USER_AGENT);
    		List<NameValuePair> urlParameters = new ArrayList<NameValuePair>();
    		urlParameters.add(new BasicNameValuePair("project", "项目名"));
    		urlParameters.add(new BasicNameValuePair("spider", "爬虫名"));
    		urlParameters.add(new BasicNameValuePair("PARA", 传入内容));
    		post.setEntity(new UrlEncodedFormEntity(urlParameters));

    		HttpResponse response = httpclient.execute(post);

以上,10.1假期第二天的调查内容。。。记录完毕。