python 3 爬蟲獲取可用ip地址(小白)
阿新 • • 發佈:2019-02-11
前幾天剛剛把正則表示式看了一些,也是隻是稍微懂了一點點,所以想要寫一個簡單的程式試一下。然後就想到了以前在找免費的代理的時候有好多不能用的,所以就嘗試著寫了一個這樣的爬蟲程式,寫的不是很好,寫的很複雜,等以後再去寫簡潔一些吧。
先直接把程式碼弄上,然後再說一下里面的重點內容。
import re import urllib.request import socket def get_line(html): '''將對於ip有用的內容返回,返回值是列表!''' line_re = re.compile(r'(?:td>)(.+)(?:</td>)') list = line_re.findall(html) return list def get_ip(html): '''得到所有的ip內容,以列表的形式返回!''' list = get_line(html) ip_re = re.compile(r'(?:25[0-5]\.|2[0-4]?\d\.|[01]?\d\d?\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\b') ans_list = [] list_len = len(list) str = "" for item in list: if ip_re.match(item) != None: ans_list.append(str) str = '' str += item continue if re.search('[\u4e00-\u9fa5]+',item) == None: str += '\t' + item return ans_list def Judge_ip(ip_list): '''檢查ip是否可以用......''' url = 'http://ip.chinaz.com/getip.aspx' f = open('E:\\python_py\output.txt', 'w') #socket.setdefaulttimeout(3)#設定爬取網頁的時間限制,還有一種在面的open函式把timeout引數設定為3的方法 for i in range(0,len(ip_list)): ip = ip_list[i].split('\t') if len(ip) == 3: try: proxy = {ip[2]: ip[0] + ':' + ip[1]} proxy_support = urllib.request.ProxyHandler(proxy) opener = urllib.request.build_opener(proxy_support) html = opener.open(url,timeout=3).read() f.write(ip_list[i] + '\n') except Exception as e: print ('代理 '+ ip[0]+' 不可用' ) continue f.close() if __name__ == '__main__': url = 'http://www.xicidaili.com/' rep = urllib.request.Request(url) rep.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36') reponse = urllib.request.urlopen(rep) html = reponse.read().decode('utf-8') ip_list = get_ip(html) Judge_ip(ip_list)
用到的正則表示式內容:
ip_re = re.compile(r'(?:25[0-5]\.|2[0-4]?\d\.|[01]?\d\d?\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\b')
line_re = re.compile(r'(?:td>)(.+)(?:</td>)')
re.search('[\u4e00-\u9fa5]+',item)
ip_re 表示的是匹配一個代理IP地址我們發現在IP地址的有用的資訊兩邊都存在著<td>和<\td>所以就先把這個之間的內容提取出來,對應著正則表示式:line_re 的內容
第三個是匹配其中是否含有漢字資訊,我們這裡匹配的內容是IP地址,IP端號,以及IP型別,我們發現除了這三個內容之外,別的都是存在漢字的,所以我們需要把有用的資訊提取出來,這個就是這個正則表示式的作用
在後面測試表達式是否可用的裡面:
我們判斷如果連線嘗試的阻塞等待時間大於 3 秒的話,我們就認為這個IP地址有問題,所以就被異常所捕獲,繼續判斷後面的IP地址是否可用.......
判斷IP可用的使用的網站是:
http://ip.chinaz.com/getip.aspx
然後將可以使用的IP地址寫入檔案即可