爬蟲代理設定--爬取ip池、驗證ip是否可用、驗證代理ip是否能用
阿新 • • 發佈:2019-02-03
昨天在爬取大眾點評的時候,剛開始還好好的,但一會就把我的ip給封啦,所以我就想給自己弄一個ip池,這樣我就可以繼續爬啦。網上找了一堆程式碼,發現好多都是python2的,它們請求使用urllib2的庫,這個庫在python3中合併成urllib,所以很多方法呼叫都出現錯誤,所以我還是決定用requests。
一、獲得代理ip
def get_ip_list(obj): ip_text = obj.findAll('tr', {'class': 'odd'}) # 獲取帶有IP地址的表格的所有行 ip_list = [] for i in range(len(ip_text)): ip_tag = ip_text[i].findAll('td') ip_port = ip_tag[1].get_text() + ':' + ip_tag[2].get_text() # 提取出IP地址和埠號 ip_list.append(ip_port) print("共收集到了{}個代理IP".format(len(ip_list))) print(ip_list) return ip_list url = 'http://www.xicidaili.com/' headers = { 'User-Agent': 'User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36'} request = Request(url, headers=headers) response = urlopen(request) bsObj = BeautifulSoup(response, 'lxml') # 解析獲取到的html lists=get_ip_list(bsObj)
二、驗證是否可用
def valVer(proxys): badNum = 0 goodNum = 0 good=[] for proxy in proxys: try: proxy_host = proxy protocol = 'https' if 'https' in proxy_host else 'http' proxies = {protocol: proxy_host} response = requests.get('http://www.baidu.com', proxies=proxies, timeout=2) if response.status_code != 200: badNum += 1 print (proxy_host, 'bad proxy') else: goodNum += 1 good.append(proxies) print (proxy_host, 'success proxy') except Exception as e: print( e) # print proxy_host, 'bad proxy' badNum += 1 continue print ('success proxy num : ', goodNum) print( 'bad proxy num : ', badNum) return good
三、檢查代理ip是否可用
res =requests.get('http://icanhazip.com/', proxies=go[0])
print (res.content)
注:我在找資料的時候我發現一個庫fake_useragent,這個庫可以偽裝請求頭,具體用法
這樣就可以偽裝自己。from fake_useragent import UserAgent ua = UserAgent() #ie瀏覽器的user agent print(ua.ie) #opera瀏覽器 print(ua.opera) #chrome瀏覽器 print(ua.chrome) #firefox瀏覽器 print(ua.firefox) #safri瀏覽器 print(ua.safari) #最常用的方式 #寫爬蟲最實用的是可以隨意變換headers,一定要有隨機性。支援隨機生成請求頭 print(ua.random) print(ua.random) print(ua.random)