PHP利用socket_bind函数切换IP地址采集数据
在利用PHP进行数据采集的过程中,通常会遇到IP被屏蔽或出现验证码的情况;为了能够继续采集,我们需要切换不同的ip,每访问一次,随机切换一个IP。当然也可以通过收集大量代理,通过切换代理的方式进行采集,原理大抵相似。
因为本人在实际工作中遇到这种情况,刚好发生的场景在美国站群的服务器,上面有已经绑定了200多个ip(这种服务器1300元一月),因此可以轻松的利用socket_bind()函数进行出口ip的绑定,只需要随机抽取一个IP进行绑定就可以。
在C#中同样可以通过Socket.Bind()函数进行ip的绑定,以此切换服务器中不同ip进行采集!
<?php
//输出内容
echo Getdata("http://www.baidu.com/s?wd=ip"); //Getdata()采集函数
function Getdata($url){
//随机ip
require_once('D:\fang360_100dir\datas\Iplist.php');
$ip = $ip_arr[rand(0,count($ip_arr)-1)]; //host post path
$arr = parse_url($url);
$path=$arr['path']?$arr['path']:"/";
$host=$arr['host'];
$port=isset($arr['port'])?$arr['port']:80;
if ( $arr['query'] ){
$path .= "?".$arr['query'];
} // Create a new socket
$sockHttp = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!$sockHttp){
echo "socket_create() failed: reason: " .socket_strerror(socket_last_error()) . "\n";
} // Bind the source address
if (socket_bind($sockHttp, $ip) === false) {
echo "socket_bind() failed: reason: " .socket_strerror(socket_last_error($sockHttp)) . "\n";
} // Connect to destination address
$resSockHttp = socket_connect($sockHttp, $host, $port);
if (!$resSockHttp){
echo 'socket_connect() failed!';
} $user_agent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 xttest/24.0";
$cookie = '';
$timeout = 25;
$out = "GET {$path} HTTP/1.0\r\n";
$out .= "Host: {$host}\r\n";
$out .= "User-Agent: {$user_agent}\r\n";
$out .= "Accept: */*\r\n";
$out .= "Accept-Language: zh-cn\r\n";
$out .= "Accept-Encoding: identity\r\n";
$out .= "Referer: {$url}\r\n";
$out .= "Cookie: {$cookie}\r\n";
$out .= "Connection: Close\r\n\r\n"; // Write
socket_write($sockHttp, $out,strlen($out)); $httpCode = substr(socket_read($sockHttp, 13),9,3); $data ='';
while ($sRead = socket_read($sockHttp, 4096)){
$data .= $sRead;
}
// Close
socket_close($sockHttp); if (preg_match("#Content-Type:([^\r\n]*)#i", $data, $matches) && trim($matches[1]) != '')
{
$content_type_array = explode(';', $matches[1]);
$ContentType = strtolower(trim($content_type_array[0]));
}
else
{
$ContentType = 'text/html';
} header("Content-type: $ContentType");
$data=preg_replace("/^[^<]*?\r\n\r\n/","",$data); if($httpCode>=400){
$data = "Request Error";
} return $data;
} ?>
PHP利用socket_bind函数切换IP地址采集数据的更多相关文章
- 利用mysql的inet_aton()和inet_ntoa()函数存储IP地址的方法
原文:https://www.jb51.net/article/29962.htm 当前很多应用都适用字符串char(15)来存储IP地址(占用16个字节),利用inet_aton()和inet_nt ...
- 巧用批处理cmd快速切换IP地址
如果你的笔记本经常在不同的地方使用,有些地方需要自动获取IP,而有些地方需要配置固定IP,每换一个地方都需要重新配置一遍,是不是感觉很麻烦呢? 下面介绍一种通过建立批处理文件来快速切换IP的方法: s ...
- 嵌入式开发之函数解析---ip地址2进制转字符inet_ntoa 调用中只生效一次
inet_addr() 简述:将一个点间隔地址转换成一个in_addr. #include <winsock.h> unsigned long PASCAL FAR inet_addr ...
- 利用netsh命令设置IP地址/DNS服务器地址
一.设置IP地址 1. 自动获取IP地址: netsh interface ip set address [name=]"本地连接" [source=]dhcp 2. 手动设置IP ...
- 利用Shell命令获取IP地址
一 :获取单个网卡的IPv4地址,方法如下: 方法一:$/sbin/ifconfig ethX | awk '/inet addr/ {print $2}' | cut -f2 -d ":& ...
- 利用jsonp调用外部ip地址池
<html lang="en"> <head> <meta charset="UTF-8"> <title>Do ...
- MySQL内置函数:IP地址点分式与数字转换函数(INET_ATON/INET_NTOA)
前后转换,相比代码内部在进行移位简单太多了 SELECT INET_ATON('209.207.224.40'); SELECT INET_NTOA('578950');
- jsp页面获取服务器Ip地址等数据
废话不多说,直接上代码 <%@ page language="java" import="java.util.*" pageEncoding=" ...
- 利用Linode面板Clone克隆搬家迁移不同VPS数据及利用IP Swap迁移IP地址
在众多海外VPS服务商中,老蒋个人认为Linode提供的VPS方案和性价比还是比较高的,尤其目前基础1GB方案仅需10美元每月且全部是SSD固态硬盘,无论是流量还是硬盘大小,基本上可以满足我们大部分用 ...
随机推荐
- Linux内核文档翻译之Squashfs文件系统
转载:http://blog.csdn.net/gqb_driver/article/details/12946629 对于使用openwrt的嵌入式系统来说,因为硬件绝大多数采用Flash,因此一般 ...
- 看完《Don't make me think》的总结
寒假在公司实习,然后公司人数比较少,作为一个前端实习生,分工下,就去负责了项目的业务逻辑的梳理以及页面的设计,为了让页面设计的好看,交互性好,便于用户使用,我就快速看了这本薄薄的却很有用的书.书的整体 ...
- JS后退, JS返回上一页, JS返回下一页
Javascript 返回上一页: 1. history.go(-1), 返回两个页面: history.go(-2); 2. history.back(). 3. window.history.fo ...
- Big String 块状数组(或者说平方分割)
Big String 给一个字符串,长度不超过 106,有两种操作: 1. 在第 i 个字符的前面添加一个字符 ch 2. 查询第 k 个位置是什么字符 操作的总数不超过 2000 如果直接模拟的话, ...
- 【阿里云产品公测】消息队列服务MQS使用分享
作者:阿里云用户 wiwi 消息队列MQS,顾名思义,是用于发送接收消息用的.废话不说,直接进入主题. 使用场景:服务添加了一个新功能,主要用于生成图片,本人用的开发语言是PHP,生成图片比较耗服务器 ...
- 【阿里云产品公测】离线归档OAS,在也不用备份担心空间了
作者:阿里云用户 莫须有3i 1 起步 1.1 初识OAS 啥是OAS,请看官方说明: 引用 开放归档服务(Open Archive Service,简称OAS),致力于提供低成本.高可靠的数据归档服 ...
- WinDBG快速定位异常位置
在WinDBG中通过搜索内存中保存的CONTEXT结构来定位发生的异常信息,再通过WinDBG命令.cxr显示对应的调用堆栈信息. .foreach ( place { s-[1]d 0 L?FF ...
- iOS开发— Socket编程
Socket编程 一.了解网络各个协议:TCP/IP.SOCKET.HTTP等 网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 其中物理层.数据链路层和网络层通常被 ...
- leetcode 题解 Add Two Numbers(两个单链表求和)
题目: You are given two linked lists representing two non-negative numbers. The digits are stored in r ...
- 安装 ant
(1)下载ant:http://ant.apache.org/bindownload.cgi (2)解压后放在指定的文件夹中(/usr/lib) (3) sudo chmod 777 /usr/lib ...