python实现ip代理池功能示例


Posted in Python onJuly 05, 2019

本文实例讲述了python实现ip代理池功能。分享给大家供大家参考,具体如下:

爬取的代理源为西刺代理。

  • 用xpath解析页面
  • 用telnet来验证ip是否可用
  • 把有效的ip写入到本地txt中。当然也可以写入到redis、mongodb中,也可以设置检测程序当代理池中的ip数不够(如:小于20个)时,启动该脚本来重新获取ip,本脚本的代码也要做相应的改变。
# !/usr/bin/env python
# -*- coding: utf-8 -*-
# @Version   : 1.0
# @Time     : 2018/10/23 上午10:40
# @Author    : Yeoman
# @Description :
import urllib.request
import lxml.etree
import telnetlib
import os
headers = {
  'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36'
}
def get_proxy(page_num):
  # 获取页面
  req = urllib.request.Request('http://www.xicidaili.com/nn/{}'.format(page_num), headers=headers) # 构造request请求
  response = urllib.request.urlopen(req) # 发送请求
  html = response.read()
  html = html.decode('utf-8')
  # print(html)
  # 解析页面
  proxy_list = []
  selector = lxml.etree.HTML(html)
  rows = selector.xpath('//*[@id="ip_list"]//tr')
  rows_total = len(rows)
  row_xpath_head = '//*[@id="ip_list"]//tr['
  row_ip_xpath_tail = ']/td[2]/text()'
  row_port_xpath_tail = ']/td[3]/text()'
  for i in range(1, rows_total):
    ip_xpath = row_xpath_head + str(i+1) + row_ip_xpath_tail
    port_xpath = row_xpath_head + str(i+1) + row_port_xpath_tail
    ip = selector.xpath(ip_xpath)[0]
    port = selector.xpath(port_xpath)[0]
    ip_port = ip + ':' + port
    proxy_list.append(ip_port)
  return proxy_list
# 检测代理ip是否可用
def test_proxy_ip_port(proxy_ip_port):
  print('当前代理ip:{}'.format(proxy_ip_port))
  ip_port = proxy_ip_port.split(':')
  ip = ip_port[0]
  port = ip_port[1]
  # 用telnet来验证ip是否可用
  try:
    telnetlib.Telnet(ip, port, timeout=10)
  except:
    return False
  else:
    return True
# 把有效的ip写入本地
def write_ip(proxy_ip):
  with open('./ip.txt', 'a') as f:
    f.write(proxy_ip + '\n')
# 删除文件
def del_file():
  file_path = './ip.txt'
  if os.path.exists(file_path):
    os.remove(file_path)
def run():
  del_file()
  proxy_ip_port_list = []
  for i in range(1, 6): # 前5页
    proxy_ip_port_list += get_proxy(i)
  for i in range(100): # 一页有100条
    proxy_ip_port = proxy_ip_port_list[i]
    is_valid = test_proxy_ip_port(proxy_ip_port)
    print(is_valid)
    if is_valid:
      # 写入ip到本地
      write_ip(proxy_ip_port)
if __name__ == '__main__':
  run()

更多关于Python相关内容可查看本站专题:《Python Socket编程技巧总结》、《Python正则表达式用法总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python3实现连接SQLite数据库的方法
Aug 23 Python
Python中规范定义命名空间的一些建议
Jun 04 Python
深入解析Python中的descriptor描述器的作用及用法
Jun 27 Python
Python基于pillow判断图片完整性的方法
Sep 18 Python
浅谈python import引入不同路径下的模块
Jul 11 Python
Python中pip更新和三方插件安装说明
Jul 08 Python
python去掉 unicode 字符串前面的u方法
Oct 21 Python
使用python serial 获取所有的串口名称的实例
Jul 02 Python
Python 用三行代码提取PDF表格数据
Oct 13 Python
python中tkinter窗口位置\坐标\大小等实现示例
Jul 09 Python
详解pycharm的python包opencv(cv2)无代码提示问题的解决
Jan 29 Python
Python如何利用正则表达式爬取网页信息及图片
Apr 17 Python
解决yum对python依赖版本问题
Jul 05 #Python
python写入文件自动换行问题的方法
Jul 05 #Python
Python Numpy计算各类距离的方法
Jul 05 #Python
ERLANG和PYTHON互通实现过程详解
Jul 05 #Python
python如何读取bin文件并下发串口
Jul 05 #Python
anaconda如何查看并管理python环境
Jul 05 #Python
python笔记之mean()函数实现求取均值的功能代码
Jul 05 #Python
You might like
php中替换字符串函数strtr()和str_repalce()的用法与区别
2016/11/25 PHP
详解PHP防止盗链防止迅雷下载的方法
2017/04/26 PHP
对laravel的session获取与存取方法详解
2019/10/08 PHP
HTML5如何适配 iPhone IOS 底部黑条
2021/03/09 HTML / CSS
javascript实现数字验证码的简单实例
2014/02/10 Javascript
Js Jquery创建一个弹出层可加载一个页面
2014/05/08 Javascript
jquery缓动swing liner控制动画过程不同时刻的速度
2014/05/29 Javascript
JavaScript中的ParseInt("08")和“09”返回0的原因分析及解决办法
2016/05/19 Javascript
AngularJS实践之使用NgModelController进行数据绑定
2016/10/08 Javascript
扩展bootstrap的modal模态框-动态添加modal框-弹出多个modal框
2017/02/21 Javascript
完美实现js焦点轮播效果(二)(图片可滚动)
2017/03/07 Javascript
几种响应式文字详解
2017/05/19 Javascript
Vue.js用法详解
2017/11/13 Javascript
vue.js 中使用(...)运算符报错的解决方法
2018/08/09 Javascript
ES6小技巧之代替lodash
2019/06/07 Javascript
JS实现的进制转换,浮点数相加,数字判断操作示例
2019/11/09 Javascript
vue或react项目生产环境去掉console.log的操作
2020/09/02 Javascript
布同 Python中文问题解决方法(总结了多位前人经验,初学者必看)
2011/03/13 Python
使用python检测手机QQ在线状态的脚本代码
2013/02/10 Python
使用Python的Flask框架实现视频的流媒体传输
2015/03/31 Python
简单总结Python中序列与字典的相同和不同之处
2016/01/19 Python
python实现多线程的两种方式
2016/05/22 Python
用Python写一个无界面的2048小游戏
2016/05/24 Python
PyQt5每天必学之日历控件QCalendarWidget
2018/04/19 Python
Python Learning 列表的更多操作及示例代码
2018/08/22 Python
Python使用post及get方式提交数据的实例
2019/01/24 Python
Python传递参数的多种方式(小结)
2019/09/18 Python
使用pyecharts1.7进行简单的可视化大全
2020/05/17 Python
Toppik顶丰增发纤维官网:解决头发稀疏
2017/12/30 全球购物
医生党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
2014年财务人员工作总结
2014/11/11 职场文书
2014年应急工作总结
2014/12/11 职场文书
《认识年月日》教学反思
2016/02/19 职场文书
MySQL入门命令之函数-单行函数-流程控制函数
2021/04/05 MySQL
「睡美人」爱洛公主粘土人开订
2022/03/22 日漫
Python开发简易五子棋小游戏
2022/05/02 Python