[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 ...
随机推荐
- Codeforces Beta Round #62 题解【ABCD】
Codeforces Beta Round #62 A Irrational problem 题意 f(x) = x mod p1 mod p2 mod p3 mod p4 问你[a,b]中有多少个数 ...
- pip install使用豆瓣源
这个是老问题了 pip install -i https://pypi.douban.com/simple/ selenium 类似的,npm和gem安装的时候可以使用淘宝源.
- 转:windows下多线程通信方法
多线程知识简介 同一进程中可以包含多个线程,由于进程中的多个线程可以共享进程中的资源,所以使同一进程中的多个线程之间通信相对比较简单. 当需要有多个线程来访问一个全局变量时,通常我们会在这个全局变量前 ...
- [原创]自定义BaseAcitivity的实现,统一activity的UI风格样式
在开发过程中经常遇到多个activity是同一种样式类型的情况,如果分别对其进行UI的布局,不但比较繁琐,而且后续维护过程人力成本很高,不利于敏捷开发.解决的方案是采用抽象后的BaseActi ...
- 【书单】book list
正在看: [泡沫经济学].(日)野口悠纪雄 数学模型--姜启源 R in action Programming with R Scrapy Parallel R 准备看: Advanced.A ...
- (笔记)Linux内核学习(十)之虚拟文件系统概念
虚拟文件系统 虚拟文件系统:内核子系统VFS,VFS是内核中文件系统的抽象层,为用户空间提供文件系统相关接口: 通过虚拟文件系统,程序可以利用标准Linux文件系统调用在不同的文件系统中进行交互和操作 ...
- CORS Cookie,和nodejs中的具体实现
CORS(跨来源资源共享协议),高级浏览器(Chrome,firefox, opera, safir, ie10)在 XMLHttpRequest(AJAX) 中已经支持了这个协议.可以实现ajax跨 ...
- 华为 HG8245C 光猫 修改无线用户数限制+hw_ctree.xml 文件解密
这个操作方法是 从网上其他人提供的方法 和我一个朋友总结出来的,我只是负责整理,并实地在我自己的光猫上操作成功了 风险提示 :刷机有风险,操作需谨慎, 备份备份备份! 俺家,俺的新家是电信光纤接入, ...
- 跟随标准与Webkit源码探究DOM -- 获取元素之getElementsByTagName
按照标签名获取元素 -- getElementsByTagName 标准 DOM 1在Element和Document两个interface中均有定义,原型NodeList getElementsBy ...
- 解决php中echo出来的汉子乱码
问的人太多了,就列出来展示给大家! 需要了解的概念: Content-Type:用于定义用户的浏览器或相关设备如何显示将要加载的数据,或者如何处理将要加载的数据 MIME:MIME类型就是设定某种扩展 ...