不知道如何开头,涉及的技术点比较多,本篇笔记罗列一些我遇到的问题。方便未来回忆。 年纪长了,感觉学得快忘得更快。。。
真实的 后端爬虫前端页面 站点,应该是通过数据库 共享数据,爬虫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 egg=@egg全名称
注意点
首先,包要在当前目录,要让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假期第二天的调查内容。。。记录完毕。