PHP socket采集实例

首先用到两个函数

 

gethostbyname 获取主机的ip地址

 

getprotobyname 返回取得协议编号

 

php socket函数

 

socket_accept()     接受一个Socket连接

socket_bind()      把socket绑定在一个IP地址和端口上

socket_clear_error()    清除socket的错误或者最后的错误代码

socket_close()      关闭一个socket资源

socket_connect()     开始一个socket连接

socket_create_listen()    在指定端口打开一个socket监听

socket_create_pair()    产生一对没有区别的socket到一个数组里

socket_create()     产生一个socket,相当于产生一个socket的数据结构

socket_get_option()     获取socket选项

socket_getpeername()    获取远程类似主机的ip地址

socket_getsockname()    获取本地socket的ip地址

socket_iovec_add()     添加一个新的向量到一个分散/聚合的数组

socket_iovec_alloc()    这个函数创建一个能够发送接收读写的iovec数据结构

socket_iovec_delete()    删除一个已经分配的iovec

socket_iovec_fetch()    返回指定的iovec资源的数据

socket_iovec_free()     释放一个iovec资源

socket_iovec_set()     设置iovec的数据新值

socket_last_error()     获取当前socket的最后错误代码

socket_listen()      监听由指定socket的所有连接

socket_read()      读取指定长度的数据

socket_readv()      读取从分散/聚合数组过来的数据

socket_recv()      从socket里结束数据到缓存

socket_recvfrom()     接受数据从指定的socket,如果没有指定则默认当前socket

socket_recvmsg()     从iovec里接受消息

socket_select()      多路选择

socket_send()      这个函数发送数据到已连接的socket

socket_sendmsg()     发送消息到socket

socket_sendto()     发送消息到指定地址的socket

socket_set_block()     在socket里设置为块模式

socket_set_nonblock()    socket里设置为非块模式

socket_set_option()     设置socket选项

socket_shutdown()     这个函数允许你关闭读、写、或者指定的socket

socket_strerror()     返回指定错误号的详细错误

socket_write()      写数据到socket缓存

socket_writev()     写数据到分散/聚合数组

 

 

采集列表文章:

 

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<?php


$id = (int)$_GET['id'];
connect_sql();
if($id <= 10){
$procol = getprotobyname('tcp');
$ip = gethostbyname('bbs.lampbrother.net');
set_time_limit(0);
$sock = socket_create(AF_INET, SOCK_STREAM, $procol); //或者是SOL_TCP 建立一个socket通信
socket_connect($sock,$ip,80);


$in = "GET /thread-htm-fid-127-page-".$id.".html HTTP/1.1\r\n";
$in .= "Host: bbs.lampbrother.net\r\n";
$in .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
$in .= "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36\r\n";
$in .= "Keep-Alive: timeout=5, max=100";
$in .= "Connection: Keep-Alive\r\n\r\n";
socket_write($sock, $in,strlen($in));//这里我用的谷歌浏览器的network 查看的页面的header

       //正则根据页面的不同规则写法不同
$res = '';
if($id<=1){
$pattern = '#<a\s+href="(read\-htm\-tid\-([\d]*)\.html)"\s+name="readlink"\s+id="a_ajax_\\2[^>]*"\s+class="subject_t f14">([^<>]*)</a>#iUs';
} else {
$pattern = '#<a\s+href="(read\-htm\-tid\-([\d]*)\-fpage\-'.$id.'\.html)"\s+name="readlink"\s+id="a_ajax_\\2[^>]*"\s+class="subject_t f14">([^<>]*)</a>#iUs';
}
while ($out = socket_read($sock,1024)){
preg_match_all($pattern, $out, $list);
if($list[0][0]){
    $sql = "INSERT INTO sint (title,urls) VALUES ('".$list[3][0]."','".$list[1][0]."')";//入库
    mysql_query($sql);
    unset($sql);
    $res .= $list[0][0];
}
}
socket_close($sock);
echo "程序正在采集中。。。。 这是第".$id."页";
//echo $res;

if($res){
$id += 1;
echo "<script>location.href='test.php?id=".$id."'</script>";
}

} else {
echo "程序采集结束。。。";
}
 
 function connect_sql(){
$con = mysql_connect('localhost','root','123456') or die('mysql error :'.mysql_error());
mysql_select_db('socket');
mysql_query('set names gbk');
}
?>

采集文章内容页,调用数据循环抓取采集:

 

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<?php
$id=(int)$_GET['id'];
connect_sql();
$list = getone($id);
$lastid = getlast($id);
if($id<=5){

echo "程序正在采集中。。。。 这是第".$id."页";


$procol = getprotobyname('tcp');
$ip = gethostbyname('bbs.lampbrother.net');
set_time_limit(0);
$sock = socket_create(AF_INET, SOCK_STREAM, $procol);
socket_connect($sock,$ip,80);


$in = "GET /".$list['urls']." HTTP/1.1\r\n";
$in .= "Host: bbs.lampbrother.net\r\n";
$in .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
$in .= "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36\r\n";
$in .= "Keep-Alive: timeout=5, max=100\r\n";
$in .= "Connection: Keep-Alive\r\n\r\n";
socket_write($sock, $in,strlen($in));


$res = '';
$pattern = '#<div\s+class="f14\s+mb10"\s+id="read_tpc">(.*)</div>#iUs';
while ($out = socket_read($sock,1024)){
$res .= $out;
}

socket_close($sock);
preg_match_all($pattern, $res, $lists);
$title = $list['title'];
$content = strip_tags(trim($lists[1][0]));
$content_encoding = mb_detect_encoding($content, array('UTF-8', 'GBK', 'BIG-5'));
    $content = iconv($content_encoding, "UTF-8//TRANSLIT", $content);
echo $content;
if($lists[0][0]){
$sql = "INSERT INTO scontent (title,content) VALUES ('".$title."','".$content."')";
   mysql_query($sql);
   unset($sql);
}



if($lastid){
echo "<script>location.href='index.php?id=".$lastid."'</script>";
}
} else {
echo "程序采集结束。。。";
}


function getlast($id){
$sql = "SELECT id FROM sint WHERE id > {$id} ORDER BY id asc LIMIT 1";
$rel = mysql_query($sql);
$list = mysql_fetch_array($rel);
return $list['id'];
}
function getone($id){
$sql = "SELECT * FROM sint WHERE id='{$id}' ORDER BY id asc";
$rel = mysql_query($sql);
$list = mysql_fetch_array($rel);
return $list;
}


function connect_sql(){
$con = mysql_connect('localhost','root','123456') or die('mysql error :'.mysql_error());
mysql_select_db('socket');
mysql_query('set names utf8');
}
?>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值