Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Python для экспертов
  • » Есть url ссылки, когда просто руками добавляешь в браузер - работают все, в коде работает половина. [RSS Feed]

#1 Июль 31, 2018 16:42:28

ElenaBarbanova
Зарегистрирован: 2018-07-20
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Есть url ссылки, когда просто руками добавляешь в браузер - работают все, в коде работает половина.

Здравствуйте, Есть url ссылки, когда просто руками добавляешь в браузер - работают все, в коде работает половина. Для тех, которые не работают пишется ошибка:
urllib.error.HTTPError: HTTP Error 400: Bad Request

как вы думаете, в чем проблема?

Офлайн

#2 Авг. 1, 2018 01:18:30

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9726
Репутация: +  843  -
Профиль   Отправить e-mail  

Есть url ссылки, когда просто руками добавляешь в браузер - работают все, в коде работает половина.

Для начала надо изобразить браузер. Для этого обычно заголовок User-Agent надо установить на слово Firefox (этого хватает обычно).



Отредактировано py.user.next (Авг. 1, 2018 01:19:09)

Офлайн

#3 Авг. 1, 2018 08:59:21

ElenaBarbanova
Зарегистрирован: 2018-07-20
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Есть url ссылки, когда просто руками добавляешь в браузер - работают все, в коде работает половина.

import traceback
from urllib.request import urlopen
from Data import Data


class CSVWriter:
def __init__(self):
self.total1 = 0
self.total2 = 0

def getResponseFromUrl(self, metric_url):
try:
response = urlopen(metric_url)
html = response.read()
return html
except:
print("Could not open URL: " + metric_url)
print(traceback.print_exc())
return ""

def writeToCSV(self, filename, metric_url):
data_dict = []
response = self.getResponseFromUrl(metric_url)
if len(response) > 0:
response = response.decode('utf8').split("\n")
n = 0
with open("Output\\" + filename, 'w', encoding='utf8') as the_file:
for line in response:
print(line)
n += 1
the_file.write(line + '\n')
if n == 2:
self.total1 = line.split("\",\"")[1].replace("\"", "")
self.total2 = line.split("\",\"")[2].replace("\"", "")
if n > 2:
if len(line) == 0:
# this is the end of file. last line comes empty from metrics
break
# calculate percents
title = line.split("\",\"")[0] + "\""
line_total1 = line.split("\",\"")[1].replace("\"", "")
line_total2 = line.split("\",\"")[2].replace("\"", "")
percent1 = float(line_total1) * 100 / float(self.total1)
percent2 = float(line_total2) * 100 / float(self.total2)
data_dict.append(Data(title, percent1, percent2))
print("\n")
file_title = filename.split(".")[0]
file_extension = filename.split(".")[1]
new_filepath = "Output\\" + file_title + "_percents." + file_extension
with open(new_filepath, 'w', encoding='utf8') as the_file:
for data in data_dict:
the_file.write(data.title + ", " + "{0:.2f}".format(data.percent1) + "%" + ", " + "{0:.2f}".format(data.percent2) + "%" + "\n")

Офлайн

#4 Авг. 1, 2018 08:59:47

ElenaBarbanova
Зарегистрирован: 2018-07-20
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Есть url ссылки, когда просто руками добавляешь в браузер - работают все, в коде работает половина.

Можно попотробнее, где именно это написать

Офлайн

#5 Авг. 1, 2018 10:12:11

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9726
Репутация: +  843  -
Профиль   Отправить e-mail  

Есть url ссылки, когда просто руками добавляешь в браузер - работают все, в коде работает половина.

ElenaBarbanova
 response = urlopen(metric_url)
Вот здесь надо передавать объект urllib.request.Request() у которого установить заголовок User-Agent.
https://docs.python.org/3/library/urllib.request.html#urllib.request.Request

Перед этим надо удостовериться, что дело в заголовке. Надо использовать либо программу wget, либо curl. Там можно передавать заголовки.



Отредактировано py.user.next (Авг. 2, 2018 07:25:53)

Офлайн

  • Начало
  • » Python для экспертов
  • » Есть url ссылки, когда просто руками добавляешь в браузер - работают все, в коде работает половина.[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version