python扫描proxy并获取可用代理ip的实例

作者:jingxian 时间:2023-07-29 16:42:50 

今天咱写一个挺实用的工具,就是扫描并获取可用的proxy

首先呢,我先百度找了一个网站:http://www.xicidaili.com 作为例子

这个网站里公布了许多的国内外可用的代理的ip和端口

我们还是按照老样子进行分析,就先把所有国内的proxy扫一遍吧

点开国内部分进行审查发现,国内proxy和目录为以下url:

http://www.xicidaili.com/nn/x

这个x差不多两千多页,那么看来又要线程处理了。。。

老样子,我们尝试是否能直接以最简单的requests.get()获取内容

返回503,那么我们加一个简单的headers

返回200,成咯

好了我们先进行网页内容分析并获取想要的内容

我们发现,包含ip信息的内容在<tr>标签内,于是我们就能很方便的用bs进行获取标签内容

但是我们随之又发现,ip、端口、协议的内容分别在提取的<tr>标签的第2,3,6三个<td>标签内

于是我们开始尝试编写,一下为编写思路:

处理页面的时候,是先提取tr标签,再将tr标签中的td标签提取

所以运用了两次bs操作,并且第二次使用bs操作时需要进行str处理

因为我们获得tr之后,我们需要其中的2,3,6号的东西,

但是当我们用一个for循环输出的i并不能进行组的操作

所以我们干脆分别对每一个td的soup进行第二次操作之后直接提取2,3,6

提取之后,直接加上.string提取内容即可


r = requests.get(url = url,headers = headers)

soup = bs(r.content,"html.parser")
data = soup.find_all(name = 'tr',attrs = {'class':re.compile('|[^odd]')})

for i in data:

soup = bs(str(i),'html.parser')
 data2 = soup.find_all(name = 'td')
 ip = str(data2[1].string)
 port = str(data2[2].string)
 types = str(data2[5].string).lower()

proxy = {}
 proxy[types] = '%s:%s'%(ip,port)

这样,我们每次循环都能生成对应的proxy字典,以便我们接下来验证ip可用性所使用

字典这儿有个注意点,我们有一个将types变为小写的操作,因为在get方法中的proxies中写入的协议名称应为小写,而网页抓取的是大写的内容,所以进行了一个大小写转换

那么验证ip可用性的思路呢

很简单,我们使用get,加上我们的代理,请求网站:

http://1212.ip138.com/ic.asp

这是一个神奇的网站,能返回你的外网ip是什么


url = 'http://1212.ip138.com/ic.asp'
r = requests.get(url = url,proxies = proxy,timeout = 6)

这里我们需要加上timeout去除掉那些等待时间过长的代理,我设置为6秒

我们以一个ip进行尝试,并且分析返回的页面

返回的内容如下:


<html>

<head>

<meta xxxxxxxxxxxxxxxxxx>

<title> 您的IP地址 </title>

</head>

<body style="margin:0px"><center>您的IP是:[xxx.xxx.xxx.xxx] 来自:xxxxxxxx</center></body></html>

那么我们只需要提取出网页内[]的内容即可

如果我们的代理可用,就会返回代理的ip

(这里会出现返回的地址还是我们本机的外网ip的情况,虽然我也不是很清楚,但是我把这种情况排除,应该还是代理不可用)

那么我们就能进行一个判断,如果返回的ip和proxy字典中的ip相同,则认为这个ip是可用的代理,并将其写入文件

我们的思路就是这样,最后进行queue和threading线程的处理即可

上代码:


#coding=utf-8

import requests
import re
from bs4 import BeautifulSoup as bs
import Queue
import threading

class proxyPick(threading.Thread):
def __init__(self,queue):
 threading.Thread.__init__(self)
 self._queue = queue

def run(self):
 while not self._queue.empty():
  url = self._queue.get()

proxy_spider(url)

def proxy_spider(url):
headers = {
  .......
 }

r = requests.get(url = url,headers = headers)
soup = bs(r.content,"html.parser")
data = soup.find_all(name = 'tr',attrs = {'class':re.compile('|[^odd]')})

for i in data:

soup = bs(str(i),'html.parser')
 data2 = soup.find_all(name = 'td')
 ip = str(data2[1].string)
 port = str(data2[2].string)
 types = str(data2[5].string).lower()

proxy = {}
 proxy[types] = '%s:%s'%(ip,port)
 try:
  proxy_check(proxy,ip)
 except Exception,e:
  print e
  pass

def proxy_check(proxy,ip):
url = 'http://1212.ip138.com/ic.asp'
r = requests.get(url = url,proxies = proxy,timeout = 6)

f = open('E:/url/ip_proxy.txt','a+')

soup = bs(r.text,'html.parser')
data = soup.find_all(name = 'center')
for i in data:
 a = re.findall(r'\[(.*?)\]',i.string)
 if a[0] == ip:
  #print proxy
  f.write('%s'%proxy+'\n')
  print 'write down'

f.close()

#proxy_spider()

def main():
queue = Queue.Queue()
for i in range(1,2288):
 queue.put('http://www.xicidaili.com/nn/'+str(i))

threads = []
thread_count = 10

for i in range(thread_count):
 spider = proxyPick(queue)
 threads.append(spider)

for i in threads:
 i.start()

for i in threads:
 i.join()

print "It's down,sir!"

if __name__ == '__main__':
main()

这样我们就能把网站上所提供的能用的代理ip全部写入文件ip_proxy.txt文件中了

标签:python,扫描,proxy,代理ip
0
投稿

猜你喜欢

  • 几个你不知道的技巧助你写出更优雅的vue.js代码

    2024-05-13 09:14:39
  • 浅谈numpy 函数里面的axis参数的含义

    2023-06-04 11:23:35
  • python Event事件、进程池与线程池、协程解析

    2023-09-06 00:39:19
  • MySQL 8.0.29 安装配置方法图文教程

    2024-01-17 18:22:29
  • Python telnet登陆功能实现代码

    2022-08-13 01:52:56
  • python基本算法之实现归并排序(Merge sort)

    2023-04-06 03:20:07
  • 用Dreamweaver MX轻松操作表格

    2009-05-29 18:41:00
  • MASA Blazor入门详细教程

    2023-04-08 17:51:29
  • mysql数据库重命名语句分享

    2024-01-18 20:05:24
  • 使用 Vue cli 3.0 构建自定义组件库的方法

    2024-05-05 09:07:50
  • 语言编程花絮内建构建顺序示例详解

    2023-11-04 09:42:12
  • 利用Python生成文件md5校验值函数的方法

    2023-09-29 14:51:40
  • 70+漂亮且极具亲和力的导航菜单设计推荐[译]

    2009-02-23 13:15:00
  • Python图像处理之图像量化处理详解

    2023-06-09 15:07:30
  • pygame+opencv实现读取视频帧的方法示例

    2021-01-04 23:41:27
  • Python selenium爬取微博数据代码实例

    2023-07-01 02:46:49
  • Javascript基础学习之十个重要问题

    2023-07-14 09:17:52
  • Select count(*)、Count(1)和Count(列)的区别及执行方式

    2024-01-28 14:43:04
  • 用python实现五子棋实例

    2022-08-23 21:42:38
  • 树莓派采用socket方式文件传输(python)

    2021-02-19 05:31:42
  • asp之家 网络编程 m.aspxhome.com