闲来无聊,正儿八经写的个人第一Python小程序

------爬虫I号:获取免费代理服务器&自动验证

  • 需求:

获取西刺代理网站http://www.xicidaili.com/wn/的免费代理IP资源,自动验证其有效性,

不要问我为什么要用代理,有需求的自然明白。

  • 知识点:

1.list的使用

2.file操作的使用

3.类的使用

4.requests 模块的使用,为了获取西刺网站的页面,也用于验证代理IP是否有效;不喜欢用urllib

5.正则表达式的使用,为了爬网页,也可以考虑用Beautifulsoup,看需求了

6.try, with等异常处理语句的使用

  • 设计流程:

设计思想很简单,细分以下几个步骤:

1.初始化类,配置Proxy 资源网站URL,用于验证Proxy IP的URL,存取Proxy IP的文件

2.获取Proxy资源网站内容

3.通过正则表达式爬 IP和Port资源,搜集成Proxy_all_list

4.验证Proxy_all_list中的每一个IP,并记录有效IP

话不多说,直接上Code,有详细注解。

#coding=utf-8
#<<<Web crawler I>>> : Get & Verify Proxy , written by HuangYu 20180814import re           #正则表达式库,用来匹配网页元素
import socket       #用于设定网络连接的相关属性
import sys
import requests     #用于进行HTTP的相关处理,urllib库用起来还是比较烦的,requests用起来so easy
import logging      #log相关功能,不能总是用print那么lowclass ProxyProber:def __init__(self):  #类的初始化函数,在类中的函数都有个self参数,其实可以理解为这个类的对象self.file_proxy_all_list = "proxy_all.txt"                   #保存 免费代理服务器网站 爬下来的所有代理IPself.file_proxy_valid_list = "proxy_valid.txt"               #保存 通过验证可用的 代理IPself.proxy_resource = "http://www.xicidaili.com/wn/"         #用于爬取代理信息的网站self.verify_url = "http://www.baidu.com/"                    #用于验证Proxy IP的网站#要为http报文分配header字段,否则很多页面无法获取self.http_headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0','Accept-Encoding': 'gzip, deflate'}#配置log信息存储的位置logging.basicConfig(filename='./proxy_debug.log', filemode="w", level=logging.DEBUG)#3秒内没有打开web页面,就放弃等待,防止死等,不管哪种语言,都要防范网络阻塞造成程序响应迟滞,CPU经常因此被冤枉socket.setdefaulttimeout(3)def getWebInfoByRe(self, context): #用于通过正则表达式取页面中的关键信息,context是页面内容ip_port_list = [] get_ip_re = re.compile("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}") #取页面中所有格式为“数字.数字.数字.数字”的数据存入IP列表ip_list = get_ip_re.findall(str(context))                    get_port_raw_re = re.compile("<td>\d{2,5}</td>")             #取页面中所有的格式为“<td>数字</td>”的数据存入Port草稿列表port_list_raw = get_port_raw_re.findall(str(context))get_port_re = re.compile("\d{5}|\d{4}|\d{2}")                #取上一批数据中所有的 “数字” 存入Port列表port_list = get_port_re.findall(str(port_list_raw))if ip_list is None:  return None if port_list is None:  return Noneif len(ip_list)!=len(port_list):                             #理论上IP和Port应该成对出现,没有再做太多的容错处理return Nonefor index in range(len(ip_list)):                     #将IP和Port列表中的数据一一匹配成“IP:Port”的格式存入listip_port_list.append(str(ip_list[index]) + ":" + str(port_list[index]))return ip_port_listdef getProxyResource(self,url): #获取代理服务器网站信息,并保存if len(url)==0:  print("Url is null!")returnrequests.adapters.DEFAULT_RETRIES = 5proxy_resource_request = requests.session()proxy_resource_request.keep_alive = False#获取url内容try:proxy_resource_result =proxy_resource_request.get(url, headers=self.http_headers)except:print("proxy_resource can't get!!!")return#页面内容存入log文件,爬页面的时候,都要获取页面源码分析其中的关键元素;当然,你也可以使用浏览器的debug组件分析logging.debug(proxy_resource_result.content)#开始提取页面中的IP和Port列表proxy_list = self.getWebInfoByRe(proxy_resource_result.content)#统计list元素个数print(len(proxy_list))  if len(proxy_list)==0:  print("Get Proxy fail!")  return#将list中所有信息写入proxy_all.txtfd_proxy_all = open(self.file_proxy_all_list, 'w')#with as 语法的使用,可以省去close文件的过程with open(self.file_proxy_all_list, 'w') as fd_proxy_all:for ip_port in proxy_list:  fd_proxy_all.write(str(ip_port) + "\n")def verifyProxy(self): #从proxy_all.txt获取所有Proxy IP进行验证,将有效的IP存入proxy_valid.txtindex = 0requests.adapters.DEFAULT_RETRIES = 5test_proxy = requests.session()test_proxy.keep_alive = False#将proxy_all.txt中所有信息读到ip_port_list中,with open(self.file_proxy_all_list, 'r') as fd_proxy_all:ip_port_list = fd_proxy_all.readlines()#读取全部内容#创建一个新的proxy_valid.txt    try:fd_proxy_valid = open(self.file_proxy_valid_list,'w')except:print ("proxy_valid.txt open is fail!")returnfinally:fd_proxy_valid.close()for ip_port in ip_port_list:proxy_url = {'http':'http://' + ip_port.strip('\n')}       #request.get信息中需要填写proxies字段,字段的format={'http':'http://ip:port'}#因为读回的信息每一行都有"\n",所以需要用.strip过滤掉"\n"index+=1print(str(index))try:#通过request.get获取验证页面,timeout用于防止 傻等,毕竟要验证一堆IPtest_page =test_proxy.get(self.verify_url, headers=self.http_headers, proxies=proxy_url, timeout=(2,3))except: #如果获取页面异常,进入这儿,再处理下一个IPprint("Invaild Proxy : " + ip_port.strip('\n'))continue#获取正常的页面返回码一般都是200,不是的话继续处理下一个IPif test_page.status_code!=200:print("Invaild Proxy : " + ip_port.strip('\n'))continue#能用的IP存入proxy_valid.txtprint("*********Vaild Proxy : " + ip_port.strip('\n'))with open(self.file_proxy_valid_list, 'a') as fd_proxy_valid:fd_proxy_valid.write(ip_port.strip('\n') + " "+ str(test_page.elapsed.total_seconds()) + "\n")if __name__ == "__main__":  prober_handler = ProxyProber() #prober_handler.getProxyResource(sys.argv[1])#prober_handler.getProxyResource("http://www.xicidaili.com/wn/")prober_handler.getProxyResource(prober_handler.proxy_resource)     #对象名=self,看到这就可以理解类里的self是什么了。prober_handler.verifyProxy()

