设为首页 加入收藏

TOP

通过亚马逊电影评论的数据包抓取电影名称---Perl多线程同步及DBI编程(二)
2015-11-21 01:40:21 来源: 作者: 【 】 浏览:1
Tags:通过 亚马逊 电影 评论 数据 包抓取 名称 ---Perl 线程 同步 DBI 编程
构,整个栈法的结构大概如下图所示:
滑窗法的实现相对复杂一点,但是用户是最广的,复杂到波普分析之中的滑窗算法,到TCP协议栈中的TCP滑窗包处理,在perl的多线程实现中使用滑窗法的结构大概如下图所示:
使用滑窗法可以从以下几个方面相对栈法进行改进:
?
a. 防止有某一个线程阻塞,夸张假设有一个线程等待函数调用返回而阻塞的,而其他线程没有阻塞的情况下,会导致图中的“窗宽越来越大”,处理的数据高度不同步,再假设有若干个线程“永远“阻塞的情况下,会使得线程池中的线程越来越小,线程上限不变的情况下阻塞死的线程越多则实际工作的线程数量就越少。
?
b. 在滑窗法的支持下,可以实现多线程同步写入文件这个过程!(什么?多线程同步写入文件多简单?这还用讲?)其实,实践之后就会发现,perl中的多线程共享变量:shared是不可以给文件句柄使用的,所以在perl中同时处理文件的应该是这样实现的,多线程时设置共享一个数组/哈希结构,在多线程代码调用的时候,对一个全局共享的数组/哈希结构进行增删处理,然后单独设立一个处理一个数据结构的线程(最好是主线程)来进行文件IO操作。
?
2.分段法实现多线程并行
?
这种方法的原理也非常清晰,就是将数据结构(一般按长度)拆分为若干个小型的数据结构,每一个线程创建的时候接收到的参数,就是这个分段后的数据组,然后分别对其进行处理,原理大致如下所示:
与之前算法不同的是,分段法过程"不存在循环",我们要做的事将整个数据分好的段直接交付给线程,线程创建之后就直接进入阻塞等待线程结束的join方法。
?
(3)Perl正则匹配HTML
?
这里应该是perl开发学习者用起来应该最有底气的一段,大多数情况下解析静态HTML文档的过程是将HTML代码解析为树节点,然后进行一次遍历找到符合条件的节点。这种方法在perl中应该使用HTML::TreeBuilder模块,一次简单的代码实现如下:
?
上述代码中的每个树节点都是一个哈希引用,其中的'_tag'键代表该标签的名字,而'_content'键是代表这个标签包夹的内容,另外有'attr'代表标签的属性,也是一个哈希引用,具体使用这里也不详谈。
?
对于本次任务目标,目前我想到最好的办法是抓取下的中的一个
标签,既然我们使用的是perl,何必麻烦?直接匹配正则吧!
?
抓取movies.txt中的productId /.+productId:\s+(\S+) /x
?
抓取一个粗略的电影名字的范围 /
?
有的电影名字前面可能多一个前缀'Amazon.com:'也可能有个后缀'[VHS]' ?/Amazon.com:\s*(.*?):/ ? /(.*?)\s*\[VHS\]/?
?
由于perl对于正则的强大支持,几乎每一份html是几毫秒就可以分析得到,最后可以几乎可以完满在亚马逊的电影商品中抓取到电影名字。
?
运行结果及效率分析
?
1. 不知为何在windows上跑perl脚本的速度远远慢于在linux上的速度,Linux上执行差不多可以节约5到6倍的时间,可能是因为windows对于多线程的支持不够全面吧?
?
2. 在实践中,我使用的是栈法实现多线程并行,这样平均2~3分钟可以处理完1000个的URL-HTTP请求。
?
3. 在多线程中使用LWP::Simple模块的get方法的时候会报一个can't locate object method '_uric_escape'..报错(大概字面上是这样),解决的办法其实目前没有的,根本原因还是LWP::Simple模块对于多线程的支持不够理想,但是补救的办法有一个,也是在google上 论坛深处发现的--在创建线程方法之前加一句'sleep 1'语句就可以让这个错误消失!
首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Base: 一种 Acid 的替代方案 下一篇索引修改内幕

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: