使用urlopen打开网址列表

时间:2014-04-24 20:14:29

标签: python urllib urlopen

我有一个python脚本,可以获取网页并对其进行镜像。它适用于一个特定页面,但我不能让它不止一个。我假设我可以将多个URL放入一个列表然后将其提供给该函数,但是我收到了这个错误:

Traceback (most recent call last):
  File "autowget.py", line 46, in <module>
    getUrl()
  File "autowget.py", line 43, in getUrl
    response = urllib.request.urlopen(url)
  File "/usr/lib/python3.2/urllib/request.py", line 139, in urlopen
    return opener.open(url, data, timeout)
  File "/usr/lib/python3.2/urllib/request.py", line 361, in open
    req.timeout = timeout
AttributeError: 'tuple' object has no attribute 'timeout'

以下是有问题的代码:

url = ['https://www.example.org/', 'https://www.foo.com/', 'http://bar.com']
def getUrl(*url):
    response = urllib.request.urlopen(url)
    with urllib.request.urlopen(url) as response, open(file_name, 'wb') as out_file:
        shutil.copyfileobj(response, out_file)
getUrl()

我已经筋疲力尽了Google试图找到如何使用urlopen()打开列表。我找到了一种有效的方法。它需要一个.txt文档并逐行浏览,将每行作为URL提供,但我使用Python 3编写此内容,无论出于何种原因twillcommandloop都不会导入。另外,这种方法很笨重,需要(据说)不必要的工作。

无论如何,我们将非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

在您的代码中存在一些错误:

  • 您可以使用变量参数列表定义getUrls(错误中的元组);
  • 您将getUrls参数作为单个变量(而不是列表)进行管理

您可以尝试使用此代码

import urllib2
import shutil

urls = ['https://www.example.org/', 'https://www.foo.com/', 'http://bar.com']
def getUrl(urls):
   for url in urls:
      #Only a file_name based on url string
      file_name = url.replace('https://', '').replace('.', '_').replace('/','_')
      response = urllib2.urlopen(url)
      with open(file_name, 'wb') as out_file:
         shutil.copyfileobj(response, out_file)
getUrl(urls)

答案 1 :(得分:0)

它不支持元组:

urllib.request.urlopen(url[, data][, timeout])
Open the URL url, which can be either a string or a Request object.

你的电话不正确。它应该是:

getUrl(url[0],url[1],url[2])

在函数内部,使用像“for ur in url”这样的循环来遍历所有网址。

答案 2 :(得分:0)

您应该使用for循环迭代您的网址:

import shutil
import urllib.request


urls = ['https://www.example.org/', 'https://www.foo.com/']

file_name = 'foo.txt'

def fetch_urls(urls):
    for i, url in enumerate(urls):
        file_name = "page-%s.html" % i
        response = urllib.request.urlopen(url)
        with open(file_name, 'wb') as out_file:
            shutil.copyfileobj(response, out_file)

fetch_urls(urls)

我假设您希望将内容保存到单独的文件中,因此我在此处使用enumerate来创建uniqe文件名,但您显然可以使用hash()中的任何内容,要创建uuidslugs模块。