爬虫I号 :获取免费代理服务器进行代理验证相关推荐

  1. Python爬虫方式抓取免费http代理IP

    我们新手在练手的时候,常常需要一些代理IP进行爬虫抓取,但是因为学习阶段,对IP质量要求不高,主要是弄懂原理,所以花钱购买爬虫代理IP就显得没必要(大款忽略),今天跟大家分享一下,如果使用爬虫抓取免费 ...

  2. 获取免费代理IP,并检验IP有效性

    爬虫程序访问网站,速度很快,很容易突破网站设置的访问次数,此情况下就会被停止访问,或者IP被封.如果此时能有一些代理IP,切换不同的代理IP去访问网站,使网站以为是从不同的机器上访问的,那么代理IP背 ...

  3. 免费IP代理池定时维护,封装通用爬虫工具类每次随机更新IP代理池跟UserAgent池,并制作简易流量爬虫...

    前言 我们之前的爬虫都是模拟成浏览器后直接爬取,并没有动态设置IP代理以及UserAgent标识,这样很容易被服务器封IP,因此需要设置IP代理,但又不想花钱买,网上有免费IP代理,但大多都数都是不可 ...

  4. Python每日一练(24)-requests 模块获取免费的代理并检测代理 IP 是否有效

    目录 1. 通过代理服务发送请求 2. 获取免费的代理 IP 3. 检测代理 IP 是否有效 1. 通过代理服务发送请求 在爬取网页的过程中,经常会出现不久前可以爬取的网页现在无法爬取的情况,这是因为 ...

  5. 免费迅雷会员VIP帐号获取器 – 迅雷离线下免费用

    喜欢下载网络资源的朋友今天有福了,给大家介绍一个免费的迅雷VIP帐号的生成器,官方也希望大家在使用免费的迅雷会员帐号时,不要自私的去修改它. 我想大多数购买迅雷会员的朋友也只是用到离线下载的功能,因为 ...

  6. 用公众号获取 任意公众号文章列表 软件还是免费

    用公众号获取 任意公众号文章列表 软件还是免费还不快点下载 下载 地址  https://pan.baidu.com/s/1jI44Wjs 转载于:https://www.cnblogs.com/wx ...

  7. 免费动态IP代理科普知识课堂—代理服务器的类型

    代理服务器的类型 虽然所有代理服务器都为用户提供了使用互联网的备用地址,但也有几种不同的类型--每种都有自己的特点. 正向代理 转发代理位于客户端前面,用于将数据发送给内部网络中的用户组.发送请求时, ...

  8. 爬虫行政区号并获取电话区号和邮编

    爬虫行政区号并获取电话区号和邮编 爬虫行政区号并获取电话区号和邮编 1.mysql建表语句 2.对应的实体类 3.同步代码 4.实际数据库效果 爬虫行政区号并获取电话区号和邮编 1.mysql建表语句 ...

  9. 在线网页代理api 获取免费的代理地址

    在线网页代理api,获取免费的代理地址,不间断更新. 接口名称:在线网页代理api 接口平台:开源接口 接口地址:http://japi.juheapi.com/japi/fatch 支持格式:jso ...

