|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
今天给大家分享 《使用python构建ip代理池》 玩过爬虫的朋友都知道,在频繁抓取数据的时候,会遇到一个很致命的问题,那就是短时间内请求量过大导致ip被网站封禁,或许你会说,我们可以采用延时方法解决短时间请求过大的瓶颈,的确这未尝不是一个好的办法,但我相信大家听或见得更多更有效的方法应该是更换ip吧?好,那么随便在网上找几个ip代理当然也是可以的,但如果您运用了多线程或多进程同时进行呢?是不是就等于你在告诉服务器你目前正在采集它的资源呢?哈哈,在这种情况,我们可以选择ip代理池,顾名思义它就是一个ip地址列表,里面存放了大量的可用ip地址(代理)我们通过每次随机调用这些ip地址就可以达到在同一时间由多个不同地址向服务器发出请求的目的,从而完成数据收集,而我写的这个小程序呢正是用于构建ip地址池,想必大家都知道西刺的代理地址速度比较理想的吧?所以我的ip源地址就是在西刺获取的,那么....该扯的都扯完了,直接上代码吧!
getIP
- #coding:utf-8
- import requests,re,multiprocessing
- url = r'http://www.xicidaili.com/wt/{}'
- headers = { #头部信息
- 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
- }
- li = [] #用于接收并返回ip列表
- def test(): #用于抓取1-10页的可用ip
- # proxy = {"http":"http://222.134.134.250:8118"}
- for i in range(1,11):
- web_data = requests.get(url.format(i),headers = headers)
- re_ip = r'(?<=<td>)\d{1,3}[.].*?(?=</td>)'
- re_point = r'(?<=<td>)\d{1,8}(?=</td>)'
- re_find_ip = re.findall(re_ip,web_data.text)
- re_find_point = re.findall(re_point,web_data.text)
- for k,v in zip(re_find_ip,re_find_point):
- li.append("http://{}".format(k + ":" + v))
- return li
- def test_ip(dicts): #测试代理地址的连接速度,超时5秒自动丢弃,否则写入文件
- print("多线程启动.....")
- try:
- proxy = {'http':dicts}
- web_date = requests.get("http://www.baidu.com", headers=headers, timeout=5, proxies=proxy)
- if web_date.status_code == 200:
- with open('ip_list.conf','a+')as df:
- df.write(dicts+'\n')
- except :
- print('该ip连接不理想,已排除')
- if __name__=='__main__':
- pool = multiprocessing.Pool(processes=4)
- ip_list = test()
- pool.map(test_ip,ip_list)
- print('可用ip更新完毕.....')
复制代码
既然有了ip池,当然得有个测试的地方咯,要不然获取ip来干啥呢(哈哈。。。)本程序使用了多进程+随机选择停顿的时间+ip池代理(当然你也可以尝试随机ip代理囖,道理一样的)它的主要功能是刷一个网页,每次开跑4个进程,并返回状态码,当然我这仅仅用于测试,你要干啥事可以直接写代码咯......它每次请求访问该页面后会根据随机数生成的时间停顿,你可以自由选择停顿的时间,我比如啊,我现在写的是2秒钟到120秒之间的随机数,比如生成的随机数是10那就停顿10秒钟后换一个ip继续访问囖,随机数为100那就100秒,随机数为120那就是等待2分钟咯,如此类推,那么如果将ip也设置为随机从列表获取的话,效果会更佳,因为每次按顺序的话,服务器还是有可能知道你在干坏事的摁.....随机的话它压根就无法判断你是不是机器人,当然前提你需要伪装好headers,好了废话不说了,直接上测试用的代码吧!
注:以下这个小程序是用于测试的
- #coding:utf-8
- import requests,multiprocessing,time,random
- url = 'https://www.2345.com/?k285676'
- headers = { #头部信息
- 'Connection':'keep-alive',
- 'Host':'www.2345.com',
- 'If-Modified-Since':'Fri, 20 Jan 2017 12:00:52 GMT',
- 'If-None-Match':'22d68-5468566bfe500',
- 'User-Agent':'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.108 Safari/537.36 2345Explorer/8.3.1.14600'
- }
- def load_ip(): #载入并返回ip列表
- li = []
- with open('ip_list.conf','r')as df:
- line = df.readlines()
- for i in line:
- li.append(i.strip())
- return li
- def browse(ip_proxy): #启动ip池刷网页
- intRan = random.randint(2,120) #生成随机停顿的时间
- print(intRan)
- proxy = {
- 'http':ip_proxy
- }
- web_data = requests.get(url,headers = headers,proxies = proxy) #使用代理访问网页
- print(web_data.status_code)
- time.sleep(intRan) #停顿时长
- if __name__ == "__main__":
- ip_list = load_ip()
- pool = multiprocessing.Pool(processes=4) #使用多进程模块,并设置4个进程
- pool.map(browse,ip_list)
复制代码
|
|