使用爬虫在爬取一些大网站的时候,总会出现被反爬技术阻碍的情况,限制IP就是其中一种.
那么使用代理就是很好的解决方案.
作为一个穷的裤兜比脸干净的人(博主每天洗脸,不要怀疑这一点),花钱去买代理就不在考虑范围内了
那么,度娘就告诉我好几个提供免费IP代理的网站
本次爬取的是西刺代理,虽然西刺提供了接口,但是使用并不好用,经常无响应,接口不能用,就只能自己动手啦
第一步:先搞下来他的网页在说
import requests
response = requests.get("http://www.xicidaili.com/")
response.encoding = "utf-8"
if response.status_code == 200:
# print(response.text)
print("响应成功")
else:
print("响应失败")
直接打印响应页面失败,测试以下响应状态,失败...
第一次上你就给我响应失败?
浏览器没问题,大致猜测了以下应该是python自带的UserAgent被识别了,改进一下
def rand_userAgent():
#我自己用正则弄的一个UA池,大家也可以自己动手做一个
UserAgentList = [{'User-Agent': 'Mozilla/5.0(Macintosh;U;IntelMacOSX10_6_8;en-us)AppleWebKit/534.50(KHTML,likeGecko)Version/5.1Safari/534.50'}, {'User-Agent': 'Mozilla/5.0(Windows;U;WindowsNT6.1;en-us)AppleWebKit/534.50(KHTML,likeGecko)Version/5.1Safari/534.50'}, {'User-Agent': 'Mozilla/5.0(compatible;MSIE9.0;WindowsNT6.1;Trident/5.0;'}, {'User-Agent': 'Mozilla/4.0(compatible;MSIE8.0;WindowsNT6.0;Trident/4.0)'}, {'User-Agent': 'Mozilla/4.0(compatible;MSIE7.0;WindowsNT6.0)'}, {'User-Agent': 'Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1)'}, {'User-Agent': 'Mozilla/5.0(Macintosh;IntelMacOSX10.6;rv:2.0.1)Gecko/20100101Firefox/4.0.1'}, {'User-Agent': 'Mozilla/5.0(WindowsNT6.1;rv:2.0.1)Gecko/20100101Firefox/4.0.1'}, {'User-Agent': 'Opera/9.80(Macintosh;IntelMacOSX10.6.8;U;en)Presto/2.8.131Version/11.11'}, {'User-Agent': 'Opera/9.80(WindowsNT6.1;U;en)Presto/2.8.131Version/11.11'}, {'User-Agent': 'Mozilla/5.0(Macintosh;IntelMacOSX10_7_0)AppleWebKit/535.11(KHTML,likeGecko)Chrome/17.0.963.56Safari/535.11'}, {'User-Agent': 'Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;Maxthon2.0)'}, {'User-Agent': 'Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;TencentTraveler4.0)'}, {'User-Agent': 'Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1)'}, {'User-Agent': 'Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;TheWorld)'}, {'User-Agent': 'Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;Trident/4.0;SE2.XMetaSr1.0;SE2.XMetaSr1.0;.NETCLR2.0.50727;SE2.XMetaSr1.0)'}, {'User-Agent': 'Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;360SE)'}, {'User-Agent': 'Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;AvantBrowser)'}, {'User-Agent': 'Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1)'}]
return random.choices(UserAgentList)[0]
#向一个url发起请求,成功返回文本,不成功继续发起请求
def get_one_page(url):
print("发起请求")
userAgent = rand_userAgent()
response = requests.get(url,headers=userAgent)
response.encoding = "utf-8"
if response.status_code == 200:
# print(response.text)
print("响应成功")
return response.text
else:
print("响应失败")
#如果一直响应失败会超出递归最大层数,导致程序崩溃.
#此处并不打算来解决这个问题,毕竟玩具代码,不影响实用
return get_one_page(url)
封装两个函数,一个随机出UserAgent,另一个获取网页信息.
修改了UserAgent之后果然就没问题了,至此,网页就被我们搞下来了,IP就在我们手中拿着了,但是还有一堆杂质,我们需要清洗一下.
第二步:提取出IP,保存成json格式
首先我们先来看下html的格式,截取了两段,贴上来.
<tr class="odd">
<td class="country"><img src="http://fs.xicidaili.com/images/flag/cn.png" alt="Cn" /></td>
<td>175.148.71.249</td>
<td>1133</td>
<td>辽宁葫芦岛</td>
<td class="country">高匿</td>
<td>HTTP</td>
<td>59天</td>
<td>2分钟前</td>
</tr>
<tr class="">
<td class="country"><img src="http://fs.xicidaili.com/images/flag/cn.png" alt="Cn" /></td>
<td>180.118.240.155</td>
<td>808</td>
<td>江苏镇江</td>
<td class="country">高匿</td>
<td>HTTPS</td>
<td>467天</td>
<td>3分钟前</td>
</tr>
格式还是很清晰的,那么直接上数据匹配的大杀器-正则表达式
我们只需要IP,端口号,协议类型这三个元素,所以我们只提取这三个就可以了
str1 = '<td class="country"><img[\s\S]+?<td>'
#ip
str2 = '</td>[\s\S]*?<td>'
#端口号
str3 = '</td>[\s\S]*?<td>[\s\S]*?<td>'
#协议类型
str4 = '</td>'
regex = str1+"([\s\S]*?)"+str2+"([\s\S]*?)"+str3+"([\s\S]*?)"+str4
IP_List = re.findall(regex, 网页文本)
上下对照,写了个简单粗暴的正则表达式,
测试一下,IP果然被提取出来了.
至此,我们的代理IP都提取出来了.但是并不是所有的IP都可用,我们还需要测试一些
第三步:剔除不能使用的IP
使用每个IP对百度发起请求,返回响应码,不是200的全部删掉
不多说 ,直接贴代码
def ip_pool(IP_list):
for i in IP_list:
#如果IP不可用,从IP_list中删除
if not test_ip(i[0],i[1]):
print(i,"不可用")
IP_list.remove(i)
#返回筛选后的IP_list
return IP_list
#对每一个IP进行测试
def test_ip(ip,port):
server = ip+":"+port
proxies = {'http': 'http://' + server, 'https': 'https://' + server}
try:
r = requests.get('https://www.baidu.com/', proxies=proxies,timeout=1)
if r.status_code == 200:
return 1
else:
return 0
except:
return 0
这样,我们的IP_list里边的IP都是可以用的了,我们在把它保存到数据库或写入一个文件就可以了
我是转换成json格式写入到一个文件中的,方法很简单,在这就不贴代码了
最后,附上源码地址:https://gitee.com/ldw295/crawl_free_agent_ip
如果对你有些作用,欢迎点赞,评论,看到后我会及时回复