0

我想在 python 中点击一个 URL N 次。目前我一直在使用webbrowser.open(),但它非常慢并且消耗大量内存。有什么更有效的方法吗?

4

4 回答 4

4

看看Urllib2.urlopen

import urllib2

for _ in range(10):
    urllib2.urlopen("http://www.stackoverflow.com")
于 2013-09-12T08:46:09.933 回答
3

FX 的答案几乎可以肯定是您想要的。

但是你问的是效率,如果你真的想尽可能地高效,你可以做得更好。越早关闭套接字,您在计算机和 Web 服务器上浪费的 CPU、内存和带宽就越少。

此外,如果您并行发出多个请求,虽然这不会在您的机器(实际上会浪费一些)或服务器上节省任何资源,但它可能会更快地完成。这就是你所追求的吗?

当然,这引发了一个问题,即“点击 URL”究竟是什么意思。只发送请求并立即关闭是否可以接受?或者您是否需要至少等待响应行?就此而言,提出HEAD请求而不是请求是否可以接受GET?你需要现实/有用的标题吗?

无论如何,为了做到这一点,您需要降到较低的级别。大多数高级库都没有给您任何方法,例如,在读取任何内容之前关闭套接字。但制作 HTTP 请求并不难。*

例如:

from contextlib import closing
from socket import create_connection
from concurrent.futures import ThreadPoolExecutor, wait

host, port = 'www.example.com', 80
path = '/path/to/resource.html'

def spam_it():
    with closing(create_connection((host, port))) as sock:
        sock.sendall('GET {} HTTP/1.0\n\n'.format(path))

with ThreadPoolExecutor(max_workers=16) as executor:
    wait(executor.submit(spam_it) for _ in range(10000))

* 好吧,手动制作 HTTP 请求实际上是相当复杂的……如果您只需要制作一个静态的、微不足道的请求,请自己动手,但总的来说,您肯定想要使用urllib,requests或其他一些库。

于 2013-09-12T08:49:42.353 回答
2

使用urllib2吗?作为一个标准的经验法则,总是首先查看标准库,那里有大量有用的包。

于 2013-09-12T08:40:16.843 回答
1
import urllib2

url = "http://www.google.com"
n = 8

for i in range(n):
  urllib.urlopen( url ).read()

如果您最终想要对 HTTP 请求不那么琐碎,您可能希望查看该requests模块。

于 2013-09-12T08:40:38.743 回答