|
写爬虫还是比较好玩的,本准备用python写的,考虑到重新学的时间暂时花费不起,学完得折腾半个月, 还是用java写。java非常熟悉,程序已经跑了1多月了,抓取速度刚刚的。
首先,静态网页抓取找个开源的成熟爬虫项目抓就是了,没必要自己写
其次,开源成熟爬虫项目可以满足你99%的需求,包括js脚本自动解析等等
再者,自己写爬虫大部分是定制化解决99%以外很难抓取的网站数据,很强的反爬能力,封ip,验证码, 动态加载,加密cookie,甚至涉及到返回数据加密,各种翻页限制等等,我这里就必须自己动手写个定制化爬虫,没办法。写也快,几天就可以跑了,后面是修修补补代码。
写爬虫涉及到以下几个问题需要解决:
1、多线程,java多线程很简单,直接用ExecutorService
2、下载数据本地校验,保证数据正确性,源数据要是加密的反而是好事(管他是base64还是各种加密算法,只要能知道怎么加密解密的就行)
3、代理ip池。1、免费可以使用开源项目(当然你还得对开源项目改代码做增强满足自己ip数量需求)搭建服务器抓取各大代理网站公布的代理ip,并进行可用性baidu验证(检测request http200状态+request下载内容内含tieba 字符串,python代码如下),基本可以维持在4000-5000个ip可用;2、收费直接购买,但还得进行可用性验证。好羡慕别人有10万可用代理池,我这4000-5000感觉不够用。PS:github 有几个python的代理ip池比较好用。
# noinspection PyPep8Naming
def validUsefulProxy(proxy):
"""
检验代理是否可用 http 200状态的代理不一定可用,还得检查下载的内容里面包含某个字符串不(我这里检查有没有tieba字符串)
:param proxy:
:return:
"""
if isinstance(proxy, bytes):
proxy = proxy.decode('utf8')
proxies = {"http": "http://{proxy}".format(proxy=proxy)}
try:
# 超过20秒的代理就不要了
r = requests.get('http://www.baidu.com', proxies=proxies, timeout=20, verify=False)
if r.status_code == 200:
if "tieba" in str(r.text):
#print("ok")
"""logger.info('%s is ok' % proxy)"""
return True
else:
#print("%s no" % proxy)
return False
except Exception as e:
"""logger.debug(e)"""
return False
4、下载的数据到底用文件还是各种数据库存储(mongodb、redis、mysql),数据量小的时候,文件存储没啥问题,数据量大了的时候,普通机械硬盘读取吃力(尤其是<4k的小文件,还有重启任务,读取旧数据),可以考虑256g以上的ssd硬盘,绝对读取速度爽(小文件大文件速度能达到500Mb/s)。数据量大了还是得用数据库。
5、(机器数量只有1 台,没机器实现分布式)分布式爬虫任务分配,单机器受到cpu和内存的限制,以及tcp/ip连接数限制,即使再好的单独机器,在内存(16g以上)和网络链接数量上都没有分布式好,分布式需要redis分配各个机器各自的任务, 最后每个机器下载的数据要做数据库合并。
6、(每天数据自动化爬虫暂时未做,还在纠结历史数据不全中)历史数据可以一次性爬好,但是新的数据得做每天自动化爬虫工作,这个还是比较简单,做每天定时任务就是了,改改代码适合自动化就是了,关键还是历史数据如何快速抓取。
最后推荐大家还是用python写爬虫程序,简单,代码数量比java少多了,python 10多行可以搞定的java要写几十行甚至上百行,再者python有很多成熟的库函数,比如验证码识别、 动态加载,解密数据等等,有空我得学学成python高手。python在爬虫上比起java库函数太爽了
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-25 22:40
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社