Как уже говорилось в некоторых комментариях, если вам нужно как-то взаимодействовать с Javascript на странице, лучше использовать селен. Тем не менее, относительно вашего первого подхода с использованием заголовка:
import requests
from bs4 import BeautifulSoup
url = "http://www.amazon.com/dp/" + 'B004CNH98C'
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text,"html.parser")
Эти заголовки немного устарели, но все равно должны работать. Используя их, вы притворяетесь, что ваш запрос поступил от обычного веб-браузера. Если вы используете requests
без такого заголовка, ваш код в основном сообщает серверу, что запрос поступает от python, который большинство серверов отклоняет сразу.
Другой альтернативой для вас также может быть fake-useragent возможно, вы также можете попробовать это.