Парсинг с блокировкой Python только на экземплярах AWS - запросы на получение заблокированы - PullRequest
1 голос
/ 20 июня 2020

Я создал скрипт для очистки www.tesco.com страницы результатов бакалеи, пример ссылки:

https://www.tesco.com/groceries/en-GB/search?query=kitkat

К сожалению, мой Python скрипт блокируется сервером (обычный запрос на получение). Я даже пытался использовать CURL на своем компьютере для устранения неполадок:

curl htpps://www.tesco.com

, но я получаю ответ ниже:

<HTML><HEAD>
<TITLE>Access Denied</TITLE>
</HEAD><BODY>
<H1>Access Denied</H1>
 
You don't have permission to access "http&#58;&#47;&#47;dce&#45;homepage&#46;tesco&#46;com&#47;" on this server.<P>
Reference&#32;&#35;18&#46;496cd417&#46;1592645071&#46;44e961c
</BODY>
</HTML>

При попытке использовать Postman со стандартными заголовками я получаю 200 OK ответ. В своем сценарии я попытался использовать те же заголовки, что и Postman, и получил 200 OK, но только если я использую его на своем локальном P C. Когда я запускаю fre sh Instance на AWS - бесплатном уровне Ubuntu 18.04 или аналогичном - когда-либо CURL получает 404, как указано выше. В идеале я бы хотел, чтобы мой скрипт работал на AWS. При запуске скрипт не работает - просто зависает. Когда я прерываю его, я получаю следующее:

^CTraceback (most recent call last):
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 380, in _make_request
    httplib_response = conn.getresponse(buffering=True)
TypeError: getresponse() got an unexpected keyword argument 'buffering'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "ttest.py", line 18, in <module>
    results = requests.get(url, headers = headers)
  File "/usr/lib/python3/dist-packages/requests/api.py", line 72, in get
    return request('get', url, params=params, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/api.py", line 58, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line 520, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line 630, in send
    r = adapter.send(request, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/adapters.py", line 440, in send
    timeout=timeout
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 601, in urlopen
    chunked=chunked)
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 383, in _make_request
    httplib_response = conn.getresponse()
  File "/usr/lib/python3.6/http/client.py", line 1356, in getresponse
    response.begin()
  File "/usr/lib/python3.6/http/client.py", line 307, in begin
    version, status, reason = self._read_status()
  File "/usr/lib/python3.6/http/client.py", line 268, in _read_status
    line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
  File "/usr/lib/python3.6/socket.py", line 586, in readinto
    return self._sock.recv_into(b)
  File "/usr/lib/python3.6/ssl.py", line 1012, in recv_into
    return self.read(nbytes, buffer)
  File "/usr/lib/python3.6/ssl.py", line 874, in read
    return self._sslobj.read(len, buffer)
  File "/usr/lib/python3.6/ssl.py", line 631, in read
    v = self._sslobj.read(len, buffer)
KeyboardInterrupt

Возможно, tesco.com запретил всем AWS экземплярам сканировать свой веб-сайт?

Вот код, который работает на моем P C но не в экземпляре AWS.

'EDIT' - я пробовал без наших файлов cookie в заголовках - все равно не повезло.


import requests
headers = {'User-Agent': 'PostmanRuntime/7.25.0',
'Accept': '*/*',
'Cache-Control': 'no-cache',
'Host': 'www.tesco.com',
'Accept-Encoding': 'gzip, deflate, br',
'Connection': 'keep-alive',
'Cookie': 'bm_sz=04919BE521C5C4D8ADF4617D5250A484~YAAQrpxkX+b8IYVyAQAA/VQr0QgTg5gDEXUmuUfa0qqtHv0QHHZjtL4gcSJ9RA7hoaEXJOTp1DYPb9xCrGwP37BrvtUY2kCKB7PqvVLXAXnfrt9F0ZiEPj10SiSVXZRZj8klW46ZA7Ho/0XtWlsO2aFX1MPkmD2/C10cDH6E1PgeO9EUNkZi9uPu109p4DE=; _abck=5621BD87FE69A39458BD0AB267BB9A81~-1~YAAQrpxkX+f8IYVyAQAA/VQr0QTSvxcBlxnRsND9THtPksH0EbfK/A3XkW0xT9oCk0Bj1ewbVDXr3PqtBjR7hHO6h6IXMvC2XID5RrAk0gVEKGwm9RDyBWyvp6hnPzicHMH6tTUIZdYLmssjIBAJ2WnpBkKUuF0YbX45V4H8d3m6u8FOhyqZewFyT1+Yvh14NDHwmDw4Yb4hQkLPglrkzt8LV39SpfSjjGkWMjyX4l967aCe+SHK5hjcTIz9bjSAoOQNqFWR5ATMnfBDSLOfaAQ4Dic=~-1~-1~-1; atrc=48693e75-78d9-4fce-85d0-9a0a50232644; _csrf=2wH2UKiamS-tjvd4hERekcG2',
'Referer': 'http://www.tesco.com/'

}

url = 'https://www.tesco.com/groceries/en-GB/search?query=kitkat'
results = requests.get(url, headers = headers)

print(results.status_code)

www.tesco.com robots.txt не запрещает очистку:


Sitemap: https://www.tesco.com/UK.sitemap.xml
 
User-agent: *
Disallow: *reviews/submission/*
Disallow: *&sortBy*
Disallow: *promotion=*
Disallow: *currentModal*
Disallow: *active-tab*
Disallow: *include-children*
Disallow: *new&new*
Disallow: /groceries/*reviews/submission

РЕДАКТИРОВАТЬ :

Я загрузил безголовый chrome веб-браузер на свой экземпляр сервера ubuntu на AWS и попробовал сделать снимок экрана с tesco.com. Я получаю ошибку ниже:

введите описание изображения здесь

Для пояснения я попытался просмотреть https-адрес - это не имеет значения, поскольку я уверен, что он имеет перенаправление https.

Ответы [ 2 ]

2 голосов
/ 20 июня 2020

AWS publi sh их диапазоны IP-адресов в формате json. Его можно импортировать на веб-серверы, чтобы остановить парсинг веб-сайтов. Я ожидал бы, что большая сеть супермаркетов, такая как Tescos, внедрит это. 1006 *. При небольшой вероятности того, что их диапазоны IP-адресов устарели.

Также существует вероятность, что кто-то с ламбадой AWS с тем же общим диапазоном IP-адресов отправил множество запросов за короткий период и получил автоматически блокируется.

Чтобы обойти эту проблему, вы можете подключиться к VPN, которая скроет ваш AWS IP-адрес. Также вы можете создать VP C на вашем локальном компьютере (и, следовательно, использовать ваш локальный IP-адрес P C).

0 голосов
/ 21 июня 2020

Похоже, Tesco.com блокирует AWS IP-адрес. В результате я использовал платные прокси, которые пока работают нормально. Спасибо @ Dan-Dev за помощь в проверке вашего экземпляра AWS.

...