我有一个小python脚本,我写了用有效的公共代理填充我的proxychains.conf文件。对于每个请求,检索10个代理并将其添加到proxychains.conf中,这样做3次,以便总共添加30个代理。
当我编写脚本并将结果返回到stdout时,一切按预期工作=检索并返回30个代理。但是当我添加脚本的文件操作部分时,只有10个代理被写入文件。我还在学习Python,而且我试图重新排列一些东西,但它没有成功。我无法弄清楚:
以下是代码:
#!/usr/bin/env python3
import requests
import sys,os
proxy_file = '/etc/proxychains.conf'
base_url = 'http://proxy.tekbreak.com/10/json'
headers = {'user-agent':'Mozilla/5.0 (Windows NT x.y; Win64; x64; rv:10.0) Gecko/20'}
def fetchprox():
pf = open(proxy_file, 'r')
lines = pf.readlines()
pf.close()
with open (proxy_file, 'w') as f:
del lines[69:]
f.writelines([item for item in lines[:-1]])
r = requests.get(base_url, headers=headers)
n = 0
while n < 10:
ip = r.json()[n]['ip']
port = r.json()[n]['port']
p_type = r.json()[n]['type']
#output to proxychains.conf
f.writelines(str(p_type + " " + ip + " " + port + "\n"))
n += 1
for i in range(0,3):
fetchprox()
感谢您的帮助!
修改 我找到了一个基于佐丹奴答案的解决方案,但我相信它可以更好地实施。似乎多余的是必须访问此文件3次才能写入一些数据。所以这是脚本中已更改的部分:
<--snip->
pf = open(proxy_file, 'r')
lines = pf.readlines()
pf.close()
f = open (proxy_file, 'w')
del lines[69:]
f.writelines([item for item in lines[:-2]])
f.close()
def fetchprox():
with open (proxy_file, 'a') as f:
r = requests.get(base_url, headers=headers)
n = 0
while n < 10:
<--snip-->
那么有更有效的方法来实现这个目标吗?
答案 0 :(得分:2)
您的脚本是正确的,但正如我在评论中提到的,您会在每个循环中覆盖您的文件。
更详细的说,错误的行如下:
with open (proxy_file, 'w') as f:
使用w
,您可以编写一个文件,但如果它不为空,则会覆盖该内容。
要解决此问题,您可以通过以下方式使用append
模式:
with open (proxy_file, 'a') as f:
追加不会覆盖文件内容,但会添加新行。
修改后回答
首先,您可以使用with
打开文件,因此我也删除了.close(),因为with
会自动处理关闭。
我还以这种方式用while
循环更改了for
循环:
lines = None
with open(proxy_file, 'r') as pf:
lines = pf.readlines()
with open (proxy_file, 'w') as f:
del lines[69:]
f.writelines([item for item in lines[:-2]])
def fetchprox():
with open (proxy_file, 'a') as f:
data = requests.get(base_url, headers=headers).json()
for element in data:
ip = element['ip']
port = element['port']
p_type = element['type']
#output to proxychains.conf
f.writelines(str(p_type + " " + ip + " " + port + "\n"))
for i in range(0,3):
fetchprox()
第二次修改
如果要删除对文件的一次访问权限,可以这样使用r+
模式:
lines = None
with open(proxy_file, 'r+') as pf:
lines = pf.readlines()
del lines[69:]
pf.writelines([item for item in lines[:-2]])
...
使用r+
,您可以读取和写入,打开一次文件。