我想从此网站下载一些文件:http://www.emuparadise.me/soundtracks/highquality/index.php
但我只想得到某些。
有没有办法编写python脚本来执行此操作?我有python的中级知识
我只是想寻找一些指导,请指向我的维基或图书馆来完成这个
感谢, 灌木
答案 0 :(得分:3)
我看了一下页面。链接似乎重定向到托管文件的另一个页面,单击下载文件。
我会使用mechanize来关注指向正确页面的必需链接,然后使用BeautifulSoup或lxml来解析生成的页面以获取文件名。
然后,使用urlopen打开文件并将其内容写入本地文件是一件简单的事情:
f = open(localFilePath, 'w')
f.write(urlopen(remoteFilePath).read())
f.close()
希望有所帮助
答案 1 :(得分:1)
为网页发出网址请求。获得源代码后,过滤掉并获取URL。
您要下载的文件是包含特定扩展名的网址。正是通过这种方式,您可以对符合条件的所有网址进行正则表达式搜索。 过滤后,然后对每个匹配的url数据执行url请求并将其写入内存。
示例代码:
#!/usr/bin/python
import re
import sys
import urllib
#Your sample url
sampleUrl = "http://stackoverflow.com"
urlAddInfo = urllib.urlopen(sampleUrl)
data = urlAddInfo.read()
#Sample extensions we'll be looking for: pngs and pdfs
TARGET_EXTENSIONS = "(png|pdf)"
targetCompile = re.compile(TARGET_EXTENSIONS, re.UNICODE|re.MULTILINE)
#Let's get all the urls: match criteria{no spaces or " in a url}
urls = re.findall('(https?://[^\s"]+)', data, re.UNICODE|re.MULTILINE)
#We want these folks
extensionMatches = filter(lambda url: url and targetCompile.search(url), urls)
#The rest of the unmatched urls for which the scrapping can also be repeated.
nonExtMatches = filter(lambda url: url and not targetCompile.search(url), urls)
def fileDl(targetUrl):
#Function to handle downloading of files.
#Arg: url => a String
#Output: Boolean to signify if file has been written to memory
#Validation of the url assumed, for the sake of keeping the illustration short
urlAddInfo = urllib.urlopen(targetUrl)
data = urlAddInfo.read()
fileNameSearch = re.search("([^\/\s]+)$", targetUrl) #Text right before the last slash '/'
if not fileNameSearch:
sys.stderr.write("Could not extract a filename from url '%s'\n"%(targetUrl))
return False
fileName = fileNameSearch.groups(1)[0]
with open(fileName, "wb") as f:
f.write(data)
sys.stderr.write("Wrote %s to memory\n"%(fileName))
return True
#Let's now download the matched files
dlResults = map(lambda fUrl: fileDl(fUrl), extensionMatches)
successfulDls = filter(lambda s: s, dlResults)
sys.stderr.write("Downloaded %d files from %s\n"%(len(successfulDls), sampleUrl))
#You can organize the above code into a function to repeat the process for each of the
#other urls and in that way you can make a crawler.
上面的代码主要是为Python2.X编写的。但是,I wrote a crawler that works on any version starting from 2.X
答案 2 :(得分:-1)
我会结合使用wget进行下载 - http://www.thegeekstuff.com/2009/09/the-ultimate-wget-download-guide-with-15-awesome-examples/#more-1885和BeautifulSoup http://www.crummy.com/software/BeautifulSoup/bs4/doc/来解析下载的文件
答案 3 :(得分:-1)
为什么是! 5年后,这不仅是可能的,而且您现在有了很多的实现方法。
在这里,我将避免使用代码示例,因为主要是希望将您的问题分解为几个部分,并为您提供一些探索的选择:
如果您必须坚持使用stdlib
,对于python2或python3,urllib[n]
* 是您想要的用于从互联网上删除某些内容。
再说一遍,如果您不希望依赖于其他软件包:
urllib
或urllib2
或我忘记的另一个urllib[n]
。你很幸运!!!!您已经:
requests
和文档here。 requests
是使用python在网上发布内容的黄金标准。我建议您使用它。 uplink
和文档here。这是相对较新的&用于更多编程客户端界面。 aiohttp
和文档here通过asyncio
。 asyincio
仅包含在python> = 3.5中,这也很令人困惑。就是说,如果您愿意投入时间,那么对于这个用例而言,它可能是非常可笑的。 ...我也不会不提我最喜欢的爬网工具之一:
-fake_useragent
回购here。 Docs喜欢的人没有必要。
同样,如果您必须坚持使用stdlib并且不使用pip
安装任何软件,那么您将获得额外的乐趣和安全性(<== extreme-sarcasm) xml
内置模块。具体来说,您可以使用:
xml.etree.ElementTree()
和文档here。值得注意的是,ElementTree
对象是可通过点子下载的lxml
包的基础,并使其更易于使用。如果要重新创建轮子并编写一堆自己的复杂逻辑,则可以选择使用默认的xml
模块。
lxml
和文档here。正如我之前说过的,lxml
是xml.etree
的包装,使它可以人类使用并实现您需要制作的所有解析工具。但是,正如您通过访问文档所看到的那样,要单独使用它并不容易。这将我们带到... BeautifulSoup
,也称为bs4
和文档here。 BeautifulSoup使一切变得简单。这是我的建议。
此部分与“细分1”几乎完全相同,除了您有一堆链接而不是一堆。
在本部分和“第1部分”之间唯一改变的是我对使用方式的建议:aiohttp
在处理多个URL时将更快地下载方式,因为它允许您下载它们并行。 **
* -(其中n
是从python版本转换为ptyhon版本,以某种令人沮丧的任意方式决定的。查找哪个urllib[n]
具有{{1 }}作为顶级功能。您可以阅读有关此命名约定群集f k here,here和here的更多信息。)
**** -(这不是完全正确。在人类时间尺度上,它在功能上更为真实。)