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 相关文章推荐
以911新闻为例演示Python实现数据可视化的教程
Apr 23 Python
Python下的Softmax回归函数的实现方法(推荐)
Jan 26 Python
python数据类型_字符串常用操作(详解)
May 30 Python
python实现分页效果
Oct 25 Python
python中文乱码不着急,先看懂字节和字符
Dec 20 Python
Python语言描述随机梯度下降法
Jan 04 Python
python面向对象多线程爬虫爬取搜狐页面的实例代码
May 31 Python
浅谈Pycharm中的Python Console与Terminal
Jan 17 Python
PyQt5内嵌浏览器注入JavaScript脚本实现自动化操作的代码实例
Feb 13 Python
给你一面国旗 教你用python画中国国旗
Sep 24 Python
python实现tail -f 功能
Jan 17 Python
pycharm 2020 1.1的安装流程
Sep 29 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
解析PayPal支付接口的PHP开发方式
2010/11/28 PHP
一个PHP分页类的代码
2011/05/18 PHP
zend framework文件上传功能实例代码
2013/12/25 PHP
PHP父类调用子类方法的代码例子
2014/04/09 PHP
php中函数前加&符号的作用分解
2014/07/08 PHP
php+ajax 文件上传代码实例
2019/03/18 PHP
一段实时更新的时间代码
2006/07/07 Javascript
escape、encodeURI 和 encodeURIComponent 的区别
2009/03/02 Javascript
jQuery 性能优化手册 推荐
2010/02/23 Javascript
javascript中的float运算精度实例分析
2010/08/21 Javascript
js制作的鼠标悬浮时产生的下拉框效果
2012/10/27 Javascript
jQuery聚合函数实例
2015/05/21 Javascript
React Router基础使用
2017/01/17 Javascript
js弹出窗口简单实现代码
2017/03/22 Javascript
如何去除vue项目中的#及其ie9兼容性
2018/01/11 Javascript
原生JS实现瀑布流插件
2018/02/06 Javascript
详解如何在vue项目中引入elementUI组件
2018/02/11 Javascript
JS实现带阴历的日历功能详解
2019/01/24 Javascript
vue实现移动端轻量日期组件不依赖第三方库的方法
2019/04/28 Javascript
vue实现在进行增删改操作后刷新页面
2020/08/05 Javascript
零基础写python爬虫之抓取百度贴吧并存储到本地txt文件改进版
2014/11/06 Python
使用pandas中的DataFrame数据绘制柱状图的方法
2018/04/10 Python
Python中整数的缓存机制讲解
2019/02/16 Python
Python 根据日志级别打印不同颜色的日志的方法示例
2019/08/08 Python
详解Python利用random生成一个列表内的随机数
2019/08/21 Python
分享一个pycharm专业版安装的永久使用方法
2019/09/24 Python
python3 assert 断言的使用详解 (区别于python2)
2019/11/27 Python
selenium WebDriverWait类等待机制的实现
2020/03/18 Python
使用Jupyter notebooks上传文件夹或大量数据到服务器
2020/04/14 Python
Python 实现集合Set的示例
2020/12/21 Python
Myprotein加拿大官网:欧洲第一的运动营养品牌
2018/01/06 全球购物
实体的生命周期
2013/08/31 面试题
清洁工个人工作总结
2015/03/05 职场文书
降价通知函
2015/04/23 职场文书
详解Node.js如何处理ES6模块
2021/05/15 Javascript
详解CSS3浏览器兼容
2022/12/24 HTML / CSS