首先用到两个函数
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');
}
?>