curl 抓取网页( IP代理筛选系统问题分析分析解决一个问题的原理)
优采云 发布时间: 2022-04-03 22:11curl 抓取网页(
IP代理筛选系统问题分析分析解决一个问题的原理)
Linux IP代理筛选系统(shell+proxy)
代理的目的
其实,除了使用IP代理爬取国外网页外,还有很多使用代理的场景:
代理原则
代理服务的原理是本地浏览器(Browser)发送请求的数据,而不是直接发送给网站服务器(Web Server)
取而代之的是一个中间代理服务器(Proxy),如下图:
IP代理筛选系统
问题分析
在分析解决一个实际问题的时候,会遇到各种各样的问题,有些问题甚至在方案设计之初都难以想到(比如代理IP爬取网页速度慢)。我的经验是,动手实践比纯理论更重要。重要的!
设计
大体思路:找到并缩小被屏蔽的IP代理的来源-》检查代理IP是否可用-》记录IP抓取网页-》如果代理IP失败重新过滤-》继续抓取网页- “完全的
1、IP代理源
选择有两个原则:可用和免费。经过深入研究和搜索,最终确定两个网站 IP代理更可靠:和
从国家数量、IP代理数量、IP代理的可用性、IP代理的文本格式综合考虑,IP代理的来源主要选择前者,后者作为补充. 后来的实际测试表明,这种初选方案基本满足需要。
2、文本预处理
从获取的代理IP中,有IP地址、端口、类型、匿名性、国家等参数,我们需要的只有IP+端口,所以需要对主IP代理源做文本预处理。
文本空间处理命令:
sed -e "s/\s\{2,\}/:/g" $file_input > $file_split
sed -i "s/ /:/g" $file_split
合并代理 IP (ip:port) 命令:
proxy_ip=$(echo $line | cut -f 1 -d ":")
proxy_port=$(echo $line | cut -f 2 -d ":")
代理=$proxy_ip":"$proxy_port
3、检测IP代理
文本预处理代理IP为标准格式(ip:port)后,需要进行代理IP筛选测试,看看哪些可用哪些不可用(因为获取的部分IP代理源无法使用或下载太慢,需要过滤掉)
curl抓取网页检查IP代理是否可用命令:
cmd="curl -y 60 -Y 1 -m 300 -x$proxy-o $file_html$index $url_html"
$cmd
4、保存IP代理
检查代理IP是否可用,如果可用,保存。
判断代理IP是否可用的标准是判断步骤3下载的网页($file_html$index)是否有内容。具体命令如下:
如果 [ -e ./$file_html$index ]; 然后
回声 $proxy >> $2
休息;
菲
5、IP代理爬取网页
使用第4步保存的代理IP抓取网页,使用代理IP抓取12个国家的排名网页和游戏网页。具体命令如下:
proxy_cmd="curl -y 60 -Y 1 -m 300 -x$proxy-o $proxy_html $proxy_http"
$proxy_cmd
6、IP 代理失败
IP代理失败的案例很多。上面的问题分析中已经列出了几个。下面将详细分析如下:
一种。网页抓取过程中代理IP突然失效,无法继续完成网页抓取
湾。代理IP没有失效,但是网页抓取很慢,一天24小时内无法完成网页抓取,导致无法生成游戏排名日报表
C。所有代理 IP 均无效。无论经过一次或多次轮询测试,当天的网页抓取任务都无法完成。
d。由于全网路由拥塞,代理IP很慢或者无法爬取网页,误判代理IP全部无效。如何恢复和纠正它
7、重新检测IP代理
在网页抓取过程中,面对第6步的IP代理故障,设计合理高效的代理IP抓取恢复机制是整个IP代理筛选系统的核心和关键
故障恢复的轮询和筛选过程如下:
在上述过程中,有几点需要注意:
一种。首先检测最后一个 IP 代理。这是因为上一个(昨天)的IP代理完成了所有的网页爬取任务,它的可用概率比较高,所以优先考虑今天是否可用。如果不可用,请选择另一个
湾。如果今天最后一个代理IP不可用,重新遍历检测代理IP源。一旦检测到可用,就不会循环,更新可用的IP代理并将其位置保存在IP源中,方便下次遍历从这里开始
C。如果进程b中新选择的代理IP突然失效或者网速太慢,继续筛选b中记录的IP源位置是否有以下代理IP。如果可用,继续爬取网页;如果没有,再遍历整个IP源
d。如果再次遍历整个代理IP源,仍然没有可用的代理IP,则重复轮询和遍历整个代理IP源,直到有可用的代理IP或今天24点过去(即没有今天一整天都可以找到可用的代理IP)
e. 对于进程d中所有代理IP都无效,整天找不到可用代理IP的特殊情况,无法完成当天的网页抓取。次日凌晨重启爬网主控脚本之前,需要先杀掉进程。d 后台循环进程,防止今天和次日两个后台抓取程序同时运行(相当于两个异步后台抓取进程),导致抓取的网页排名数据过时或错误,占用网络速度和带宽等。为了杀死当天的死后台爬取进程,请参考上一篇博客Linux爬取网页示例-《自动主控脚本-》kill_curl.sh脚本,
尽管 [ !-z $(ps -ef | grepcurl| grep -v grep | cut -c 9-15) ]
做
ps -ef | grep 卷曲 | grep -v grep | 切-c 15-20 | xargs 杀死 -9
ps -ef | grep 卷曲 | grep -v grep | 切-c 9-15 | xargs 杀死 -9
完毕
8、完成网页抓取
通过以上IP代理筛选系统,筛选出12个国家可用的免费代理IP,完成12个国家的每日网页排名和游戏网页的爬取任务。
之后就是对网页中的游戏属性信息进行提取处理,生成日报,定时发送邮件,查询趋势图。
脚本功能实现
IP代理筛选的基本流程比较简单,其数据格式和实现步骤如下:
首先到网站采集可用的代理IP源(以美国为例),格式如下:
接下来,清除上图中的空格。具体实现命令请参考上面的【方案设计】-》【2、文本预处理】,文本预处理的格式如下:
然后,测试上图文字预处理后的代理IP是否可用,请参考上面的【方案设计】->【3、检测IP代理】。检测到代理IP后的格式如下:
下面介绍shell脚本实现文本预处理和网页过滤的详细步骤
1、文本预处理
[php]查看纯副本
打印?
#fileprocesslog='Top800proxy.log'dtime=$(date+%Y-%m-%d__%H:%M:%S)functionselect_proxy(){if[!-d$dir_split];thenmkdir$dir_splitfiif[!-d $dir_output];thenmkdir$dir_outputfiif[!-e$log];thentouch$logfiecho"==================Top800proxy$dtime========== =======">>$logforfilein`ls$dir_input`;doecho$file>>$logfile_input=$dir_input$fileecho$file_input>>$logfile_split=$dir_split$file"_split"echo$file_split>> $ logrm-rf$file_splittouch$file_splitsed-e"s/\t\{2,\}/\t/g"$file_input>$file_split sed-e"s/\t/:/g"$file_input>$file_split sed -i "s//:/g"$file_splitfile_output=$dir_output$file"_out"echo$file_output>>$logproxy_output"$file_split""$file_output"echo''>>$logdoneecho''>>$log}
脚本功能说明:
if语句判断并创建文件夹$dir_split和$dir_output用于保存处理IP源的中间结果,前者保存【脚本功能实现】中文本预处理后的文本格式,后者保存检测后可用的代理IP
sed -e 语句,将输入文本(图中多个空格1)由脚本函数实现)修改为字符“:”
sed -i 语句进一步将文本中多余的空格转换为字符“:”
转换的中间结果保存到文件夹 $dir_split
以下三行file_output,以文件参数“$file_split”的形式,传递给代理IP检测函数(proxy_output),过滤掉可用的代理IP
2、代理 IP 筛选
[php]查看纯副本
打印?
index=1file_html=$dir_output"html_"cmd=''functionproxy_output(){rm-rf$2touch$2rm-rf$file_html*index=1whilereadlinedoproxy_ip_port=$(echo$line|cut-f1,2 -d":")代理=$proxy_ip_port"echo$proxy>>$logcmd="curl-y60-Y1-*敏*感*词*-x$proxy-o$file_html$index$url_html"echo$cmd>>$log$cmdif[-e./$file_html $index];thenecho$proxy>>$2break;fiindex=`expr$index+1`done>$logecho$url"_____$date">>$log$url_cmd#donetimeoutfileseconds=0while[!-f$url_output$index ]dosleep1echo$url_output$index"________________noexist">>$log$url_cmdseconds=`expr$seconds+1`echo"seconds____________"$seconds>>$logif[$seconds-ge5];thenselect_proxyurl_cmd='curl-y60-Y1-*敏*感*词* -x'$proxy'-o'$url_output$index''$urlseconds=0fidoneindex=`expr$index+24`done
脚本功能说明:
上面的shell脚本代码片段是用来爬取网页的,其核心行是select_proxy
其功能如上所述。当代理IP突然失效,网页抓取太慢,所有代理IP无效,或者当天的网页抓取工作无法完成时,用于重新筛选代理IP,恢复网页核心刮。代码
它的设计和实现过程,如上面【方案设计】-》【7、重新检测IP代理】,其实现原理可以参考上面【代理IP筛选】的脚本,及其源码这里就不贴了。脚本代码
发表于 2016-04-07 16:18xxxxxxxx1x2xxxxxxx 阅读(390)评论(0)编辑