2

我正在用 python 构建爬虫,我有href来自页面的列表。

现在我有要下载的文件扩展名列表

list = ['zip','rar','pdf','mp3']

如何使用 python 将该 URL 中的文件保存到本地目录

编辑:

import urllib2
from bs4 import BeautifulSoup

url = "http://www.example.com/downlaod"

site = urllib2.urlopen(url)
html = site.read()
soup = BeautifulSoup(html)

list_urls = soup.find_all('a')

print list_urls[6]
4

3 回答 3

4

按照您发布的示例:

import urllib2
from bs4 import BeautifulSoup

url = "http://www.example.com/downlaod"

site = urllib2.urlopen(url)
html = site.read()
soup = BeautifulSoup(html)

list_urls = soup.find_all('a')

print list_urls[6]

因此,您接下来要获取的 URL 大概是list_urls[6]['href'].

第一个技巧是这可能是一个相对 URL 而不是绝对的。所以:

newurl = list_urls[6]['href']
absurl = urlparse.urljoin(site.url, newurl)

此外,您只想获取具有正确扩展名的文件,因此:

if not absurl.endswith(extensions):
    return # or break or whatever

但是一旦你决定了要下载的 URL,它并不比你最初的获取更难:

page = urllib2.urlopen(absurl)
html = page.read()
path = urlparse.urlparse(absurl).path
name = os.path.basename(path)
with open(name, 'wb') as f:
    f.write(html)

主要是这样。

您可能想要添加一些东西,但如果是这样,您必须手动添加它们。例如:

  • 查找带有建议文件名的 Content-disposition 标头,以代替 URL 的基本名称。
  • copyfilefrom pagetof而不是read把整个事情都写进内存然后write再写出来。
  • 处理具有相同名称的现有文件。
  • …</li>

但这是基础。

于 2013-05-03T22:48:44.753 回答
3

您可以按照您的要求使用 python 请求库:http: //www.python-requests.org

您可以像这样从 url 保存文件:

import requests

url='http://i.stack.imgur.com/0LJdh.jpg'

data=requests.get(url).content

filename="image.jpg"

with open(filename, 'wb') as f:
        f.write(data)
于 2014-01-13T08:33:57.923 回答
0

使用 urllib3 的解决方案

import os
import urllib3
from bs4 import BeautifulSoup
import urllib.parse 
url = "https://path/site"
site = urllib3.PoolManager()
html = site.request('GET', url)
soup = BeautifulSoup(html.data, "lxml")
list_urls = soup.find_all('a')

然后是一个递归函数来获取所有文件

def recursive_function(list_urls)
    newurl = list_urls[0]['href']
    absurl = url+newurl
    list_urls.pop(0)
    if absurl.endswith(extensions): # verify if contains the targeted extensions
        page = urllib3.PoolManager()
        html = site.request('GET', absurl)
        name = os.path.basename(absurl)
        with open(name, 'wb') as f:
            f.write(html.data)
    return recursive_function(list_urls)
于 2018-09-18T16:25:50.830 回答