您的位置:首页 > 编程语言 > Python开发

Python中抓取代理IP并测试

2017-11-28 00:18 513 查看
刚学Python,Python这种工具嘛,当然是用来做爬虫啦。但是爬虫有爬取策略,网站制作者也有反爬取策略,所以为了能够愉快的抓取数据,就不得不让自己的爬虫更加像人

爬虫的所谓的伪装,第一个,伪装header头的User-Agent,没什么意思,比较简单,事先弄好几个header头放在代码里,然后在合适的时候,比如说已经抓取了一页的数据,这个时候,就可以换换header头了:

#coding:utf-8
'''
@Created on 2017-11-25 16:5
4000
4:12

@author: 许瑞锐
'''
list= [
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
"Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
"Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
]


这里可以封装成函数然后直接调用,随机更换一个header头,如果使用默认的header头简直就是在告诉人家:“我就是个爬虫啊,快点ban掉我啊”,像西祠网如果不加header头访问的话就会弹出503错误

然而header头能起到的作用非常小,就只能骗下非常非常菜的程序员或者是一些根本不做反爬策略的网站,所以这个时候我们就需要加代理。代理是啥子呢?顾名思义,代理访问。当爬虫想要高速的抓取数据的时候很容易遭到网站后台的禁止,因为普通人根本手速没那么快,但是代码可以啊。当你发现有个ip在以一秒钟一百个页面的浏览速度查看你的网站的时候,你肯定明白这是个爬虫。而代理的作用就是“换脸”,将访问的来源ip直接代理了,这时爬虫的ip都改变了,网站后台自然识别不出来。

# -*- coding: utf-8 -*-
'''
@Created on 2017-11-25 16:31:36

@author: 许瑞锐
'''
import random,requests,time,re
from spider import user_agent,database

def get_random_header():
headers={'User-Agent':random.choice(user_agent.list),'Accept':"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",'Accept-Encoding':'gzip'}
return headers

def   scraw_proxies(page_num,scraw_url="http://www.xicidaili.com/nt/"):
scraw_ip=list()
available_ip=list()
for page in range(1,page_num):
print("抓取第%d页代理IP" %page)
url=scraw_url+str(page)
r=requests.get(url,headers=get_random_header())
r.encoding='utf-8'
pattern = re.compile('<td class="country">.*?alt="Cn" />.*?</td>.*?<td>(.*?)</td>.*?<td>(.*?)</td>', re.S)
scraw_ip= re.findall(pattern, r.text)
for ip in scraw_ip:
if(test_ip(ip)==True):
print('%s:%s通过测试,添加进可用代理列表' %(ip[0],ip[1]))
available_ip.append(ip)
else:
pass
print("代理爬虫暂停10s")
time.sleep(10)
print("爬虫重启")
print('抓取结束')
return available_ip

if __name__=="__main__":
available_ip=scraw_proxies(3)


我这上的是西刺网这个免费代理网站,scraw_proxies()这个函数就是用来爬取里面的免费代理的,爬取过程也很容易,就是老一套的正则表达式或者用beautifulsoup也行,不过我查看西刺网的网页源码的时候发现它前端代码写的不是很规范,于是放弃bs了上网找了个正则表达式抄下来。但是有个问题,我如何验证爬取的代理是可用可靠的呢?没错,test_ip()函数就是干这个活的。

def test_ip(ip,test_url='http://2017.ip138.com/ic.asp',time_out):
proxies={'http': ip[0]+':'+ip[1]}
try_ip=ip[0]
#print(try_ip)
try:
r=requests.get(test_url,headers=get_random_header(),proxies=proxies,timeout=time_out)
if r.status_code==200:
r.encoding='gbk'
result=re.search('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}',r.text)
result=result.group()
if result[:9]==try_ip[:9]:
print(r.text)
print('测试通过')
return True
else:
print('%s:%s 携带代理失败,使用了本地IP' %(ip[0],ip[1]))
return False
else:
print('%s:%s 请求码不是200' %(ip[0],ip[1]))
return False
except:
print('%s:%s 请求过程错误' %(ip[0],ip[1]))
return False


这个函数就是验证代理的有效性的啦。思路是这样的,爬虫让代理访问能够查询IP的网站,如果返回的status_code为200且用正则表达式抓取下的IP地址确实为代理的IP地址,那么这个代理才是确实有效。嗯,网上很多教程让访问百度的网站,如果返回的status_code==200那么就认为代理有效,其实这样不对,我亲身体验了下,发现抓取下来的代理拿去访问百度都能用,我心想不对啊,免费代理成功率不可能这么高啊。于是改了下代码,代理拿去访问你的IP,发现成功的全TM是我自己的ip,我自己的IP访问百度当然没TM的问题了,这是个很诡异的问题,如果你的代理不成功那么就会默认使用你自己的IP访问网站。于是我改变策略,用代理访问查询IP的网站你的IP,再抓取查询IP网站上显示的IP,如果前几位能对上那就说明加代理访问成功啦(事实上大部分代理都不可用)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 爬虫 代理ip