题目看起来有点绕,其实就是爬取免费发布代理ip的网站,这样的网站一般有大量免费的代理ip,例如本文中要爬取的http://www.xicidaili.com/nn。但是这些免费的ip有大量都不能用,故还要进行检查(这是下一步的工作了),但爬代理网站为了方式网站反爬,还要利用代理,这样就有要更智能的做个小判断了,这里只贴出本人的小demo,代码如下:
import urllib.request import re import telnetlib url= #要爬的网页的网址 ipdaili=[111.11.83.243:80]#所用的代理ip,这里的ip估计不能用,大家可以试试在url网站中找一个,或者不用代理 pagenum=100#所要爬的网页数量(该网站的网址中以页数为定义) urllist=[] for i in range(pagenum): a=url+/+str(i+1) urllist.append(a)#定义要打开的网址的列表 #print (urllist) bb=ipdaili[0].index(:) ipname=ipdaili[0][:bb] portname=ipdaili[0][bb+1:] try: tn = telnetlib.Telnet(ipname,port=portname,timeout=3) #试试这个代理是否能用 except: link=失败 else: link=成功 print(link)#检测代理ip是否可用 if link==成功: iplist=[] for b in range(pagenum): proxy_support=urllib.request.ProxyHandler({http:ipdaili[0]})#使用代理的核心代码 opener=urllib.request.build_opener(proxy_support) opener.addheaders=[(User-Agent,Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 BIDUBrowser/8.1 Safari/537.36)] #自定义header总的User-Agent,把python爬取模拟成浏览器的标识,不懂的同学可以百度一下 urllib.request.install_opener(opener) url2=urllist[b] response=urllib.request.urlopen(url2) html=response.read().decode(utf-8) #定义要打开的网页,以源代码形式打开 pat1=r[0-9]{2,3}\.[0-9]{2,3}\.[0-9]{2,3}\.[0-9]{2,3}</td>\n.{10}[0-9]{1,5} #正则表达式找到网页中的ip格式 patre=re.compile(pat1) rusult0=patre.findall(html) c=len(rusult0) pat2=r</td>\n.{10}#万恶的换行符还有十个空格,特别是换行符是用“.”所代替不了的,空格是一个个试出来的,妈的! patre2=re.compile(pat2) rusult=[] for i in range(c): d=patre2.split(rusult0[i])#正则表达式中的分割应用,将rusult0列表中的每一个元素按照正则对象patre2规则来分割,其实是为了得到port的结果,最终得到的是列表中的列表结果,即[[ip,port].........] rusult.append(d) print(rusult[i]) listf=rusult for e in range(c): listf[e]=rusult[e][0]+:+rusult[e][1] for h in range(len(listf)): m=listf[h] iplist.append(m) print(查找完毕,共找到代理ip+str(len(iplist))+个) fw=open(r输出文件路径,w+) for x in range(len(iplist)): fw.write(repr(iplist[x]).strip(\)+\n) #写入文件,并去掉字符串两边的‘’号,并在行后加回车\n print(文档写入完毕!) fw.close() else: print(再试一个代理ip吧!)