運行環境:python 3.7.3
所需庫:
- requests
- lxml
- time
- multiprocessing
- sys
說明:西刺代理對一天內爬取的次數有限制,超出後會被封ip
import requests
from lxml import etree
import time
from multiprocessing import Pool
import multiprocessing
import sys
def get_single(url): #爬出單頁上的所有代理ip
r=requests.get(url,headers=head)
if r.status_code==503:
print('由於爬取次數過多,你的Ip已經被封')
sys.exit(0)
content=etree.HTML(r.text)
ip=content.xpath('//table[@id="ip_list"]/tr/td[2]/text()')
duankou=content.xpath('//table[@id="ip_list"]/tr/td[3]/text()')
for i in range(0,len(ip)):
ip_list.append(ip[i]+":"+duankou[i])
def input_urls(): #防止ip被封每三秒訪問一頁
for i in range(1,21):
get_single(url+str(i))
print('爬取第'+str(i)+'頁\r',end="")
time.sleep(3)
def verify_ips(ip,ip_valid_list): #驗證代理ip
poxie="http://"+ip
proxies={
'http':poxie,
'https':poxie
}
try:
requests.get('https://www.baidu.com',headers=head,proxies=proxies,timeout=3)
ip_valid_list.append(ip)
except Exception as e :
print(e)
ip_list=[]
url="https://www.xicidaili.com/nn/"
head={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'}
if __name__ == "__main__":
print(
"""
程序結束後會在當前文件夾生成一個ip_proxies_valid.txt文件,
防止ip被封,控制爬取頻率
"""
)
mlist=multiprocessing.Manager()
ip_valid_list=mlist.list()
input_urls()
print("總共爬取到"+str(len(ip_list))+"個ip,接下來準備驗證ip有效性")
print("驗證倒計時3s")
time.sleep(1)
print("驗證倒計時2s")
time.sleep(1)
print("驗證倒計時1s")
time.sleep(1)
print("開始驗證!")
p=Pool(15)
for ip in ip_list:
p.apply_async(verify_ips,(ip,ip_valid_list)) #多進程驗證
p.close()
p.join()
f=open('ip_proxies_valid.txt','a')
for ip in ip_valid_list: #寫入txt文件
f.write(ip)
if ip!=ip_valid_list[-1]:
f.write('\n')
f.close()
print("完成")
爬取到的有效代理ip如下圖所示