运行webmagic 模拟登录里面的例子输出怎么是空的

写了多年的程序,鲜有产出物,于是最近打算做个不可说的东西来祭奠逝去的青春。数据,是一个程序的起点,我们没有数以亿计的用户,无法让活跃用户给我们产生数据,那就只能去别人的站点上借点数据了。这个功能一般我们称之为爬虫。
首先我们确认语言选用Java,接下去是框架选择,因为是自己玩的项目,也不需要去分析太多的优劣,我们要的是一个比较简单快捷的方案,于是就拍脑袋敲定web magic了。
webmagic 的目标
一般来说,一个爬虫包括几个部分:
页面下载是一个爬虫的基础。下载页面之后才能进行其他后续操作。
一般爬虫都会有一些初始的种子URL,但是这些URL对于爬虫是远远不够的。爬虫在爬页面的时候,需要不断发现新的链接。
最基础的URL管理,就是对已经爬过的URL和没有爬的URL做区分,防止重复爬取。
内容分析和持久化
一般来说,我们最终需要的都不是原始的HTML页面。我们需要对爬到的页面进行分析,转化成结构化的数据,并存储下来。
不同的爬虫,对这几部分的要求是不一样的。
对于通用型的爬虫,例如搜索引擎蜘蛛,需要指对互联网大部分网页无差别进行抓取。这时候难点就在于页面下载和链接管理上–如果要高效的抓取更多页面,就必须进行更快的下载;同时随着链接数量的增多,需要考虑如果对大规模的链接进行去重和调度,就成了一个很大的问题。一般这些问题都会在大公司有专门的团队去解决,比如这里有一篇来自淘宝的快速构建实时抓取集群。对Java来说,如果你要研究通用爬虫,那么可以看一下heritrix或者nutch。
而垂直类型的爬虫要解决的问题则不一样,比如想要爬取一些网站的新闻、博客信息,一般抓取数量要求不是很大,难点则在于如何高效的定制一个爬虫,可以精确的抽取出网页的内容,并保存成结构化的数据。这方面需求很多,webmagic就是为了解决这个目的而开发的。
webmagic的模块划分
Spider类-核心调度
Spider.create(sinaBlogProcessor)
.scheduler(new FileCacheQueueScheduler(&/data/temp/webmagic/cache/&))
.pipeline(new FilePipeline())
.thread(10).run();
Spider的核心处理流程非常简单,代码如下:
private void processRequest(Request request) {
Page page = downloader.download(request, this);
if (page == null) {
sleep(site.getSleepTime());
pageProcessor.process(page);
addRequest(page);
for (Pipeline pipeline : pipelines) {
pipeline.process(page, this);
sleep(site.getSleepTime());
Downloader-页面下载
页面下载是一切爬虫的开始。
大部分爬虫都是通过模拟http请求,接收并分析响应来完成。这方面,JDK自带的HttpURLConnection可以满足最简单的需要,而Apache HttpClient(4.0后整合到HttpCompenent项目中)则是开发复杂爬虫的不二之选。它支持自定义HTTP头(对于爬虫比较有用的就是User-agent、cookie等)、自动redirect、连接复用、cookie保留、设置代理等诸多强大的功能。
webmagic使用了HttpClient 4.2,并封装到了HttpClientDownloader。学习HttpClient的使用对于构建高性能爬虫是非常有帮助的,官方的Tutorial就是很好的学习资料。目前webmagic对HttpClient的使用仍在初步阶段,不过对于一般抓取任务,已经够用了。
下面是一个使用HttpClient最简单的例子:
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(&http://youhost/xxx&);
HttpResponse httpResponse = httpClient.execute(httpGet);
System.out.println(EntityUtils.toString(httpResponse.getEntity().getContent()));
对于一些Javascript动态加载的网页,仅仅使用http模拟下载工具,并不能取到页面的内容。这方面的思路有两种:一种是抽丝剥茧,分析js的逻辑,再用爬虫去重现它(比如在网页中提取关键数据,再用这些数据去构造Ajax请求,最后直接从响应体获取想要的数据);
另一种就是:内置一个浏览器,直接获取最后加载完的页面。这方面,js可以使用PhantomJS,它内部集成了webkit。而Java可以使用Selenium,这是一个非常强大的浏览器模拟工具。考虑以后将它整理成一个独立的Downloader,集成到webmagic中去。
一般没有必要去扩展Downloader。
PageProcessor-页面分析及链接抽取
Selector是webmagic为了简化页面抽取开发的独立模块,是整个项目中我最得意的部分。这里整合了CSS Selector、XPath和正则表达式,并可以进行链式的抽取,很容易就实现强大的功能。即使你使用自己开发的爬虫工具,webmagic的Selector仍然值得一试。
例如,我已经下载了一个页面,现在要抽取某个区域的所有包含&blog&的链接,我可以这样写:
//content是用别的爬虫工具抽取到的正文
String content = &blabla&;
List&String& links = Html.create(content)
.$(&div.title&)
//css 选择,Java里虽然很少有$符号出现,不过貌似$作为方法名是合法的
.xpath(&//@href&)
//提取链接
.regex(&.*blog.*&) //正则匹配过滤
.all(); //转换为string列表
另外,webmagic的抓取链接需要显示的调用Page.addTargetRequests()去添加,这也是为了灵活性考虑的(很多时候,下一步的URL不是单纯的页面href链接,可能会根据页面模块进行抽取,甚至可能是自己拼凑出来的)。
Scheduler-URL管理
URL管理的问题可大可小。对于小规模的抓取,URL管理是很简单的。我们只需要将待抓取URL和已抓取URL分开保存,并进行去重即可。使用JDK内置的集合类型Set、List或者Queue都可以满足需要。如果我们要进行多线程抓取,则可以选择线程安全的容器,例如LinkedBlockingQueue以及ConcurrentHashMap。
因为小规模的URL管理非常简单,很多框架都并不将其抽象为一个模块,而是直接融入到代码中。但是实际上,抽象出Scheduler模块,会使得框架的解耦程度上升一个档次,并非常容易进行横向扩展,这也是我从scrapy中学到的。
在webmagic的设计中,除了Scheduler模块,其他的处理-从下载、解析到持久化,每个任务都是互相独立的,因此可以通过多个Spider共用一个Scheduler来进行扩展。排除去重的因素,URL管理天生就是一个队列,我们可以很方便的用分布式的队列工具去扩展它,也可以基于mysql、redis或者mongodb这样的存储工具来构造一个队列,这样构建一个多线程乃至分布式的爬虫就轻而易举了。
URL去重也是一个比较复杂的问题。如果数据量较少,则使用hash的方式就能很好解决。数据量较大的情况下,可以使用Bloom Filter或者更复杂的方式。
webmagic目前有两个Scheduler的实现,QueueScheduler是一个简单的内存队列,速度较快,并且是线程安全的,FileCacheQueueScheduler则是一个文件队列,它可以用于耗时较长的下载任务,在任务中途停止后,下次执行仍然从中止的URL开始继续爬取。
Pipeline-离线处理和持久化
Pipeline其实也是容易被忽略的一部分。大家都知道持久化的重要性,但是很多框架都选择直接在页面抽取的时候将持久化一起完成,例如crawer4j。但是Pipeline真正的好处是,将页面的在线分析和离线处理拆分开来,可以在一些线程里进行下载,另一些线程里进行处理和持久化。
你可以扩展Pipeline来实现抽取结果的持久化,将其保存到你想要保存的地方-本地文件、数据库、mongodb等等。Pipeline的处理目前还是在线的,但是修改为离线的也并不困难。
webmagic目前只支持控制台输出和文件持久化,但是持久化到数据库也是很容易的。
最后附上代码地址:
还有原作者的blog:
阅读(...) 评论()根据WebMagic写的一个爬取煎蛋网的小爬虫 - 推酷
根据WebMagic写的一个爬取煎蛋网的小爬虫
既然18周岁已经是具有完全民事行为能力的成年人了,如果犯罪,就要负完全的刑事责任了,怎么还不允许结婚?如果不允许结婚,这意味着还不具有完全民事行为能力。
新修订的《人口与计划生育法》将原来第二十五条的“公民晚婚晚育,可以获得延长婚假、生育假的奖励或者其他福利待遇”修改为“符合本法第十八条规定生育子女的夫妻,可以获得延长生育假的奖励或者其他福利待遇”。国家卫生计生委法制司司长张春生在修法后的记者会上表示,目前,我国的初婚年龄约为25岁,初育年龄则约为26岁,针对这种新的生育行为的情况,国家也不再专门鼓励晚婚晚育。
按照原来规定,晚婚假可以在原有的3天婚假基础上延长至10-30天;晚育假在原有的98天产假基础上延长,例如北京、上海延长30天。
我认为,取消相关鼓励晚婚晚育的条款是一个进步。
第一,不应该鼓励晚婚。
我国现行《婚姻法》规定:“结婚年龄,男不得早于22周岁,女不得早于20周岁。”而世界上绝大多数国家的法定婚龄都不超过18岁。2012年3月, 全国人大代表黄细花在“两会”上提交建议,将男性和女性的法定结婚年龄都降至18周岁。
我认为这是有道理的。我国《民法通则》第十一条规定:“十八周岁以上的公民是成年人,具有完全民事行为能力,可以独立进行民事活动,是完全民事行为能力人。” 既然18周岁已经是具有完全民事行为能力的成年人了,如果犯罪,就要负完全的刑事责任了,怎么还不允许结婚? 如果不允许结婚,这意味着还不具有完全民事行为能力。
由于我国现行的法定婚龄已经过高了,所以没有必要再提倡晚婚。
实际上,由于房价居高不下、结婚成本提高、对婚姻的期望值过高、生活和工作压力大等原因,现代人的初婚年龄已经不断提高。例如,统计数据显示,2013年上海市居民初婚年龄为男性30.17岁、女性28.19岁,分别比2012年上升0.17和0.89岁。
第二,不应该鼓励晚育。
从医学上来说, 女性最佳生育年龄为23-29岁 。一对夫妻如果要生两个孩子,女性最好在30岁之前生育二孩。近年来,我国不孕不育症呈上升趋势,这与生育年龄提高有关。我国现在婴儿出生缺陷率较高,而高龄孕育则增加胎儿畸形和夭折风险。
研究表明, 30-34岁女性出现早产风险会提高20%。25-29岁生育者,唐氏综合征婴儿发生率仅为1/岁为1/900;35-39岁则上升到1/300;45岁以上竟达1/40。
《人口与计划生育法》修正案在取消晚婚晚育奖励的同时,规定符合法律法规规定生育的,无论是一孩还是两孩,都可以享有延长生育假的相关奖励,以及其他相关的社会福利,这有利于减轻育龄夫妇养育两个孩子的负担。
事实上,虽然全面二孩政策在2016年元旦正式实施,但对于城市工薪阶层来说,许多年轻夫妇抚养一个孩子已经承受了巨大的经济和生活压力,他们即使想生二孩,但考虑到多抚养一个孩子需要付出很多财力和精力,最终对生二孩望而却步。
因此,需要出台配套的鼓励生育二孩的措施(包括延长生育假),才会让更多的夫妇(尤其是职业女性)敢生二孩。
已发表评论数()
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
没有分页内容
图片无法显示
视频无法显示
与原文不一致C++如何将程序运行的结果通过文件输出?_百度知道
C++如何将程序运行的结果通过文件输出?
提问者采纳
p>用ofstream类;ofstream是命名空间std的;).fout(&x;o。上述例子中fout的用法跟cout完全一致,输出的变量是x;fout&&lt:ofstream&nbsp.txt&quot。例如输出文件的名称是o
提问者评价
其他类似问题
为您推荐:
程序运行的相关知识
其他1条回答
使用ofstream类,创建文件对象,通过文件对象进行流操作
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁}

我要回帖

更多关于 webmagic例子 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信