愚公移山日记·14
今天练练手爬虫练习在前几篇博客中我写到了这金色天空的前两个基础练习,今天冲的是第三个练习ip封禁,IP封禁之后这个网站会禁止我们当前ip去访问网站。**大家说,页面做分页是因为单页内容太多。但分页还有一个不为人知的好处——用来反爬。当一个爬虫尝试不断翻页爬取所有内容的时候,行为特征会非常容易识别。比如说,对高频率访问的IP进行封禁。因为这是一个硬核的爬取攻防练习,常规高频封禁太弱了,所以这里的策略是:你的每个IP,只能访问一次,之后就会被封禁。悄悄地告诉你,你之前用过的IP,已经被悄悄记录了这里有一个网站,分了1000页,求所有数字的和。**题目就是这样感觉还挺欠其实自己对与这种题目是完全没有一点思路,虽然当时也有学习一些IP代理的知识,但是还是感觉力不从心,昨天有为大佬各位指点,说明了一下思路
- 从百度上先爬取一些免费的IP地址
- 检验IP地址是否可以使用
- 使用合法的IP去爬该网站
先来看一下我的第一步:从百度上爬取IP地址(最原始的代码)
import time
import requests
import re
from fake_useragent import UserAgent
def get_html(url):
count = 0
while True:
headers = {'user-agent':UserAgent().random}
response = requests.get(url,headers = headers)
if response.status_code == 200:
response.encoding = 'utf-8'
return response
else :
count += 1
if count == 3:
return
else:
continue
def get_infos(response):
num = re.findall('<td>(((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?):\d+)</td>',response.text,re.S)
return num
def write_txt(info):
with open('luck.txt','a+',encoding='utf-8') as f:
info = str(info)
f.write(info+ '\n')
if __name__ == '__main__':
urls = ['http://www.xiladaili.com/gaoni/{}/'.format(str(i)) for i in range(1,999)]
for url in urls :
response = get_html(url)
if response == None:
continue
num = get_infos(response)
write_txt(num)
time.sleep(1)
这就是我写的代码,其实代码有很多臃肿的地方,有好多的是不必要的代码,包括re.S其实不带也完全可以,还有一点正则表达式也是很不够完美的如下:
其实大家也看出来了这段正则表达式是有问题的,不能完整的把我们所需要的IP地址合理的提取出来,当我一直在寻找去更完美的去写正则表达式,一为大佬很明确的指出一点正则匹配时候位置比约束更重要大佬给出来的代码更为简洁:
不能一直深陷td之中不能自拔。
后记
今天刚开始的时候其实爬取的并不是这个网站,而是使用的西刺代理,但是当时测试的次数太多而且刚开始的时候爬虫其实也不很规范,就让人家给发现,把我的IP也封禁了。
明天清明节争取把下一个步骤去解决。