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 相关文章推荐
使用Python设置tmpfs来加速项目的教程
Apr 17 Python
用Python给文本创立向量空间模型的教程
Apr 23 Python
总结Python中逻辑运算符的使用
May 13 Python
Python运算符重载用法实例分析
Jun 01 Python
Python使用Paramiko模块编写脚本进行远程服务器操作
May 05 Python
Python环境下安装使用异步任务队列包Celery的基础教程
May 07 Python
Python 制作糗事百科爬虫实例
Sep 22 Python
利用Python将每日一句定时推送至微信的实现方法
Aug 13 Python
python3获取当前目录的实现方法
Jul 29 Python
python实现俄罗斯方块小游戏
Apr 24 Python
python3.6使用SMTP协议发送邮件
May 20 Python
Python无损压缩图片的示例代码
Aug 06 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
火车头discuz6.1 完美采集的php接口文件
2009/09/13 PHP
jquery的extend和fn.extend的使用说明
2011/01/09 Javascript
给jqGrid数据行添加修改和删除操作链接(之一)
2011/11/04 Javascript
浅析JQuery获取和设置Select选项的常用方法总结
2013/07/04 Javascript
javascript使用location.search的示例
2013/11/05 Javascript
JavaScript图片放大技术(放大镜)实现代码分享
2013/11/14 Javascript
JQuery中serialize()用法实例分析
2015/02/06 Javascript
Nodejs如何复制文件
2016/03/09 NodeJs
js事件处理程序跨浏览器解决方案
2016/03/27 Javascript
Node.js实现连接mysql数据库功能示例
2017/09/15 Javascript
angularJs使用ng-repeat遍历后选中某一个的方法
2018/09/30 Javascript
element-ui 实现响应式导航栏的示例代码
2020/05/08 Javascript
基于Vue sessionStorage实现保留搜索框搜索内容
2020/06/01 Javascript
详解javascript脚本何时会被执行
2021/02/05 Javascript
pip 错误unused-command-line-argument-hard-error-in-future解决办法
2014/06/01 Python
浅谈插入排序算法在Python程序中的实现及简单改进
2016/05/04 Python
Python安装Numpy和matplotlib的方法(推荐)
2017/11/02 Python
python+opencv实现动态物体识别
2018/01/09 Python
Django框架教程之正则表达式URL误区详解
2018/01/28 Python
Tensorflow中使用tfrecord方式读取数据的方法
2018/06/19 Python
搞定这套Python爬虫面试题(面试会so easy)
2019/04/03 Python
Django时区详解
2019/07/24 Python
python list多级排序知识点总结
2019/10/23 Python
详解Django admin高级用法
2019/11/06 Python
Django models文件模型变更错误解决
2020/05/11 Python
使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)
2020/10/12 Python
Nike意大利官网:Nike.com IT
2020/01/19 全球购物
会计系毕业个人自荐信格式
2013/09/23 职场文书
配件采购员岗位职责
2013/12/03 职场文书
秋季校运会广播稿100字
2014/09/18 职场文书
个人批评与自我批评
2014/10/15 职场文书
学校政风行风自查自纠报告
2014/10/21 职场文书
幼儿园综治宣传月活动总结
2015/05/07 职场文书
numpy数据类型dtype转换实现
2021/04/24 Python
Go缓冲channel和非缓冲channel的区别说明
2021/04/25 Golang
【DOTA2】当街暴打?PSG LGD vs VG - DPC 2022 WINTER TOUR CN
2022/04/02 DOTA