Как сделать так, чтобы все бинарные файлы (изображения) загружались с использованием запросов () и открытия ()? - PullRequest
0 голосов
/ 10 мая 2019

Когда я пытаюсь загрузить изображение с одного URL, код работает, но когда я пытаюсь использовать другой URL, он не работает.Это не работаетОн только создает имя файла.

# This Doesn't Work.
import requests
url = 'https://ryanspressurewashing.com/wp-content/uploads/2017/06/metal-
roof-after-pressure-washing.jpg'

r = requests.get(url, stream=True)
with open('image3.jpg', 'wb') as my_file:
# Read by 4KB chunks
    for byte_chunk in r.iter_content(chunk_size=4096):
        my_file.write(byte_chunk)



#  This Works?

import requests
url = 'http://www.webscrapingfordatascience.com/files/kitten.jpg'
r = requests.get(url, stream=True)
with open('image.jpg', 'wb') as my_file:
# Read by 4KB chunks
    for byte_chunk in r.iter_content(chunk_size=4096):
        my_file.write(byte_chunk)

1 Ответ

0 голосов
/ 10 мая 2019

Разные порталы могут иметь разные системы безопасности для блокировки скриптов / ботов.

Когда вы откроете image3.jpg в текстовом редакторе, вы увидите

<head>
<title>Not Acceptable!</title>
</head>
<body>
<h1>Not Acceptable!</h1>
<p>An appropriate representation of the requested resource could not be found on  this server. 
This error was generated by Mod_Security.</p>
</body>
</html>

Некоторым серверам могут потребоваться правильные headerse, cookies, session-id и т. Д. Для предоставления доступа к данным.

Этому порталу нужен правильный заголовок user-agent

import requests

url = 'https://ryanspressurewashing.com/wp-content/uploads/2017/06/metal-roof-after-pressure-washing.jpg'

headers = {
  'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0'
}

r = requests.get(url, stream=True, headers=headers)

with open('image3.jpg', 'wb') as my_file:
# Read by 4KB chunks
    for byte_chunk in r.iter_content(chunk_size=4096):
        my_file.write(byte_chunk)

requests по умолчанию использует user-agent: python-requests/2.21.0, чтобы порталы могли легко распознать сценарий и заблокировать его.

Вы можете увидеть этот заголовок, используя https://httpbin.org/get

import requests

r = requests.get('https://httpbin.org/get')
print(r.text)

Результат:

{
  "args": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.21.0"
  }, 
  "origin": "83.23.39.165, 83.23.39.165", 
  "url": "https://httpbin.org/get"
}

См. Больше функций на httpbin.org

...