python ip动态代理_Python实现爬取可用代理IP

Python实现爬取可用代理IP,在实现爬虫时,动态设置代理IP可以有效防止反爬虫,但对于普通爬虫初学者需要在代理网站上测试可用代理IP。由于手动测试过程相对比较繁琐,且重复无用过程故编写代码以实现动态抓取可用的代理IP。动态代理IP保存在Json文件中,以供后续具体项目爬虫使用,但所爬取的代理IP是免费IP,所以可能出现当时爬取能用,过一段时间无法使用的情况。

 

1) 先从ip精灵网站上爬取前10页,速度较快的IP,保存到proxies数组中,其中proxy使用的是requests.get()可直接使用字典格式

'''

遇到不懂的问题?Python学习交流群:821460695满足你的需求,资料都已经上传群文件,可以自行下载!

'''

print("Start find proxy in xichi...")

headers = {

'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) '

'AppleWebKit/537.36 (KHTML, like Gecko) '

'Chrome/60.0.3112.101 Safari/537.36'

}

# 保存西刺代理的IP汇总数组

proxies = []

for num in range(1,10):

# 西刺代理网站

response = requests.get("http://www.xicidaili.com/nn/%d"%(num),headers=headers)

soup = BeautifulSoup(response.text,"lxml")

ipInfos = soup.select('#ip_list > tr')

for ipInfo in ipInfos[1:]:

ipInfo = ipInfo.select("td")

if ipInfo[6].select("div > div")[0].get("class")[1] == "fast":

# 处理网页代理信息数据

ip = ipInfo[1].get_text().strip()

port = ipInfo[2].get_text().strip()

prc = ipInfo[5].get_text().strip().lower()

# 组合成requests要求的代理参数格式,格式字典形式如下

# proxies = {'https':'https://112.114.93.50:8118','http':'https://122.72.18.34:80'}

# 协议:协议://ip:端口

proxy = dict()

proxy[prc] = prc + "://" + ip + ":" + port

proxies.append(proxy)

time.sleep(random.randint(1, 5))

print("proxies counts is %d"%(len(proxies)))

使用proxies,模拟浏览器打开百度首页,如果返回status_code为200,就认为此代理可用,即可保存后续使用。

print("Starting test proxies...")

'''

遇到不懂的问题?Python学习交流群:821460695满足你的需求,资料都已经上传群文件,可以自行下载!

'''

# 记录当前已找到可用IP数目

okIpNum = 0

for proxy in proxies:

# 随机使用不同的userAgent

userList = userAgentList.userList

headers = {'User-Agent': userList[random.randint(0, len(userList)-1)]}

# request发送请求时使用不同的userAgent,同时带入测试IP代理

# 如出现异常则直接跳过,可能出现连接超市的异常等

try:

text_web = requests.get("https://www.baidu.com/",headers = headers, proxies = proxy)

except:

print(proxy," unuseable")

continue

if text_web.status_code == 200:

with open(filename, "a+") as f:

js = json.dumps(proxy)

f.write(js)

print(proxy, "useable")

okIpNum += 1

# 判断已经找到可食用的IP数目,从而退出程序

if okIpNum == needCount:

print("Already find %d useable proxies"%(okIpNum))

break

time.sleep(random.randint(1,3))

此爬取方法还是用动态设置UserAgent,以及爬取过程随机sleep,以避免被服务器禁用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值