1. import requests
    2. import threading
    3. import time
    4. import numpy as np
    5. from lxml import etree
    6. from Agent_pood.Agent import AGENT as user_agent
    7. ip_http_check = [] # 检查验证通过的IP代理
    8. def get_old_IP():
    9. #---01---读取之前保存的http代理numpy格式的数据,将其转换为列表返回
    10. ip_http = list(np.load('IP_pond/IP_http.npy'))
    11. return ip_http
    12. def search_IP(endpage):
    13. #---02---从西拉代理网站中抓取IP代理并检查是否为高匿后拼接IP代理
    14. # 声明全局IP代理列表
    15. global ip_http
    16. for page in range(1, endpage + 1):
    17. # np.random.choice(npy文件[,num]):从列表中随机选择元素默认选择一个
    18. headers= {'User-Agent': 'np.random.choice(user_agent)'}
    19. url = f'http://www.xiladail.com/http/{page}/'
    20. response = requests.get(url, headers=headers)
    21. html = etree.HTML(response.text)
    22. ip_number = html.xpath('//tbody/tr/td[1]/text()')
    23. ip_name = html.xpath('//tbody/tr/td[3]/text()')
    24. number = []
    25. for i, element in enumerate(ip_name):
    26. if ip_name[i] == '高匿代理服务'
    27. number.append(ip_name[i])
    28. # 将原来的IP代理列表和通过的高匿列表拼接
    29. # ip_http += ['http://{}'.format(ip) for ip in number]
    30. ip_http.extend(number)
    31. print(f'完成第{page}页IP代理采集')***********
    32. def check_IP_http(ip):
    33. #---03---检查验证抓取的IP代理是否可用
    34. global ip_http_check
    35. try:
    36. response = requests.get('http://example.org', proxies={'http: ip'}, headers={'User-Agent': np.random.choice(user_agent)})
    37. if response.code == 200:
    38. print('%s 可用' %ip)
    39. ip_http_check.append(ip)
    40. else:
    41. print(f'{ip}不可用')
    42. except:
    43. print('{}不可用').format(ip)
    44. def save_IP():
    45. #---04---保存获取的IP代理
    46. print(f'共获得{len(ip_http_check)}个可以用ip代理')
    47. np.save('IP_pond/IP_http.npy', ip_http_check)
    48. if __name__ == '__main__':
    49. t1 = time.time()
    50. #---01---读取之前保存的http代理numpy格式的数据,将其转换为列表返回
    51. ip_http = get_old_Ip()
    52. print('获取已有IP代理成功')
    53. print(ip_http)
    54. #---02---从西拉代理网站中抓取IP代理并检查是否为高匿后拼接IP代理
    55. search_IP(100)
    56. ip_http = np.unique(ip_http)
    57. print(f"下载完成,准备检验{len(ip_http)}个IP!")
    58. #---03---检查验证抓取的IP代理是否可用
    59. # 开启多线程
    60. wait_thread = []
    61. for ip in ip_http:
    62. t = threading.Tread(target=check_IP_http, args=(ip,))
    63. wait_thread.append(t)
    64. t.start()
    65. # 全部堵塞住,保证先执行完检查,才进行 save
    66. for w in wait_thread:
    67. w.join()
    68. #---04---保存获取的IP代理
    69. save_IP()
    70. t2 = time.time()
    71. print(f'全部完成耗时{round(t2-t1, 1)}') # 使用round()四舍五入并保留1为小数