最新文章

  1. 如何看待清华北大毕业生流失去国外?
  2. linux 内核 获取随机数
  3. Qt creator工程项目移植时因环境变换造成qmake错误的解决方案
  4. 手把手教你玩转SOCKET模型之重叠I/O篇(下)
  5. oracle orber by,Oracle ORDER BY子句
  6. vue路由传参两种方式;vue路由传参query与params区别;vue路由跳转的带参与不带参,路由跳转传参方式:name 、 path;
  7. Tomcat为Cookie设置HttpOnly属性
  8. SQL 创建随机时间的函数
  9. mysql数据库innodb恢复命令_MySQL 如何对InnoDB使用Undrop来恢复InnoDB数据
  10. 大数据之-Hadoop完全分布式_集群的启动和停止方式总结---大数据之hadoop工作笔记0039
  11. JS缺失错误- Uncaught SyntaxError: Unexpected token
  12. 服务器负载不高 响应慢_通俗易懂的讲透:负载均衡的原理
  13. ISO9001认证审核常见问题大汇总
  14. 模块化机房建设指导书_模块化机房建设方案.doc
  15. 油猴插件(Tampermonkey)安装教程
  16. html按钮 字 颜色代码,html中按钮的字体颜色怎么设置?
  17. 移动高德地图marker点
  18. 作为通信人,我们究竟该如何看待AI?
  19. 如何使用Pytest进行自动化测试
  20. gsl for windows

热门文章

  1. 推荐一些好的英语python书籍知识点
  2. Elasticsearch:Ingest pipeline 介绍
  3. MC34063芯片应用
  4. 怎么证明未显式定义构造方法时,编译器会自动生成无参的构造方法?
  5. Altium Designer 在PCB中添加 图片 Logo 或者丝印
  6. 财富自由的声音:蚂蚁上市前,取消了周报
  7. 找不到 Microsoft Excel Driver ODBC 驱动程序的安装例程 解决方案
  8. 计算机网络原理 笔记整理
  9. 萝卜书摘显示服务器正在维护,萝卜书摘
  10. C++语言学习笔记15:Clean 垃圾清理插件