من یه اسکریپت دارم که به صورت cronjob هرچند روز یکبار تعدادی از صفحات یه وبسایت رو میگیره و اطلاعات خاصی رو از اون استخراج میکنه.یک نمونه از نمایش صفحات این سایت روی مرورگر :
Last update IP address Port Country Speed Connection time Type Anonymity
31 secs 54.251.150.200 80 flag United States HTTP Low
2 minutes 173.213.113.111 3128 flag United States HTTPS High +KA
2 minutes 94.209.12.29 80 flag Netherlands HTTP High +KA
3 minutes 89.32.230.98 8080 flag Moldova, Republic of HTTPS High +KA
4 minutes 118.96.127.10 3128 flag Indonesia HTTP Low
4 minutes 125.39.68.130 80 flag China HTTPS High +KA
5 minutes 115.127.29.178 3128 flag Bangladesh HTTPS High +KA
5 minutes 218.29.154.54 8000 flag China HTTPS High +KA
اسکریپت ۴ فیلد رو استخراج و پردازش میکنه.فیلد ip مربوط اولین رکورد(54.251.150.200) در فایل html
به صورت زیر است :
.xn4v{display:none}
.CHZv{display:inline}
.WJIS{display:none}
.R1oQ{display:inline}
.Qp8o{display:none}
.KEYK{display:inline}
.R_Ad{display:none}
.XUdT{display:inline}
</style><span class="XUdT">54</span><span style="display:none">61</span><div style="display:none">61</div><div style="display:none">131</div><span style="display:none">177</span><span class="R_Ad">177</span><span></span><div style="display:none">214</div><span></span><span class="XUdT">.</span><span class="R_Ad">18</span><div style="display:none">18</div><span class="xn4v">125</span><span class="R_Ad">136</span><div style="display:none">136</div><span style="display:none">180</span><div style="display:none">180</div><span style="display:none">209</span><span class="xn4v">209</span><div style="display:none">209</div><span style="display:none">218</span><span class="WJIS">218</span><div style="display:none">218</div><span style="display: inline">251</span><span class="27">.</span><span class="Qp8o">6</span><span style="display:none">25</span><span style="display:none">40</span><span class="WJIS">40</span><span class="Qp8o">54</span><div style="display:none">54</div><span class="Qp8o">57</span><span style="display:none">71</span><span class="WJIS">71</span><div style="display:none">71</div><span style="display:none">80</span><span style="display:none">114</span><span class="WJIS">114</span><div style="display:none">114</div><span style="display:none">130</span><div style="display:none">130</div><div style="display:none">134</div><span class="143">150</span><div style="display:none">175</div><span style="display:none">188</span><div style="display:none">188</div><span></span><span></span><span class="122">.</span><span class="WJIS">3</span><span></span><div style="display:none">9</div><span class="Qp8o">152</span><div style="display:none">152</div><span class="30">200</span></span></td>
البته سایر فیلدهای ip دارای الگوهای متغیر دیگری هستند و این کار را کمی مشکل میکند ولی وقتی مرورگر میتواند به راحتی صفحه را رندر کند پس من هم میتوانم.یک تابع کوچک ۴ فیلد مورد نظر من را استخراج میکند(ip-port-country-type) :
function parse_ip_port()
{
maingrepstr="((span|div|style|class=\"[0-9]+\"|display:[ ]?inline\")>\.?[0-9]+\.?[0-9]*<)"
grepstr="$maingrepstr"
unset temparray
temparray=(`grep -En '^\..*' $rand_file_name | cut -d ':' -f 1`)
for i in `seq 0 $((${#temparray[@]}-2))`;
do
unset tempstr
linenum="${temparray[$i]}"
tempstr="`sed -n "${linenum}p" "$rand_file_name" | grep '{display:inline}' | grep -Eo '^\.[^{]+' | cut -c 2- | tr -d '\n'`"
if [ -n "$tempstr" ];then
grepstr="$grepstr|(class=\"$tempstr\">\.?[0-9]+\.?[0-9]*<)"
fi
if [ "${linenum}" -eq "$((${temparray[$i+1]}-1))" ];then
continue
else
offset=$((${temparray[$i+1]}-1))
echo "`sed -n "${linenum},${offset}p" "$rand_file_name" | grep -Eo "$grepstr"| grep -Eo '(^\.?[0-9]+\.?[0-9]*)|(>[\.]?[0-9]+[\.]?[0-9]*<)' | grep -Eo '[0-9]+' | tr '\n' '.' | sed 's/\.$//'`:`sed -n "${linenum},${offset}p" "$rand_file_name" | grep -Eo '^[0-9]+' | head -n 1`:`sed -n "${linenum},${offset}p" "$rand_file_name" | grep -Eo '>.*</span>' | grep -Eo '> .*<' | grep -Eo '[^>].*[^<]' | cut -c 2-`:`sed -n "${linenum},${offset}p" "$rand_file_name" |grep -Eio '<td>(HTTP|HTTPS|socks.*)</td>' | grep -Eo '>[^<]+' | cut -c 2-`" >>$rand_file_pages
grepstr="$maingrepstr"
fi
done
lastindex="$((${#temparray[@]}-1))"
tempstr="`sed -n "${temparray[$lastindex]}p" "$rand_file_name" | grep '{display:inline}' | grep -Eo '^\.[^{]+' | cut -c 2- | tr -d '\n'`"
if [ -n "$tempstr" ];then
grepstr="$grepstr|(class=\"$tempstr\">\.?[0-9]+\.?[0-9]*<)"
fi
echo "`sed -n "${temparray[$lastindex]},$((${temparray[$lastindex]}+25))p" "$rand_file_name" | grep -Eo "$grepstr"| grep -Eo '(^\.?[0-9]+\.?[0-9]*)|(>[\.]?[0-9]+[\.]?[0-9]*<)' | grep -Eo '[0-9]+' | tr '\n' '.' | sed 's/\.$//'`:`sed -n "${temparray[$lastindex]},$((${temparray[$lastindex]}+25))p" "$rand_file_name" | grep -Eo '^[0-9]+' | head -n 1`:`sed -n "${temparray[$lastindex]},$((${temparray[$lastindex]}+25))p" "$rand_file_name" | grep -Eo '>.*</span>' | grep -Eo '> .*<' | grep -Eo '[^>].*[^<]' | cut -c 2-`:`sed -n "${temparray[$lastindex]},$((${temparray[$lastindex]}+25))p" "$rand_file_name" | grep -Eio '<td>(HTTP|HTTPS|socks.*)</td>' | grep -Eo '>[^<]+' | cut -c 2-`" >>$rand_file_pages
return
}
متغیر $rand_file_name فایل html دانلود شده است که باید پردازش شود.نتایج حاصل از پردازش در $rand_file_pages قرار میگیرند.برای امتحان صفحه http://www.hidemyass.com/proxy-list/1 را از طریق قند شکن دانلود کنید و با انتساب ۲ فایل ورودی و خروجی به ۲ متغیر ذکر شده این تابع را آزمایش کنید.
آشنایی با sed,grep و سینتکس regex و چندین خاصیت مهم bash میتواند حاصل این تمرین باشد.میتوانید از awk به جای sed و grep استفاده کنید.در برخی دیگر از صفحات web متغیرهای جاوا اسکریپت جایگزین تعریف استایلهای نظیر
.xn4v{display:none}
میشوند اما پردازش آن نیز ساده است.
میدانم که کد بالا یک کد اسپاگتی است.اما بسیار کوتاه است و معنی و مفهوم آن برای کسی که از regex سر در بیاورد راحت است.
کد هر سایتی به مرور زمان ممکن است تغیییر کند که ممکن است نیاز به تغییراتی در تابع باشد.