Python запрос на сканирование URL возвращает 404 Ошибка при работе внутри браузера - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть сканирующий python скрипт, который висит на URL: pulsepoint.com/sellers.json

Бот использует стандартный запрос для получения контента, но возвращается ошибка 404. В браузере это работает (есть перенаправление 301, но за этим может следовать запрос). Первое, что я думаю, - это проблема заголовка запроса, поэтому я скопировал конфигурацию браузера. Код выглядит следующим образом:

        crawled_url="pulsepoint.com"
        seller_json_url = 'http://{thehost}/sellers.json'.format(thehost=crawled_url)
        print(seller_json_url)
        myheaders = {
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0',
                'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
                'Accept-Language': 'fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3',
                'Accept-Encoding': 'gzip, deflate, br',
                'Connection': 'keep-alive',
                'Pragma': 'no-cache',
                'Cache-Control': 'no-cache'
            }
        r = requests.get(seller_json_url, headers=myheaders)
        logging.info("  %d" % r.status_code)

Но я все еще получаю сообщение об ошибке 404.

Моя следующая догадка:

  • Логин? Не используется здесь
  • Печенье? Не то чтобы я мог видеть

Так как их сервер блокирует моего бота? Кстати, это URL, который должен быть просканирован, ничего противозаконного ..

Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 01 апреля 2020

Можно также обойти ошибку SSL-сертификата, как показано ниже:

from urllib.request import urlopen
import ssl
import json

#this is a workaround on the SSL error
ssl._create_default_https_context = ssl._create_unverified_context
crawled_url="pulsepoint.com"
seller_json_url = 'http://{thehost}/sellers.json'.format(thehost=crawled_url)
print(seller_json_url)

response = urlopen(seller_json_url).read() 
# print in dictionary format
print(json.loads(response)) 

Пример ответа:

{'contact_email': 'PublisherSupport@pulsepoint.com', 'contact_address': '360 Madison Ave, 14th Floor, NY, NY, 10017', 'version': '1.0', 'identifiers': [{'name': 'TAG-ID', 'value': '89ff185a4c4e857 c'} ], 'sellers': [{'seller_id': '508738', ...

... 'seller_type': 'PUBLISHER'}, {'seller_id': '562225', 'name': 'EL DIARIO', 'domain': 'impremedia.com', 'seller_type': 'PUBLISHER'}]}

0 голосов
/ 03 апреля 2020

Ладно, просто для других людей - усиленная версия ответа «XmoůŜ», потому что:

  • Некоторые веб-сайты хотят, чтобы заголовки отвечали;
  • Некоторые веб-сайты используют странную кодировку
  • Некоторые веб-сайты отправляют gzipped ответ, когда не запрашивается.
    import urllib
    import ssl
    import json
    from io import BytesIO
    import gzip

    ssl._create_default_https_context = ssl._create_unverified_context
    crawled_url="pulsepoint.com"
    seller_json_url = 'http://{thehost}/sellers.json'.format(thehost=crawled_url)
    req = urllib.request.Request(seller_json_url)
    # ADDING THE HEADERS
    req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0')
    req.add_header('Accept','application/json,text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8')

    response = urllib.request.urlopen(req)
    data=response.read()
    # IN CASE THE ANSWER IS GZIPPED
    if response.info().get('Content-Encoding') == 'gzip':
        buf = BytesIO(data)
        f = gzip.GzipFile(fileobj=buf)
        data = f.read()
    # ADAPTS THE ENCODING TO THE ANSWER
    print(json.loads(data.decode(response.info().get_param('charset') or 'utf-8')))

Еще раз спасибо!

0 голосов
/ 01 апреля 2020

Вы можете просто go напрямую перейти по ссылке и извлечь данные, не нужно вводить 301 по правильной ссылке

import requests
headers = {"Upgrade-Insecure-Requests": "1"}
response = requests.get(
    url="https://projects.contextweb.com/sellersjson/sellers.json",
    headers=headers,
    verify=False,
)

...