[Perl]抓取个人的所有闪存+格式化保存为文本
以下代码保存为utf8文本格式
环境:ActivePerl v5.16 built for MSWin32-x86
两个要调整的地方:
for my $i (17..45) { 这里改成自己对应的页码,比如发了30页的闪存,就改成1..30
还有就是这部分改成自己对应的ID和密码,中文ID还未测试过
tbUserName=>"ID",
tbPassword=>"密码",
抓取的结果参考截图:

=info
code: vicyang
mail: @.com
date: --
=cut #!/usr/bin/perl
use v5.;
use strict;
use utf8;
use Encode;
use IO::Handle;
use LWP::UserAgent;
binmode(STDOUT, ":encoding(gbk)");
STDOUT->autoflush();
my $ua = LWP::UserAgent->new;
$ua->cookie_jar( {} ); my $randserial=getRandHex();
my $response = $ua->get(
'http://passport.cnblogs.com/BotDetectCaptcha.ashx?get=image&c=c_login_logincaptcha&t='.$randserial
); print "$randserial\n"; if ($response->is_success) {
# 抓取验证码图片 #
open my $check_code_image, "> verifycode.BMP" #默认验证图片的位置在当前目录
or die "$!"; binmode($check_code_image);
print $check_code_image $response->content;
close $check_code_image; #关闭print对句柄的控制
system("start verifycode.BMP");
} else {
print "wrong\n";
} print "please input verifycode:";
my $inp=<STDIN>;
$inp=~s/\r?\n$//; print "[$inp]\n"; my $res= $ua->post('http://passport.cnblogs.com/login.aspx?ReturnUrl=http://home.cnblogs.com/ing/',
[
__EVENTTARGET=>"",
__EVENTARGUMENT=>"",
__VIEWSTATE=>"/wEPDwUKLTM1MjEzOTU2MGQYAQUeX19Db250cm9sc1JlcXVpcmVQb3N0QmFja0tleV9fFgEFC2Noa1JlbWVtYmVy4b/ZXiH+8FthXlmKpjSEgi7XBNU=",
__VIEWSTATEGENERATOR=>"C2EE9ABB",
__EVENTVALIDATION=>"/wEdAAYIqCk3Gcmu25zI9fQWqoC7hI6Xi65hwcQ8/QoQCF8JIahXufbhIqPmwKf992GTkd2Mxo6xcg+Ng5CZxsqMUGnVMKtTyqevv9cjRp4Oh+9VMaKeKEbp39eHc9mbdvkCgxCM74oSoIAJofLsQdCCbtmog/0fDw==",
tbUserName=>"改成自己的ID",
tbPassword=>"改成自己的密码",
chkRemember=>"on",
LBD_VCID_c_login_logincaptcha=>$randserial,
LBD_BackWorkaround_c_login_logincaptcha=>,
CaptchaCodeTextBox=>$inp,
btnLogin=>"登++录",
#txtReturnUrl=>"http://home.cnblogs.com/u/paktc/"
],
); my $fh;
our $main='http://home.cnblogs.com/ing';
our $limit=;
my $all;
my @ech; for my $i (..) {
print STDOUT "Code: $i\n"; open $fh, ">:encoding(gbk)", "ing$i.txt";
select $fh;
$fh->autoflush();
$res = $ua->get("http://home.cnblogs.com/u/paktc/feed/$i.html") or warn "$!"; unless ($res->is_success) {
print "wrong\n";
} $all=$res->content;
@ech=($all=~/GetIngRecentComments\((\d+)/gi); for (@ech) {
&getDetail($_);
} close $fh;
}
print STDERR "over";
<STDIN>; sub getDetail {
our $main;
our $limit;
my $pagecode=shift;
$res = $ua->get($main."/".$pagecode) or warn "$!";
my @all=split(
/\r?\n/,
decode('utf8', $res->content)
); my (
$p_time, $message,
$comment_count,
$comment_author,
$comment_text,
$comment_time
); for (my $i=; $i<=$#all; $i++)
{
if ($all[$i]=~/\d+-\d+-\d+ \d+:\d+$/)
{
$p_time=$&;
print "\n$p_time\n";
}
if ($all[$i]=~/ing_detail_body">(.*)/i)
{
$message=$1;
while (not $message=~s/<\/div>//i) {
$message .= $all[++$i];
}
#case <div id="ing_detail_body"><a href="/ing/tag/..." class="ing_tag">[组图]</a>
# [标签]
$message=~s/<a href=".*class="ing_tag">([^<]+)<\/a>/$/i;
#case 幸运闪 其他情况还未考虑
$message=~s/<img src=.*alt="([^"]+)" title=".*"\/>/☆/i;
#case 链接
$message=~s/<a href="([^"]+)" .*<\/a>/<$>/gi; &charResume(\$message); #必须传入一个引用,否则会崩溃 my @msg=splitText2($message, $limit, );
print " ", "┈"x($limit/), "\n";
print decode('gbk', join("", @msg));
print " ", "┈"x($limit/), "\n"; print STDOUT decode('gbk', join("", @msg)), "\n";
}
if ($all[$i]=~/ing_comment_count">(.*)(<\/div>)?/i)
{
$comment_count=$1;
}
if ($all[$i]=~/comment_author_.*ing\/">(.*)<\/a>/)
{
$comment_author = $;
($comment_text = $all[$i+]) =~ s/^ +//;
$comment_text =~s/<a href="([^"]+)" .*<\/a>/<$1>/gi; #替换链接
&charResume(\$comment_text); $all[$i+2] =~/(\d+-\d+-\d+ \d+:\d+)/;
$comment_time = $1;
printf(" <%s> ", $comment_author);
my $name_length = length(encode('gbk', $comment_author))+7; #length " <%s> "
my @msg = splitText2($comment_text, ($limit - $name_length), 0);
print decode('gbk', shift @msg); for (@msg) {
print " "x$name_length . decode('gbk', $_);
}
print "\n"; $i+=2;
}
}
} sub splitText2 {
my ($text, $limit, $indent) = @_;
my ($a, $b, @arr); $b = encode('gbk', $text);
while (length($b) > $limit) {
($a, $b) = &cut_gbk($limit, $b);
push (@arr, " "x$indent . $a ."\n");
}
# At last
push (@arr, " "x$indent . $b ."\n"); return @arr;
} sub cut_gbk {
my ($limit, $gstr) = @_;
my $i;
my $cut = 0;
my $gstr_a;
my $gstr_b;
foreach $i (
split("", decode('gbk', $gstr))
) {
if (ord($i) < 128) {
$cut+=1;
} else {
$cut+=2;
}
if ($cut >= $limit) {
$gstr_a = substr($gstr, 0, $cut);
$gstr_b = substr($gstr, $cut);
last;
}
}
return ($gstr_a, $gstr_b);
} sub charResume {
#传入unicode格式的字符串
my $ref = shift;
my $char;
my $count=0;
${$ref}=~s/\</</gi;
${$ref}=~s/\>/>/gi;
${$ref}=~s/\"/"/gi;
${$ref}=~s/\ / /gi;
${$ref}=~s/\ / /gi;
${$ref}=~s/\&/\&/gi;
${$ref}=~s/\&/\&/gi;
while (${$ref}=~/\&#(\d+);/) {
$count++;
$char=chr($);
${$ref}=~s/\&#$1;/$char/g;
if ($count > ) {
print STDOUT "DEEP LOOP \n";
sleep 1.0;
exit;
}
} } sub getRandHex {
my $str="";
for my $i ( .. $_[]) {
$str .= sprintf("%x", int(rand()));
}
return $str;
}
[Perl]抓取个人的所有闪存+格式化保存为文本的更多相关文章
- HttpClients+Jsoup抓取笔趣阁小说,并保存到本地TXT文件
前言 首先先介绍一下Jsoup:(摘自官网) jsoup is a Java library for working with real-world HTML. It provides a very ...
- mysql perl 抓取update语句
<pre name="code" class="html"><pre name="code" class="ht ...
- 使用 Charles 抓取 App 网络请求
最近开发App的时候需要用到大量其他应用的数据,但接口不公开,所以想到了抓取.差不多要读到5W的用户数据,采用的是找到数据接口,然后不停发请求的方式.用到的抓取工具是Charles,本文讲解的应用是W ...
- 制作bat脚本,抓取Android设备logcat
::bat制作抓取Android设备的logcat,并保存以时间命名的txt文件至设备目录 1 @ECHO off adb wait-for-device ECHO 正在连接设备 adb logcat ...
- 使用JavaCV/OpenCV抓取并存储摄像头图像
http://blog.csdn.net/ljsspace/article/details/6702178 分类: 图形图像(3) 版权声明:本文为博主原创文章,未经博主允许不得转载. 本程序通过 ...
- TCPdump指定时间或者指定大小进行循环抓取报文
背景:我们用tcpdump工具循环抓取网卡上的报文,我们会遇到如下情况: 1. 抓取报文后隔指定的时间保存一次: 2. 抓取报文后达到指定的大小保存一次: 本文就这两种情况给出tcpdump的使用方法 ...
- windows中抓取hash小结(下)
书接上回,windows中抓取hash小结(上) 指路链接 https://www.cnblogs.com/lcxblogs/p/13957899.html 继续 0x03 从ntds.dit中抓取 ...
- [工具开发] Perl 爬虫脚本--从美国国家漏洞数据库抓取实时信息
一.简介 美国国家漏洞数据库收集了操作系统,应用软件的大量漏洞信息,当有新的漏洞出现时,它也会及时发布出来. 由于信息量巨大,用户每次都需要到它的网站进行搜索,比较麻烦.如果能有个工具,每天自动分析它 ...
- windows环境下nutch2.x 在eclipse中实现抓取数据存进mysql详细步骤
nutch2.x 在eclipse中实现抓取数据存进mysql步骤 最近在研究nutch,花了几天时间,也遇到很多问题,最终结果还是成功了,在此记录,并给其他有兴趣的人提供参考,共同进步. 对nutc ...
随机推荐
- jackson json转实体 com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException
jackson 2.2.2 由于vo中缺少json的某个字段属性引起 2种解决方法 1:vo中添加注解@JsonIgnoreProperties(ignoreUnknown = true) 2. m ...
- 转:如何学习javascript
ps:每过一段时间就会发觉自己懂的越来越少,打开编辑器的时候不知道从何入手.兴许是过于急于求成,总没有系统地去对这门语言进行学习,囫囵吞枣,只想着能够解决工作需求.是时候让自己重新出发,从零开始,一页 ...
- 修改maven一更新jre就变成1.5版本
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> ...
- [知识库分享系列] 二、.NET(ASP.NET)
最近时间又有了新的想法,当我用新的眼光在整理一些很老的知识库时,发现很多东西都已经过时,或者是很基础很零碎的知识点.如果分享出去大家不看倒好,更担心的是会误人子弟,但为了保证此系列的完整,还是选择分享 ...
- Windows 64位 安装Oracle instantclient 官方绿色版和PL/SQL Developer 总结
原文: http://blog.csdn.net/kimsoft/article/details/8751267 操作系统:Windows 7 64位旗舰 要求,安装PL/SQL Developer用 ...
- hdu1251在词典里统计前缀出现的个数
banana band bee absolute acm ba b band abc #include<iostream> using namespace std; //数据结构 s ...
- 在SpringMVC中获取request对象的几种方式
1.最简单的方式(注解法) @Autowired private HttpServletRequest request; 2.最麻烦的方法 a. 在web.xml中配置一个监听 <listene ...
- 解决CSS移动端1px边框问题
移动项目开发中,安卓或者IOS等高分辨率屏幕会把1px的border渲染成2px来显示,网上搜了一下,解决方法如下: 一.利用css中的transform的缩放属性解决,推荐这个.如下面代码. < ...
- Mvc 拼接Html 导出 Excel(服务器不用安装呦!支持2007以上版本)
新公司,新接触,老方法,更实用. 之前接触过Webform,winfrom 的导出Excel方法 ,优点:省事.缺点:服务器必须安装Office 这几天做项目 和 大牛学习了一下 新的方法,自己加以总 ...
- iOS开发-NSDate使用
时间戳是自 1970 年 1 月 1 日(00:00:00 GMT)至当前时间的总秒数.它也被称为 Unix 时间戳(Unix Timestamp). 下面是iOS中时间戳 与 时间之间的转换方法: ...