Quantcast
Channel: CodeSection,代码区,Python开发技术文章_教程 - CodeSec
Viewing all articles
Browse latest Browse all 9596

关于某个socks代理站点的爬虫与防爬(附上python3源码)

$
0
0

关于某个socks代理站点的爬虫与防爬(附上python3源码)

前几天抓取代理ip的时候遇到这个站http://proxylist.hidemyass.com/。之前遇到的防爬手段都是加密,这个以干扰元素防爬的还是挺好玩的。

部分源码如下:

<span> <style> .dPiH{display:none} .LG9p{display:inline} .aj01{display:none} .bGXZ{display:inline} </style> <spanclass="dPiH">36</span> <divstyle="display:none">36</div> <span style="display:none">120</span> <spanclass="aj01">120</span> <span style="display:none">160</span> <spanclass="aj01">160</span> <span></span> <spanstyle="display:none">177</span> <span class="dPiH">177</span> 182 <spanstyle="display: inline">.</span> 38 <span class="216">.</span> <spanclass="167">191</span> <span style="display:none">220</span> <divstyle="display:none">220</div> <span class="85">.</span> <spanclass="188">208</span> </span> <td> 3128</td> <td> HTTP</td>

在这里我们可以看到。他使用class名调用css样式从而控制是否现实span标签里面的内容。这是我们使用正则很难查找到真实的数据。

我的解决办法是先把css提取出来。这很容易:zz=re.compile(“<span>\n.*<style>\n.*([^<]+)”)

匹配到的数据:”.dPiH{display:none}\n.LG9p{display:inline}\n.aj01{display:none}\n.bGXZ{display:inline}

然后我们整理一下,以换行符分割字符串:数据.spilt(“\n”)。

然后迭代分割后的css 将class名替换为样式(因为我们后面的正则用不到’class=”’,所以这里不用管它):

替换完成后,数据变成了这样

<span> <style> .display:none{display:none} .display:inline{display:inline} .display:none{display:none} .display:inline{display:inline} </style> <spanclass="display:none">36</span> <divstyle="display:none">36</div> <span style="display:none">120</span> <spanclass="display:none">120</span> <span style="display:none">160</span> <spanclass="display:none">160</span> <span></span> <spanstyle="display:none">177</span> <span class="display:none">177</span> 182 <spanstyle="display: inline">.</span> 38 <span class="216">.</span> <spanclass="167">191</span> <span style="display:none">220</span> <divstyle="display:none">220</div> <span class="85">.</span> <spanclass="188">208</span> </span> <td> 3128</td> <td> HTTP</td>

接下来就是查找真正的显示出来的ip了

在这里什么样的数据是可以显示的呢?

1.不在标签内的。比如:182

2.styple属性中display值为inlined

3.class名为随机数字的

端口号和代理类型在<td></td>标签内很好查找

根据以上条件 我们得到的ip为182.38.191.208:3128 HTTP

但是 程序不会给你排序、整理

通过正则匹配出来的列表中除了循序是对的,其中夹杂了大量的空字符串、换行符和空格。

我们需要一些方法来去除这个没用的东西。并把这些琐碎的数字拼接起来。

直接上代码

#!/sur/bin/python3.5 #coding:utf-8 import urllib.request,re styles=[]#用于存放抓取到的css ips=[]#用于存放抓取到的ip以便排序分类 html=urllib.request.urlopen("http://proxylist.hidemyass.com/1#listable").read().decode('utf-8') sty_re=re.compile("<span>\n.*<style>\n.*([^<]+)") #匹配css的正则 sty=re.findall(sty_re,html) #整理样式表,并添加到列表 for i in sty: styles.extend(i.split("\n")) #替换html for stin styles: if st !="": html=html.replace(st[1:5],st[6:-1]) #查找代理相关字符 '返回内容为列表嵌套元组的形式' ip_re = re.compile('</span>([\d|\.]*)|"display:[^i]*inline">([\d|\.]+)|class="[\d]*">([\d|\.]+)|>([^<]*)<span|</div>([\d|\.]+)|</td>.*\n.*<td>([^<]+)') all=re.findall(ip_re,html) s="" #拼接琐碎ip for onein all: if one==('', '', '', '\n', '', '') or one==('', '', '', '', '', ''): continue #去除无意义元组 for twoin one: two=two.strip() if two =="": continue #去除无意义字符/字符串 if two[:3].isalpha(): s=two.ljust(10," ")+" "+s ips.append(s) s="" continue else: s+=two if len(s.split("."))==4 and s.split(".")[-1]!="" and ":"not in s: s+=":" #拼接整理 ips.sort() #以协议排序 for ipin ips: print(ip) #打印Do something

Viewing all articles
Browse latest Browse all 9596

Trending Articles