Perl6 必应抓取(2):最终版
use HTTP::UserAgent;
use URI::Encode; my $ua = HTTP::UserAgent.new(:user-agent<Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/ Firefox/52.0>);
my $bing_url = 'http://cn.bing.com/search?q=';
my $choose = rx/'<cite>'(.*?)'</cite>'/;#要查的内容
my $filename = ~now.DateTime~'.txt';
$filename = do given $filename {S:g/':'/-/};
my $fp = open $filename, :w;
my $hv;
my $all_data; #进度显示 sub MAIN (Int $page_number) {
say '+';
say '=======================================================================';
say ' By: FireC@t';
say '=======================================================================';
#say '';
my $strings = prompt 'Input String You Want: ';
say 'Search : '~$strings;
$all_data = *$page_number;
say 'Data count(10*'~$page_number~') : '~$all_data; #输出数据数目
my $start_time = now.DateTime;
say 'Start Time : '~$start_time;
say '=======================================================================';
$strings = uri_encode($strings);
my $count = ;
for ..$page_number {
#每一页的结果调用函数
my $url_end = '&first='~$count;
my $targeturl = $bing_url~$strings~$url_end;
#say $targeturl;
#调用函数查询结果URL
Bing_search($targeturl);
$count += ;
}
my $end_time = now.DateTime;
say '=======================================================================';
say 'Finish Time : '~$end_time;
say 'Time Use : '~($end_time-$start_time);
say '=======================================================================';
say 'Data save to : '~$filename;
say '=======================================================================';
} #查询函数
sub Bing_search($url) {
my $html = $ua.get($url).content;#获取结果
loop {
$html ~~ $choose;
last if not $; my $swap_ = ~$;
$html = $/.postmatch;
$swap_ = do given $swap_ {S:g/'<strong>'//};
$swap_ = do given $swap_ {S:g/'</strong>'//};
say '('~$hv~':'~$all_data~')'~$swap_;
$hv++;
$fp.say($swap_);
}
}
说明, 在dos下输入中文, 因为终端编码问题, 程序会报错。
在linux下运行正常, 或dos下设置编为utf8。
用法:
> perl6 bing_s.p6 这里的参数 10为页数, 可随意更改。


BUG:
如果bing中的结果只有 100 条, 而我们向他取 1000 条, 这时我们会取到相同的数据。
修复:
在运行前, 用bing的数据库条目与用户输入的对比。 如果用户请求数目超出bing现有数目, 取bing最大值代替用户输入的最大值。
update: 2017/08/25
修复后代码:
use HTTP::UserAgent;
use URI::Encode; =begin pod
用于国内版bing查询
# by FireC@t
# 2017/08/25
=end pod my $ua = HTTP::UserAgent.new(:user-agent<Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/ Firefox/52.0>);
my $bing_url = 'http://cn.bing.com/search?q=';
my $choose = rx/'<cite>'(.*?)'</cite>'/;#要查的内容
my $filename = ~now.DateTime~'.txt';
$filename = do given $filename {S:g/':'/-/};
my $fp = open $filename, :w;
my $hv=;
my $all_data; #进度显示 sub MAIN (Int $page_number) {
say '+';
say '=======================================================================';
say ' By: FireC@t';
say '=======================================================================';
#say '';
my $strings = prompt 'Input String You Want: ';
say 'Search : '~$strings;
say 'User Data Get Page : '~$page_number; #输出数据数目
my $start_time = now.DateTime; $strings = uri_encode($strings);
#调用用户处理函数, 处理记录数, 防止重复 $all_data = *$page_number;#先计算用户实际要求的数目
#如果用户请求数据过多, 提示
#say 'Test all_data ->'~$all_data; # for test;
my $page_number_swap = User_data_chang($strings);
if $page_number_swap < $page_number {
say 'Not enough Data for bing('~$page_number_swap~' pages), page_number change: '~$page_number~' to '~$page_number_swap;
#改写用户要求的实际数目
$all_data = *$page_number_swap;
} my $count = ;
say 'Start Time : '~$start_time;
say '=======================================================================';
#sleep(100);
for ..$page_number_swap {
#每一页的结果调用函数
my $url_end = '&first='~$count;
my $targeturl = $bing_url~$strings~$url_end;
say '>> '~$targeturl~'';
#调用函数查询结果URL
Bing_search($targeturl);
$count += ;
}
my $end_time = now.DateTime;
say '=======================================================================';
say 'Finish Time : '~$end_time;
say 'Time Use : '~($end_time-$start_time);
say '=======================================================================';
say 'Data('~$hv-~' lines) save to : '~$filename;
say '=======================================================================';
} #查询函数
sub Bing_search($url) {
my $html = $ua.get($url).content;#获取结果
loop {
$html ~~ $choose;
last if not $; my $swap_ = ~$;
$html = $/.postmatch;
$swap_ = do given $swap_ {S:g/'<strong>'//};
$swap_ = do given $swap_ {S:g/'</strong>'//};
say '('~$hv~':'~$all_data~') '~$swap_;
$hv++; #记录数据数目
$fp.say($swap_);
}
} #用于处理用户请求记录数
sub User_data_chang($strings){
#获取所有记录数:
my $start_url = $bing_url~$strings;
my $all_result_number = $ua.get($start_url);
$all_result_number ~~ /'sb_count">'(.*?)\s.*?'</span>'/;
if not $ {
#say 'Not Result';
return ;
#没有结果, 直接返回0个页面
}
#如果有结果
my $data_number = ~$;#123,45
#say $data_number; #test
my $bing_all_data = Int($data_number.subst: /','/,'',:g); #获得结果总数
#test
#say $bing_all_data;
#say $all_data; #$all_data为用户请求总数
if $all_data > $bing_all_data {
#如果用户请求数大于数据已有数目, 那就返回所有请求
#调用分页函数返回一共有多少页
my $user_page = User_page($bing_all_data);
#say 'return page:'~$user_page; sleep(1000);
return $user_page;#返回页数 }else {
#否则返回用户自定义页数
my $user_page = User_page($all_data);
#say 'return page:'~$user_page; sleep(1000);
return $user_page;
}
} #用于处理页数
sub User_page($data_number) {
my $page_check = ~($data_number/);
if $page_check.split('.').elems == {
#说明有小数
return $page_check.split('.')[] + ;
}else {
#没小数, 取整数
return $page_check.split('.')[];
}
}
Perl6 必应抓取(2):最终版的更多相关文章
- Perl6 必应抓取(1):测试版代码
一个相当丑漏的代码, 以后有时间再优化了. 默认所有查找都是15页, 如果结果没有15页这么多估计会有重复.速度还是很快的. sub MAIN() { my $fp = open 'bin_resul ...
- Python爬虫:新浪新闻详情页的数据抓取(函数版)
上一篇文章<Python爬虫:抓取新浪新闻数据>详细解说了如何抓取新浪新闻详情页的相关数据,但代码的构建不利于后续扩展,每次抓取新的详情页时都需要重新写一遍,因此,我们需要将其整理成函数, ...
- 【爬虫】biqukan抓取2.0版
#!python3.7 import requests,sys,time,logging,random from lxml import etree logging.basicConfig(level ...
- php抓取远程数据显示在下拉列表中
前言:周五10月20日的时候,经理让做一个插件,使用的thinkphp做这个demo 使用CURL抓取远程数据时如果出现乱码问题可以加入 header("content-type:text/ ...
- Java、C#双语版HttpHelper类(解决网页抓取乱码问题)
在做一些需要抓取网页的项目时,经常性的遇到乱码问题.最省事的做法是去需要抓取的网站看看具体是什么编码,然后采用正确的编码进行解码就OK了,不过总是一个个页面亲自去判断也不是个事儿,尤其是你需要大量抓取 ...
- 如何使用 Github Actions 自动抓取每日必应壁纸?
如何白嫖 Github 服务器自动抓取必应搜索的每日壁纸呢? 如果你访问过必应搜索网站,那么你一定会被搜索页面的壁纸吸引,必应搜索的壁纸每日不同,自动更换,十分精美.这篇文章会介绍如何一步步分析出必应 ...
- python爬虫beta版之抓取知乎单页面回答(low 逼版)
闲着无聊,逛知乎.发现想找点有意思的回答也不容易,就想说要不写个爬虫帮我把点赞数最多的给我搞下来方便阅读,也许还能做做数据分析(意淫中--) 鉴于之前用python写爬虫,帮运营人员抓取过京东的商品品 ...
- 用正则表达式抓取网页中的ul 和 li标签中最终的值!
获取你要抓取的页面 const string URL = "http://www.hn3ddf.gov.cn/price/GetList.html?pageno=1& ...
- Java版 QQ空间自动登录无需拷贝cookie一天抓取30WQQ说说数据&流程分析
QQ空间说说抓取难度比较大,花了一个星期才研究清楚! 代码请移步到GitHub GitHub地址:https://github.com/20100507/Qzone [没有加入多线程,希望你可以参与进 ...
随机推荐
- easyui布局隐藏伸缩按钮
1. 在html中加入 <script> /** * layout方法扩展 * @param {Object} jq * @param {Object} region */ $.exten ...
- hdu 5638 Toposort (拓扑排序+线段树)
Toposort Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total ...
- excel 技能收集
排序: 对某D列第4行开始的数据排序,对D4之后的700个数据全部排序 =RANK(D4,$D$4:$D$700)
- Longest Word in Dictionary through Deleting - LeetCode
目录 题目链接 注意点 解法 小结 题目链接 Longest Word in Dictionary through Deleting - LeetCode 注意点 长度一样的字符串要按字典序返回较小的 ...
- 【科技】扩展Lucas随想
扩展Lucas解决的还是一个很Simple的问题: 求:$C_{n}^{m} \; mod \; p$. 其中$n,m$都会比较大,而$p$不是很大,而且不一定是质数. 扩展Lucas可以说和Luca ...
- 【codeforces 778C】 Peterson Polyglot
http://codeforces.com/problemset/problem/778/C (题目链接) 题意 给出一个字典树,问删掉哪一层以后,得到的字典树最小. Solution 直接对于每一层 ...
- Android实现透明的颜色效果(zz)
android Button或者ImageButton背景透明状态设置 设置Button或ImageButton的背景为透明或者半透明 半透明< Button android:backgroun ...
- 解题:CF570D Tree Requests
题面 DSU on tree确实很厉害,然后这变成了一道裸题(逃 还是稍微说一下流程吧,虽然我那个模板汇总里写过 DSU on tree可以以$O(n\log n)$的复杂度解决树上子树统计问题,它这 ...
- List of NP-complete problems
This is a list of some of the more commonly known problems that are NP-complete when expressed as de ...
- 同一个局域网中用Windows自己的远程桌面远程局域网中的其他PC
同一个局域网中用Windows自己的远程桌面远程局域网中的其他PC... ===================== 建立Windows远程访问的前提: 1.访问PC和被访问的PC在同一个局域网中 2 ...