byunix的个人博客分享 http://blog.sciencenet.cn/u/byunix

博文

最近在写定制化爬虫程序,总结下需要解决的几大问题

已有 4085 次阅读 2017-11-5 01:43 |系统分类:科研笔记

写爬虫还是比较好玩的,本准备用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库函数太爽了



https://blog.sciencenet.cn/blog-3334082-1083828.html

上一篇:希腊字母读音表
收藏 IP: 171.217.0.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-4 11:25

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部