1.需求
使用php抓取网站http://ipblock.chacuo.net/down/t_txt=c_的地区IP段;
将抓取的IP段按照分地区存入数据库;
这条url后面跟上地区二字代码在浏览器打开就是所需要的数据库,如图
以上每行是一条数据,需要将该地区US的每条数据加上字段US字段存入数据库。
另外地区代码需要从html的option中获取,长这样(部分截图):
大概有两百多个地区二字代码。
2.实现
2.1.分析
1)需要使用循环来抓取每个地区的IP段页面内容;
2)需要将地区二字代码存成数组供以上循环使用;
3)抓取到的是html网页,需要判断是否含有页面特征;
4)对于抓取不到的二字代码需要单独存入文件供再次抓取;
2.2.实现
文件结构:
index.html:用于获取option的地区二字代码,存成数组放入code.json中
index.php用于从code.json获取代码循环抓取网页
fail_code.txt:存放抓取失败的地区代码
部分代码(全部代码请参加https://github.com/RidingACodeToStray/php7sizeHtml2methodToMongoExport):
index.php:
<?php
$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");
//读取本地国家代码
$code_string = file_get_contents('code.json');
$code_arr = json_decode($code_string,true);
$url = 'http://ipblock.chacuo.net/down/t_txt=c_';
$fail_code = array();
foreach($code_arr as $value){
//方法1.使用file_get_contents抓包
// $ctx = stream_context_create(array('http' => array('timeout' => 10)));
// $str1 = @file_get_contents($url.$value, 0, $ctx);
//方法2.使用curl抓包
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url.$value);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
// curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); //此段代码用于获取重定向后的内容,这里不需要
$str1 = curl_exec($ch);
curl_close($ch);
$res = stristr($str1,'<pre>');
$arr1 = array();
if($res){
$str2 = trim(str_replace(array("<pre>","</pre>"),"",$str1)); //获取网页内容
$str3 = preg_replace('/\s(?=\S)/',' ',$str2); //将每条信息修改成单个空格隔开
$arr1 = explode(" ",$str3); //将所有的信息转化为一个数组
$arr2 = array_chunk($arr1,4); //由于每四条是一个有效信息,将数组按4个拆成一个数组
//将国家代码插入拆开后的每个数组存入数据库
$bulk = new MongoDB\Driver\BulkWrite;
foreach ($arr2 as &$val) {
array_unshift($val,$value);
$bulk->insert($val);
}
$manager->executeBulkWrite('ming.country_ip', $bulk);
}else{
$fail_code[] = $value;//收集抓取失败的国家代码
}
}
//将抓取失败的国家代码写入文件
$file = fopen("fail_code.txt", "w") or die("Unable to open file!");
$txt = json_encode($fail_code);
fwrite($file, $txt);
fclose($file);
在终端执行php文件
ming@ming-TM1604:~$ php /home/wwwroot/ming/c_code/index.php
执行完成后查询数据库有多少条记录:
ming@ming-TM1604:~$ mongo
MongoDB shell version: 2.6.10
connecting to: test
> use ming
switched to db ming
> db.country_ip.count()
53104
> db.country_ip.findOne()
{
"_id" : ObjectId("5b3b266b648bc254cd6689f2"),
"0" : "AF",
"1" : "210.80.0.0",
"2" : "210.80.63.255",
"3" : "210.80.0.0/18",
"4" : "16384\r"
}
>
才5万多条,有点少,进入fail_code.txt查看,发现数组生成,说明有一部分抓取失败了:
在浏览器打开页面发现有重定向,而重定向后的页面没有我们所需要的内容。。。
不过老板说让查一查这些数据有多少个地区类型,于是在mongo查询抓取到的地区类型有多少个:
> db.country_ip.distinct("0").length
46
>
有46个,够用了,不抓了,导出吧
mongoexport -d 数据库名 -c 集合名 -o 导出文件名
ming@ming-TM1604:~$ mongoexport -d ming -c country_ip -o country_ip
connected to: 127.0.0.1
exported 53104 records
ming@ming-TM1604:~$ ls
configuration examples.desktop snap VirtualBox VMs 模板 图片 问题 音乐
country_ip indicator-sysmonitor shareWin7 Steam 公共的 视频 文档 下载 桌面
ming@ming-TM1604:~$
然后把country_ip文件交给负责测试的。