转载自公众号:JAVAandPythonJun

说在前面的话

Hello,我是JAP君,相信经常使用爬虫的朋友对代理ip应该比较熟悉,代理ip就是可以模拟一个ip地址去访问某个网站。我们有时候需要爬取某个网站的大量信息时,可能由于我们爬的次数太多导致我们的ip被对方的服务器暂时屏蔽(也就是所谓的防爬虫防洪水的一种措施),这个时候就需要我们的代理ip出场了,今天我带大家来爬取西刺代理上面免费提供的代理ip并且我们来检测它的有效性来打造我们自己的代理ip池,废话不多说,咱们动工!

2思路分析(写爬虫前大家都必须要分析一下)

image

image

没错上图就是我们的西刺代理网站啦,今天我们就是来拿它的数据,老司机一看这个界面就会自动右击鼠标->查看源代码,我们也来看看:

image

我们会发现数据都在<tr>里面,并且<tr>里面有很多的<td>,每一个<td>都包含了我们所需要的数据。

看过我以前一些爬虫文章的朋友估计一下就知道该怎么下手了,但是不急我们还是来分析一下,毕竟这次数据量有点大,而且还得校验代理ip的有效性。

image

给大家画了张图,其实思路也很简单,也就不多阐述了。

3获取所有的代理ip以及相关信息并保存至文件txt中

我们就按照我们的思路来,在这里我们需要用到的几个库,给大家写出来:

from bs4 import BeautifulSoup
import requests
from urllib import request,error
import threading

导入库后,我们首先获得代理ip,我们来定义一个方法:(每一句的解释我都写在注释里了)

def getProxy(url):# 打开我们创建的txt文件proxyFile = open('proxy.txt', 'a')# 设置UA标识headers = {'User-Agent': 'Mozilla / 5.0(Windows NT 10.0;WOW64) AppleWebKit ''/ 537.36(KHTML, likeGecko) Chrome / 63.0.3239.132Safari / 537.36'}# page是我们需要获取多少页的ip,这里我们获取到第9页for page in range(1, 10):# 通过观察URL,我们发现原网址+页码就是我们需要的网址了,这里的page需要转换成str类型urls = url+str(page)# 通过requests来获取网页源码rsp = requests.get(urls, headers=headers)html = rsp.text# 通过BeautifulSoup,来解析html页面soup = BeautifulSoup(html)# 通过分析我们发现数据在 id为ip_list的table标签中的tr标签中trs = soup.find('table', id='ip_list').find_all('tr') # 这里获得的是一个list列表# 我们循环这个列表for item in trs[1:]:# 并至少出每个tr中的所有td标签tds = item.find_all('td')# 我们会发现有些img标签里面是空的,所以这里我们需要加一个判断if tds[0].find('img') is None:nation = '未知'locate = '未知'else:nation = tds[0].find('img')['alt'].strip()locate = tds[3].text.strip()# 通过td列表里面的数据,我们分别把它们提取出来ip = tds[1].text.strip()port = tds[2].text.strip()anony = tds[4].text.strip()protocol = tds[5].text.strip()speed = tds[6].find('div')['title'].strip()time = tds[8].text.strip()# 将获取到的数据按照规定格式写入txt文本中,这样方便我们获取proxyFile.write('%s|%s|%s|%s|%s|%s|%s|%s\n' % (nation, ip, port, locate, anony, protocol, speed, time))

上面的代码就是我们抓取西刺代理上的所有ip并将它们写入txt中,每一句的解释我都写在注释里面了,这里也就不多说了。

4校验代理ip的可用性

这里我是通过代理ip去访问百度所返回的状态码来辨别这个代理ip到底有没有用的。

