记一次使用php7抓取页面内容并解析和存入mongo数据库和相关数据导出

19 篇文章 1 订阅
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文件交给负责测试的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
操作Mongo数据库需要先安装pymongo库,在安装前确保已经安装了MongoDB数据库。 以下是使用Python操作Mongo数据库的基本方法: 1. 连接Mongo数据库: ```python import pymongo #连接Mongo数据库 client = pymongo.MongoClient(host="localhost", port=27017) ``` 2. 创建数据库: ```python #创建数据库 db = client["mydatabase"] ``` 3. 创建数据表(集合): ```python #创建数据表 collection = db["customers"] ``` 4. 插入录: ```python #插入单条录 mydict = {"name": "John", "address": "Highway 37"} x = collection.insert_one(mydict) #插入多条录 mylist = [ {"name": "Amy", "address": "Apple st 652"}, {"name": "Hannah", "address": "Mountain 21"}, {"name": "Michael", "address": "Valley 345"}, {"name": "Sandy", "address": "Ocean blvd 2"}, {"name": "Betty", "address": "Green Grass 1"}, {"name": "Richard", "address": "Sky st 331"} ] x = collection.insert_many(mylist) ``` 5. 搜索录: ```python #搜索单条录 x = collection.find_one() #搜索所有录 for x in collection.find(): print(x) #指定条件搜索 myquery = {"address": "Park Lane 38"} mydoc = collection.find(myquery) #模糊搜索 myquery = {"address": {"$regex": "^S"}} mydoc = collection.find(myquery) ``` 6. 删除录: ```python #删除单条录 myquery = {"address": "Mountain 21"} collection.delete_one(myquery) #删除多条录 myquery = {"address": {"$regex": "^S"}} x = collection.delete_many(myquery) #删除数据表 collection.drop() ``` 以上就是使用Python操作Mongo数据库的基本方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值