最近想采集看准网的部分内容,但是老是被封,每次基本上被封两三天;不知道这里有没有朋友研究过他们的防采集? 怎么突破
1
leavic 2016-04-15 10:49:29 +08:00
先说说你做了哪些防封措施?
|
3
leavic 2016-04-15 11:06:04 +08:00 1
1 :代理是 IP 池吗?单个 IP 或者不经常随机更换没有意义。
2 :采集 30 分钟休眠 1 分钟,这个机器特征太明显了,如果真要封当然可以找出来。而且连续爬 30 分钟,这个对服务器不是个小的负担,把每次请求的间隔增大个几秒可能更有意义,这样更接近人类访问。 真要搞,其实也只能大规模分布式爬了。 |
4
zqhong 2016-04-15 11:57:50 +08:00 1
可以看下这个:
https://github.com/ericls/vote_against_37/blob/master/main.py 这里面采用一种思路:在发送 HTTP 请求前,添加 X-Forwarded-For 请求头,值为随机 IP 。某些网站通过 X-Forwarded-For 来获取用户的“真实 IP ”。比如: www.ip138.com 这个网站。 关于 X-Forwarded-FOr :一般你使用代理的时候,代理服务器会在 HTTP 头里面加一个 X-Forwarded-For 来标识用户的真实 IP 。具体请看 wiki : https://zh.wikipedia.org/wiki/X-Forwarded-For 这是我最近爬取豆瓣电影写的一个爬虫,也可以看看: https://github.com/zqhong/douban_movie 感觉很多方面还有待提高,欢迎提出 issues 。 |
5
popok 2016-04-15 13:51:50 +08:00
@zqhong 这个是 PHP 一个获取 IP 的函数, discuz 也是用的这个,被借用的比较广泛,但是 X-Forwarded-For 这个请求头,客户端可是自己设置,所以很多 php 的程序都可以被伪造 IP 。。
不过现在很多程序都把这个函数改了,不从 X-Forwarded-For 上读 IP ,所以看运气 |
6
popok 2016-04-15 13:52:03 +08:00
function GetIP(){
if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) $ip = getenv("HTTP_CLIENT_IP"); else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")) $ip = getenv("HTTP_X_FORWARDED_FOR"); else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) $ip = getenv("REMOTE_ADDR"); else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) $ip = $_SERVER['REMOTE_ADDR']; else $ip = "unknow"; return($ip); } |
7
manhere 2016-04-15 13:56:27 +08:00 via iPhone
只用 remote_addr 判断 IP ,怎么伪造
|
8
xiaoding 2016-04-15 14:04:54 +08:00
动态 vps
不过现在就算用动态 vps 我也有办法反爬,一整套方案。 |
11
justlikemaki 2016-04-15 17:09:24 +08:00
@xiaoding 能分享下么
|