网页flash抓取器 mac(IP代理筛选系统问题分析分析解决一个实际问题的原理)
优采云 发布时间: 2022-02-27 14:14网页flash抓取器 mac(IP代理筛选系统问题分析分析解决一个实际问题的原理)
上一篇博客介绍了Linux抓取网页的例子,其中抓取google play国外网页时需要使用代理服务器
代理的目的
其实,除了使用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 | grep curl | 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个国家的每日网页排名和游戏网页抓取任务。
之后就是对网页中的游戏属性信息进行提取和处理,生成日报,定时发送邮件,查询趋势图等。具体可以看我的上一篇博客:Linux爬取网页示例
脚本功能实现
IP代理筛选的基本流程比较简单,其数据格式和实现步骤如下:
首先到网站采集可用的代理IP源(以美国为例),格式如下:
接下来,清除上图中的空格。具体实现命令请参考上面【方案设计】-》【2、文本预处理】,文本预处理的格式如下:
然后,测试上图文字预处理后的代理IP是否可用,请参考上面的【方案设计】——“[3、检测IP代理]。代理IP的格式如下:
下面介绍shell脚本实现文本预处理和网页过滤的详细步骤
1、文本预处理
# file processlog='Top800proxy.log'dtime=$(date +%Y-%m-%d__%H:%M:%S)function select_proxy(){ if [ ! -d $dir_split ]; then mkdir $dir_split fi if [ ! -d $dir_output ]; then mkdir $dir_output fi if [ ! -e $log ]; then touch $log fi echo "================== Top800proxy $dtime ==================" >> $log for file in `ls $dir_input`; do echo $file >> $log file_input=$dir_input$file echo $file_input >> $log file_split=$dir_split$file"_split" echo $file_split >> $log rm -rf $file_split touch $file_split sed -e "s/\s\{2,\}/:/g" $file_input > $file_split sed -i "s/ /:/g" $file_split file_output=$dir_output$file"_out" echo $file_output >> $log proxy_output "$file_split" "$file_output" echo '' >> $log done echo '' >> $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 筛选
index=1file_html=$dir_output"html_"cmd=''function proxy_output(){ rm -rf $2 touch $2 rm -rf $file_html* index=1 while read line do proxy_ip=$(echo $line | cut -f 1 -d ":") proxy_port=$(echo $line | cut -f 2 -d ":") proxy=$proxy_ip":"$proxy_port echo $proxy >> $log cmd="curl -y 60 -Y 1 -m 300 -x $proxy -o $file_html$index $url_html" echo $cmd >> $log $cmd if [ -e ./$file_html$index ]; then echo $proxy >> $2 break; fi index=`expr $index + 1` done < $1 rm -rf $file_html*}
脚本功能说明:
代理IP过滤函数proxy_output的前三行清除前面过滤的结果,函数是初始化
while循环主要遍历作为参数传入的文本预处理后的“$file_split”,检测代理IP是否可用。步骤如下:
一种。先拼接出代理IP的(ip:port)格式,通过cut分割文本行实现,然后提取第一个字段(ip)和第二个字段(port),拼接成(ip:port) )
湾。构造命令cmd通过curl抓取网页,执行网页下载命令$cmd
C。通过检测网页下载命令执行后是否生成网页下载文件来判断拼接的代理IP($proxy)是否有效。如果有效,将代理IP保存到“$file_output”并退出遍历(中断)
d。如果当前代理IP无效,读取下一行代理IP,继续检测
代理IP抓取网页示例:
使用上述代理IP系统,过滤掉免费代理IP,抓取游戏排名网页如下(脚本片段):
index=0 while [ $index -le $TOP_NUM ] do url=$url_start$index$url_end url_cmd='curl -y 60 -Y 1 -m 300 -x '$proxy' -o '$url_output$index' '$url echo $url_cmd date=$(date "+%Y-%m-%d___%H-%M-%S") echo $index >> $log echo $url"___________________$date" >> $log $url_cmd # done timeout file seconds=0 while [ ! -f $url_output$index ] do sleep 1 echo $url_output$index"________________no exist" >> $log $url_cmd seconds=`expr $seconds + 1` echo "seconds____________"$seconds >> $log if [ $seconds -ge 5 ]; then select_proxy url_cmd='curl -y 60 -Y 1 -m 300 -x '$proxy' -o '$url_output$index' '$url seconds=0 fi done index=`expr $index + 24` done
脚本功能说明:
上面的shell脚本代码片段是用来爬取网页的,其核心行是select_proxy
其功能如上所述。当代理IP突然失效,网页抓取太慢,所有代理IP无效,或者当天的网页抓取工作无法完成时,用于重新筛选代理IP,恢复核心网页抓取。代码
它的设计和实现过程,如上面【方案设计】-》【7、重新检测IP代理】,其实现原理可以参考上面【代理IP筛选】的脚本,及其源码这里就不贴了。脚本代码