【问题标题】:Hit a url multiple times [duplicate]多次点击一个网址[重复]
【发布时间】:2013-09-16 13:13:25
【问题描述】:

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

【问题讨论】:

标签: python url


【解决方案1】:

使用urllib2?作为标准的经验法则,请始终先查看标准库,那里有大量有用的包。

【讨论】:

  • 你说的是urllib,但链接到urllib2。否则,很好的答案。
【解决方案2】:
import urllib2

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

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

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

【讨论】:

    【解决方案3】:

    看看Urllib2.urlopen

    import urllib2
    
    for _ in range(10):
        urllib2.urlopen("http://www.stackoverflow.com")
    

    【讨论】:

      【解决方案4】:

      F.X. 的答案几乎肯定是你想要的。

      但你问的是效率,如果你真的想尽可能高效,你可以做得更好。越早关闭套接字,您在计算机和 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 请求实际上是 quite involved... @、requests 或其他一些库。

      【讨论】:

      • +1。虽然示例代码不适用于 Python 2 或 Python 3(使用字节文字发送数据并提及 futures 是 Python 2 上的第 3 方)
      猜你喜欢
      • 2016-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-02
      • 2013-08-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多