[success]我们都知道很多网站都有反爬机制,其中一种就是限制ip的访问频率,上次我爬百度的图片的时候就是这样的,只爬了300多站就被封了,所以我们需要通过代理ip来切换自己的ip这样就不至于被封了。[/success]
当然,有很多代理ip要钱的,虽然有免费的代理ip但是很多都非常不稳定,但是我太穷了,所以我们需要通过Python的爬虫去爬免费代理ip的网站,然后在分别验证ip是否可用,可用的话就保存到我们的数据库中,以后需要用到代理ip时我们就可以直接用就行了,不过目前我还不需要用到这个东西,所以只是随便做了一个案例来说明具体怎么操作,以后需要的时候在自己搭一个代理ip池吧。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import requests, threading, datetime
from bs4 import BeautifulSoup
from threading import Thread
iplist = []
hostlist = []
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36'}
def getip():
for i in range(2, 50):#获取2-50页的IP地址
target = 'https://www.xicidaili.com/wn/' + str(i)
req = requests.get(url=target, headers=headers)
text = BeautifulSoup(req.text, 'lxml').find_all('tr')
for each in range(1, len(text)):
iplist.append(text[each].find_all('td')[1].string)
hostlist.append(text[each].find_all('td')[2].string)#对内容进行处理获得IP地址和端口
threads = []
for a in range(len(iplist)): # 这里是多线程的代码
t = Thread(target=testip(iplist[a], hostlist[a])) # 把函数加到线程里面
t.start() # 开始线程
threads.append(t) # 把线程都加到列表里面,方便后面判断是否下载完毕
for t in threads:
t.join() # 这里就是等待线程结束的代码
print("验证下一波ip地址")
iplist.clear()#把内容清空,继续爬下一页的ip地址
hostlist.clear()
def testip(ip, host):
targeturl = 'https://baidu.com'
proxies = {"https": "https://" + ip + ":" + host} # 代理ip
try:
response = requests.get(url=targeturl, proxies=proxies, headers=headers, timeout=5).status_code
if response == 200:#代理ip很简单,只需要加上proxies这个参数就可以了
print(ip + ":" + host)
else:
print('0', end='')
except:
print('0', end='')#这里用到了错误和异常处理,防止程序报错而自动退出
if __name__ == "__main__":
getip()