使用urlopen打开网址列表
我有一个Python脚本,它可以获取一个网页并进行镜像。这个脚本在处理一个特定的页面时运行得很好,但我无法让它处理多个页面。我原以为可以把多个网址放进一个列表里,然后把这个列表传给函数,但我遇到了这个错误:
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()
我在谷歌上找了很多方法,想知道怎么用urlopen()打开一个列表。我找到了一种方法,勉强能用。它需要一个.txt
文档,然后逐行读取,把每一行当作网址,但我现在用的是Python 3,不知道为什么twillcommandloop
无法导入。而且,这种方法也不太方便,听说还需要做一些不必要的工作。
总之,任何帮助都会非常感激。
3 个回答
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
来创建一个独特的文件名,但你当然可以使用其他方法,比如 hash()
,或者使用 uuid
模块来生成唯一标识符,甚至可以创建 简短的名字。
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 u in url”,来遍历所有的链接。
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)