def verifyProxy(ip):'''验证代理的有效性'''requestHeader = {'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36"}url = "http://www.baidu.com"# 填写代理地址proxy = {'http': ip}# 创建proxyHandlerproxy_handler = request.ProxyHandler(proxy)# 创建openerproxy_opener = request.build_opener(proxy_handler)# 安装openerrequest.install_opener(proxy_opener)try:req = request.Request(url, headers=requestHeader)rsq = request.urlopen(req, timeout=5.0)code = rsq.getcode()return codeexcept error.URLError as e:return e

我们在这个方法中会得到一个状态码的返回,如果返回码是200,那么这个代理ip就是可用的。

image

def verifyProxyList():verifiedFile = open('verified.txt', 'a')while True:lock.acquire()ll = inFile.readline().strip()lock.release()if len(ll) == 0 : breakline = ll.strip().split('|')ip = line[1]port = line[2]realip = ip+':'+portcode = verifyProxy(realip)if code == 200:lock.acquire()print("---Success:" + ip + ":" + port)verifiedFile.write(ll + "\n")lock.release()else:print("---Failure:" + ip + ":" + port)

我们写完校验方法后,我们就从我们事先爬取到的所有代理ip的txt文件中获取到ip和端口(ip地址:端口),我们通过判断返回值是否为200来进行写入到有效的txt文件中。

5调用函数

万事俱备只欠调用!

if __name__ == '__main__':tmp = open('proxy.txt', 'w')tmp.write("")tmp.close()tmp1 = open('verified.txt', 'w')tmp1.write("")tmp1.close()getProxy("http://www.xicidaili.com/nn/")getProxy("http://www.xicidaili.com/nt/")getProxy("http://www.xicidaili.com/wn/")getProxy("http://www.xicidaili.com/wt/")all_thread = []# 30个线程for i in range(30):t = threading.Thread(target=verifyProxyList)all_thread.append(t)t.start()for t in all_thread:t.join()inFile.close()verifiedtxt.close()

因为西刺代理提供了四种代理ip,所以分别有四个网址。这里我们也采用了线程的方法,主要是为了防止出现线程互相争夺导致我们的数据不精确,在上面几个方法中我们也通过了同步锁来对其进行线程安全的保证。

6结尾

其实总体来说这个爬虫不是特别的难,主要的难点在于数据量可能有点多,很多人可能不会考虑到线程安全的问题,导致数据获取的不精确。

全部代码:

from bs4 import BeautifulSoup
import requests
from urllib import request,error
import threadinginFile = open('proxy.txt')
verifiedtxt = open('verified.txt')
lock = threading.Lock()
def getProxy(url):# 打开我们创建的txt文件proxyFile = open('proxy.txt', 'a')# 设置UA标识headers = {'User-Agent': 'Mozilla / 5.0(Windows NT 10.0;WOW64) AppleWebKit ''/ 537.36(KHTML, likeGecko) Chrome / 63.0.3239.132Safari / 537.36'}# page是我们需要获取多少页的ip,这里我们获取到第9页for page in range(1, 10):# 通过观察URL,我们发现原网址+页码就是我们需要的网址了,这里的page需要转换成str类型urls = url+str(page)# 通过requests来获取网页源码rsp = requests.get(urls, headers=headers)html = rsp.text# 通过BeautifulSoup,来解析html页面soup = BeautifulSoup(html)# 通过分析我们发现数据在 id为ip_list的table标签中的tr标签中trs = soup.find('table', id='ip_list').find_all('tr') # 这里获得的是一个list列表# 我们循环这个列表for item in trs[1:]:# 并至少出每个tr中的所有td标签tds = item.find_all('td')# 我们会发现有些img标签里面是空的,所以这里我们需要加一个判断if tds[0].find('img') is None:nation = '未知'locate = '未知'else:nation = tds[0].find('img')['alt'].strip()locate = tds[3].text.strip()# 通过td列表里面的数据,我们分别把它们提取出来ip = tds[1].text.strip()port = tds[2].text.strip()anony = tds[4].text.strip()protocol = tds[5].text.strip()speed = tds[6].find('div')['title'].strip()time = tds[8].text.strip()# 将获取到的数据按照规定格式写入txt文本中,这样方便我们获取proxyFile.write('%s|%s|%s|%s|%s|%s|%s|%s\n' % (nation, ip, port, locate, anony, protocol, speed, time))def verifyProxyList():verifiedFile = open('verified.txt', 'a')while True:lock.acquire()ll = inFile.readline().strip()lock.release()if len(ll) == 0 : breakline = ll.strip().split('|')ip = line[1]port = line[2]realip = ip+':'+portcode = verifyProxy(realip)if code == 200:lock.acquire()print("---Success:" + ip + ":" + port)verifiedFile.write(ll + "\n")lock.release()else:print("---Failure:" + ip + ":" + port)def verifyProxy(ip):'''验证代理的有效性'''requestHeader = {'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36"}url = "http://www.baidu.com"# 填写代理地址proxy = {'http': ip}# 创建proxyHandlerproxy_handler = request.ProxyHandler(proxy)# 创建openerproxy_opener = request.build_opener(proxy_handler)# 安装openerrequest.install_opener(proxy_opener)try:req = request.Request(url, headers=requestHeader)rsq = request.urlopen(req, timeout=5.0)code = rsq.getcode()return codeexcept error.URLError as e:return eif __name__ == '__main__':tmp = open('proxy.txt', 'w')tmp.write("")tmp.close()tmp1 = open('verified.txt', 'w')tmp1.write("")tmp1.close()getProxy("http://www.xicidaili.com/nn/")getProxy("http://www.xicidaili.com/nt/")getProxy("http://www.xicidaili.com/wn/")getProxy("http://www.xicidaili.com/wt/")all_thread = []for i in range(30):t = threading.Thread(target=verifyProxyList)all_thread.append(t)t.start()for t in all_thread:t.join()inFile.close()verifiedtxt.close()

Python建立ip代理池(多线程)相关推荐

  1. python建立ip代理池_Python搭建代理IP池实现存储IP的方法

    上一文写了如何从代理服务网站提取 IP,本文就讲解如何存储 IP,毕竟代理池还是要有一定量的 IP 数量才行.存储的方式有很多,直接一点的可以放在一个文本文件中,但操作起来不太灵活,而我选择的是 My ...

  2. Python爬虫——建立IP代理池

    在使用Python爬虫时,经常遇见具有反爬机制的网站.我们可以通过伪装headers来爬取,但是网站还是可以获取你的ip,从而禁掉你的ip来阻止爬取信息. 在request方法中,我们可以通过prox ...

  3. 手把手教你用Python搭建IP代理池,轻松破解请求频率限制反爬虫~

    我们所写的爬虫,它对服务器发出的网络请求频率要比正常用户的高的多,从而开发者可以将请求频率过高的用户视为爬虫程序,从而来限制爬虫程序. 今天志斌就来给大家分享一下,如何用Python搭建一个IP代理池 ...

  4. 手把手教你用Python搭建IP代理池

    今天给大家分享一下,如何用Python搭建一个IP代理池,来破解服务器通过对用户请求频率进行限制的反爬虫. 01 原理 因为客户端的IP地址是唯一的,所以开发者便将IP地址作为客户端的身份标识. 服务 ...

  5. python爬虫ip代理池_爬虫教程-Python3网络爬虫开发——IP代理池的维护

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 准备工作 要实现IP代理池我们首先需要成功安装好了 Redis 数据库并启动服务,另外还需要安装 Aiohttp.Requests.RedisPy.PyQ ...

  6. python开源ip代理池_[技术]基于python实现的短效代理ip池程序

    我们在写爬虫程序的时候,或者是抓取数据的时候,遇到一些发爬不是很厉害的网站,一般都是通过代理ip来实现绕过对方的反爬措施. 一般好的代理都是需要付费的,免费的代理速度慢,而且难找.市面上也有很多对应的 ...

  7. Python爬虫--IP代理池的构建

    一.为什么要使用代理IP 1.爬虫的时候,被爬网站是有反爬虫机制的,如果使用一个IP反复访问一个网页,就容易被出现IP限制,无法再对网站进行访问,这时就需要用到代理IP. 2.如果工作任务量大,抓取速 ...

  8. Python爬虫-IP代理池和代理池设计

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于腾讯云 作者:小小科 ( 想要学习Python?Python学习交流 ...

  9. python ip代理池_python实现ip代理池功能示例

    本文实例讲述了python实现ip代理池功能.分享给大家供大家参考,具体如下: 爬取的代理源为西刺代理. 用xpath解析页面 用telnet来验证ip是否可用 把有效的ip写入到本地txt中.当然也 ...

最新文章

  1. 掩码语言模型(Masked Language Model)mlm
  2. Map再整理,从底层源码探究HashMap
  3. 最强无监督行人重识别方法 Cluster Contrast ReID,rank-1 94.6%
  4. vscode 新建python 终端
  5. Java方法的可变参数
  6. 川大的计算机科学分数线,四川大学各排名及分数线整理_四川大学特色分享
  7. php preg_match 只匹配第一个字符_PHP正则表达式核心技术完全详解 第3节
  8. 洛谷 P4568 [JLOI2011]飞行路线
  9. gmssl编译linux,linux 编译安装GmSSL记录
  10. ArcGIS——计算几何——面积/周长禁用
  11. 程序员被空姐骗到香港做传销!
  12. 红黑联盟mysql,红黑联盟官网被人恶意留下后门
  13. HugePages 大内存页
  14. 跳一跳,python脚本原理
  15. uc打开html文件是空的,UC浏览器中打开不出现主页的解决方法
  16. creo6.0安装教程
  17. matlab random 均匀分布,Matlab 的随机函数(高斯分布 均匀分布 其它分布)
  18. 高新技术企业的申报条件及要求
  19. 路由器、交换机、集线器工作在哪一层
  20. 中等职业技术学校计算机考试,重庆市中等职业技术学校计算机教师网络培训考试题(9页)-原创力文档...

热门文章

  1. 初识HTML5(一)
  2. netstat mysql_mysql-netstat
  3. mysql使用文件排序_Mysql排序FileSort的问题
  4. mongoose在子文档的array里update或insert
  5. WEB-INF目录结构
  6. HDU 1068 Girls and Boys(最大独立集合 = 顶点数 - 最大匹配数)
  7. 数据库外连接和内连接详解
  8. 排序算法_总结与复习
  9. 能帮你找到网页设计灵感的16个网站
  10. Ubuntu 10.10安装Vmware Tools