从python停止使用urlretrieve下载xls / csv文件

时间:2018-11-08 20:17:09

标签: python-3.x beautifulsoup web-crawler http-status-code-500 urlretrieve

我正在尝试使用Python3.7中urllib.request模块中的 urlretrieve 从此ASPX site及其文件夹中下载大量xls文件。首先,我使用站点的URL构建一个txt文件。然后,根据此解决方案here,我遍历该列表并要求服务器检索xls文件。

该算法开始在工作目录中下载xls文件,但是经过3或4次迭代后,它破解了。下载的文件(3或4)的大小不正确(例如,所有文件均为7351Kb,而不是99Kb或83Kb)。令人惊讶的是,这是txt文件中最后一个网址的大小。

有时,日志会发送一条带有500错误的消息。

对于最后一个问题,我的假设/问题是:

  1. 由于防火墙阻止重复调用服务器而引发错误

  2. 也许这些电话违反了异步/异步规则,这对我来说是未知的。我使用time.sleep来防止错误,但是失败了。

第一个问题太奇怪了,它与第二个问题联系在一起。

这是我的代码:

import os
import time    
from random import randint
from bs4 import BeautifulSoup
from urllib.parse import urljoin
from urllib.request import urlopen, urlretrieve, quote    



url="http://informacioninteligente10.xm.com.co/transacciones/Paginas/HistoricoTransacciones.aspx"
        u = urlopen(url)
        try:
            html = u.read().decode('utf-8')
        finally:
            u.close()
direcciones = [] #to be populated with urls

soup = BeautifulSoup(html)
for link in soup.select('div[webpartid] a'):
    href = link.get('href')
    if href.startswith('javascript:'):
        continue
    filename = href.rsplit('/', 1)[-1]

    href = urljoin(url, quote(href))
    #try:
    #    urlretrieve(href, filename)
    #except:
    #    print('Downloading Error')

    if any (href.endswith(x) for x in ['.xls','.xlsx','.csv']):
        direcciones.append(href)

# "\n"  adds a new line
direcciones = '\n'.join(direcciones)


#Save every element in a txt file
with open("file.txt", "w") as output:
     output.write(direcciones) 


DOWNLOADS_DIR = os.getcwd()

# For every line in the file
for url in open("file.txt"):
    time.sleep(randint(0,5))

    # Split on the rightmost / and take everything on the right side of that
    name = url.rsplit('/', 1)[-1]

    # Combine the name and the downloads directory to get the local filename
    filename = os.path.join(DOWNLOADS_DIR, name)
    filename = filename[:-1] #Quitamos el espacio en blanco al final

    # Download the file if it does not exist
    if not os.path.isfile(filename):
        urlretrieve(href, filename)

我使用的网址解析器不正确吗?

有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分:0)

它具有Anti bot,您需要设置浏览器用户代理,而不是默认的python用户代理

......
import urllib.request

opener = urllib.request.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0')]
urllib.request.install_opener(opener)

url=....

您必须在{p>中将href替换为url

if not os.path.isfile(filename):
    urlretrieve(href, filename) # must be: url