2016-06-18 5 views
1

Я пишу сценарий для получения информации о зданиях в Нью-Йорке. Я знаю, что мой код работает и возвращает то, что я бы хотел. Раньше я делал ручную запись, и это сработало. Теперь я пытаюсь, чтобы он читал адреса из текстового файла и получить доступ к веб-сайт с этой информацией, и я получаю эту ошибку:Ошибка HTTP 400: неверный запрос (urllib)

urllib.error.HTTPError: Ошибка HTTP 400: Bad Request

I полагают, что это имеет какое-то отношение к веб-сайту, не нравится много доступа от чего-то, что не является браузером. Я слышал что-то об User Agents, но не знаю, как их использовать. Вот мой код:

from bs4 import BeautifulSoup 
import urllib.request 

f = open("FILE PATH GOES HERE") 

def getBuilding(link): 
    r = urllib.request.urlopen(link).read() 
    soup = BeautifulSoup(r, "html.parser") 
    print(soup.find("b",text="KEYWORDS IM SEARCHING FOR GO HERE:").find_next("td").text) 


def main(): 
    for line in f: 
     num, name = line.split(" ", 1) 
     newName = name.replace(" ", "+") 
     link = "LINK GOES HERE (constructed from num and newName variables)" 
     getBuilding(link)  
    f.close() 

if __name__ == "__main__": 
    main() 
+0

Тот факт, что вы запустили код в изоляции, заставляет меня сомневаться, что сервер останавливает запрос на основе исключительно вашего User Agent. Скорее всего, это скорость, ограничивающая ваш клиент или ошибка в том, как вы построили свой запрос ... можете ли вы поместить реальный код для своей ссылки и образец строки из вашего файла? –

+0

Я вернусь к вам с этим завтра утром! – Harrison

ответ

2

A 400 ошибки означает, что сервер не может понять ваш запрос (например, неверный формат синтаксис). Тем не менее, до разработчиков, на какой код статуса они хотят вернуться и, к сожалению, не каждый строго следует их предполагаемому значению.

Отметьте это page для получения более подробной информации о кодах состояния HTTP.

С вопросами о том, как установить агент пользователя: Пользовательский агент задается в заголовке запроса и, в основном, определяет клиента, делающего запрос. Вот список признанных User Agents. Вам нужно будет использовать urllib2, а не urllib, но urllib2 также является встроенным пакетом. Я покажу вам, как обновить функцию getBuilding, чтобы установить заголовок с помощью этого модуля. Но я бы рекомендовал проверить библиотеку requests. Я просто считаю, что это супер прямолинейно, и он очень принят/поддерживается.

Python 2:

from urllib2 import Request, urlopen 

def getBuilding(link):   
    q = Request(link) 
    q.add_header('User-Agent', 'Mozilla/5.0') 
    r = urlopen(q).read() 
    soup = BeautifulSoup(r, "html.parser") 
    print(soup.find("b",text="KEYWORDS IM SEARCHING FOR GO HERE:").find_next("td").text) 

Python 3:

from urllib.request import Request, urlopen 

def getBuilding(link):   
    q = Request(link) 
    q.add_header('User-Agent', 'Mozilla/5.0') 
    r = urlopen(q).read() 
    soup = BeautifulSoup(r, "html.parser") 
    print(soup.find("b",text="KEYWORDS IM SEARCHING FOR GO HERE:").find_next("td").text) 

Примечание: Единственное различие между Python v2 и v3 является оператор импорта.

+0

Это говорит мне, что нет модуля с именем urllib2. Это из-за того, что я правильно использовал python 3? – Harrison

+0

Yup - Я обновил свой ответ, чтобы продемонстрировать операторы импорта Python 2 и 3. Кроме того, вы можете сделать что-то вроде решения, предлагаемого @ cees-timmerman [здесь] (http://stackoverflow.com/questions/7933417/how-do-i-set-headers-using-pythons-urllib/24870196#24870196), чтобы иметь оператор импорта, совместимый с обеими версиями. –

+0

ImportError: невозможно импортировать имя «Запрос»? – Harrison

Смежные вопросы