curl 抓取网页( IP代理筛选系统问题分析分析解决一个问题的原理)

优采云 发布时间: 2022-04-03 22:11

  curl 抓取网页(

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)编辑

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线