'requests' scrap URL-адреса возвращает 404, даже если заголовки и страница определенно существуют - PullRequest
1 голос
/ 08 мая 2020

Итак, я пытаюсь очистить страницу Ubereats. URL-адрес: https://www.ubereats.com/ann-arbor/food-delivery/chipotle-mexican-grill-3354-washtenaw-ave-ste-a/zbEbQIdWT2-n6iTWqjz55Q

Итак, я использую библиотеку запросов. Я знаю, что страница существует, потому что могу перейти по ссылке. Но скрипт возвращает ошибку 404. В онлайн-решениях говорится, что мы должны включать заголовки, но это тоже бесполезно.

Вот мой код:

from bs4 import BeautifulSoup
import requests

headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:63.0) Gecko/20100101 Firefox/63.0'}
page = requests.get('https://www.ubereats.com/ann-arbor/food-delivery/chipotle-mexican-grill-3354-washtenaw-ave-ste-a/zbEbQIdWT2-n6iTWqjz55Q', headers=headers  )

print(page.content)

Что мне не хватает или что я делаю неправильно?

1 Ответ

3 голосов
/ 08 мая 2020

Настоящий веб-браузер отправляет много разных значений в заголовках - не только User-Agent.

Многие серверы проверяют только User-Agent для отправки правильного HTML для настольного компьютера или мобильного устройства. Но некоторые серверы могут проверять другие заголовки.

Этой странице нужен заголовок Accept, но код работает даже без User-Agent

import requests

headers = {
#    'User-Agent': 'Mozilla/5.0',
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", 
#    "Accept-Encoding": "gzip, deflate, br"
#    "Accept-Language": "en-US;q=0.7,en;q=0.3"
# ... other headers ...
}

url = 'https://www.ubereats.com/ann-arbor/food-delivery/chipotle-mexican-grill-3354-washtenaw-ave-ste-a/zbEbQIdWT2-n6iTWqjz55Q'
page = requests.get(url, headers=headers)

print(page.status_code)
print(page.text) 
#print(page.content)

Вы можете использовать DevTools в Firefox / Chrome (вкладка Network), чтобы увидеть все повторные запросы от браузера к серверу и все заголовки / данные, отправленные на сервер. А затем вы можете скопировать заголовки и протестировать в своем коде.

...