Python在做網站爬取工具時,IP池處理

Python在做網站爬取工具時,IP池處理

其原理及大致流程是:

1 首先利用自己的IP去抓取1次,當前只需要抓1次
2 判斷每個IP是否可用,將所有可用IP形成自己的IP池
3 將IP池寫到本地配置文件裏
4 因爲網站上IP不時實時公佈的,每隔1小時(或30分鐘),再重新抓1次,更新自己的IP池

代碼如下

from urllib.request import urlopen, Request
from bs4 import BeautifulSoup
from fake_useragent import UserAgent
import requests


# 提取網站url上面的IP、端口、協議
# INPUT:免費的網,以'http://www.xicidaili.com/'爲例
# OUTPUT: 返回可用的代理,以詞典形式返回:Key-Value 對應 IP:Port-Protocol
def crawl_ip(url):
    user_agent = "User-Agent:" + UserAgent().random  # 利用UserAgent獲取隨機應用
    headers = {'User-Agent': user_agent}
    request = Request(url, headers=headers)
    response = urlopen(request)
    bs_obj = BeautifulSoup(response, 'lxml')  # 解析獲取到的html
    return get_ip_dict(bs_obj)


# INPUT: obj, 通過BeautifulSoup函數,以lxml形式解析html文件獲取
# OUTPUT: 返回可用的代理,以詞典形式返回:Key-Value 對應 IP:Port-Protocol
def get_ip_dict(obj):
    ip_text = obj.findAll('tr', {'class': 'odd'})  # 獲取帶有IP地址的表格的所有行
    ip_dict = {}
    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_protocol = ip_tag[5].get_text()  # 提取對應的協議
        if is_available_ip(ip_port, ip_protocol) and ip_protocol != 'socks4/5':  # 除去SOCK通信,只保留HTTP,HTTPS
            ip_dict[ip_port] = ip_protocol
    return ip_dict


# 判斷IP是否可用,用‘www.baidu.com’來測試
# INPUT: ip地址及端口, IP協議
# OUTPUT: 當IP有效時,返回真
def is_available_ip(ip_port, ip_protocol):
    proxies = {ip_protocol: ip_port}
    response = requests.get('http://www.baidu.com', proxies=proxies, timeout=10)
    if response.status_code == 200:
        return True

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章