本次是一个临时项目,因为需要代理IP进行项目中的测试,所以本次只是写了一个高耦合性的脚本。
我比较喜欢使用虚拟解释器,整理三方库比较清晰
依赖安装
pip install requests
pip install beautifulsoup4
一、爬取免费代理池
这里选用的https://www.kuaidaili.com/free/的开放代理。
使用reguests库直接get发现403 Forbidden,添加一个user-agent伪装浏览器。
import requests
url = 'https://www.kuaidaili.com/free/'
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit 537.36 (KHTML, like Gecko) Chrome"
}
html = requests.get(url, headers=headers)
print(html.text)
成功打印HTML
分析HTML后发现ip和端口都在表格内非常好处理,
使用beautifulsoup库处理
处理过程写在注释
soup = BeautifulSoup(html.text, features="html.parser")
# 获取所有行
data = soup.select('.table-bordered tr')
# 循环处理每一行
for value in data:
# 获取所有列
td = value.select('td')
# 如果是表格主体(非表头)则进行处理
if td is not None:
ip = ''
port = ''
# 循环处理每一列,获取IP和端口
for v in td:
if v['data-title'] == 'IP':
ip = v.string
if v['data-title'] == 'PORT':
port = v.string
# 清理空的IP或端口
if ip != '' and port != '':
# 写入ip.txt
with open("ip.txt", "a") as f:
f.write(ip+':'+port+'\n')
print('抓取到'+ip+':'+port+'并写入文件')
然后将其封装成获取器
然后处理分页
本来还以为需要分析
结果这个网站的分页是路由控制 那就省力了 直接拼接url就好了
然后写出分页器这里由于本项目需求没有抓取全部页面,所以靠for循环来控制页面
# 分页器
def pagination(start, end, sleep):
for page in range(start, end):
print('开始抓取第' + str(page) + '页的内容...')
url = "https://www.kuaidaili.com/free/inha/" + str(page) + "/"
spider(url)
# 防止快速请求导致的问题设置睡眠时间
time.sleep(sleep)
整个爬虫及整理数据的代码如下
import time
import requests
from bs4 import BeautifulSoup
# 获取器
def spider(url):
# url = 'https://www.kuaidaili.com/free/'
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit 537.36 (KHTML, like Gecko) Chrome"
}
html = requests.get(url, headers=headers)
soup = BeautifulSoup(html.text, features="html.parser")
# 获取所有行
data = soup.select('.table-bordered tr')
# 循环处理每一行
for value in data:
# 获取所有列
td = value.select('td')
# 如果是表格主体(非表头)则进行处理
if td is not None:
ip = ''
port = ''
# 循环处理每一列,获取IP和端口
for v in td:
if v['data-title'] == 'IP':
ip = v.string
if v['data-title'] == 'PORT':
port = v.string
# 清理空的IP或端口
if ip != '' and port != '':
# 写入ip.txt
with open("ip.txt", "a") as f:
f.write(ip + ':' + port + '\n')
print('抓取到' + ip + ':' + port + '并写入文件')
# 分页器
def pagination(start, end, sleep):
for page in range(start, end):
print('开始抓取第' + str(page) + '页的内容...')
url = "https://www.kuaidaili.com/free/inha/" + str(page) + "/"
spider(url)
# 防止快速请求导致的问题设置睡眠时间
time.sleep(sleep)
if __name__ == "__main__":
pagination(1, 200, 3)
运行后我们就拥有了一份ip.txt文件内存在200页的代理IP
二、IP清洗
这里我打算分两个脚本来执行,原因是设置睡眠时间会导致抓取的过程较长。两个脚本可以同步进行。
创建cleaner.py
清理器
def ip_cleaner(ip):
try:
requests.get('业务上需要检查的链接', proxies={"http": "http://" + ip})
except:
return 0
else:
return 1
主程序
import requests
def main():
with open("ip.txt", "r") as ins:
for line in ins:
# 清理换行符
line = line.strip('\n')
# 执行查询
res = ip_cleaner(line)
if res:
with open("clear_ip.txt", "a") as f:
f.write(line + '\n')
print(line + ' success')
else:
print(line + ' failed')
def ip_cleaner(ip):
try:
requests.get('https://telegram.org/', proxies={"http": "http://" + ip})
except:
return 0
else:
return 1
if __name__ == "__main__":
main()
这样整个爬取加清洗的过程就完成了。