На самом деле, написанный вами код работает правильно, проблема в заголовках HTTP-запроса. По умолчанию urllib
использует Python-urllib/{version}
в качестве значения заголовка User-Agent
, что позволяет веб-сайту распознавать ваш запрос как автоматически сгенерированный. Чтобы избежать этого, вы должны использовать пользовательское значение, которое может быть достигнуто, передав Request
объект в качестве первого параметра urlopen()
:
from urllib.parse import urlencode, urlunparse
from urllib.request import urlopen, Request
from bs4 import BeautifulSoup
query = "programming"
url = urlunparse(("https", "www.bing.com", "/search", "", urlencode({"q": query}), ""))
custom_user_agent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0"
req = Request(url, headers={"User-Agent": custom_user_agent})
page = urlopen(req)
# Further code I've left unmodified
soup = BeautifulSoup(page.read())
links = soup.findAll("a")
for link in links:
print(link["href"])
PS Посмотрите на комментарий оставлено @edd под вашим вопросом.