Как получить местоположение перенаправления с Python, когда он отображается только при нажатии в браузере - PullRequest
1 голос
/ 18 марта 2019

Я пытаюсь загрузить некоторые аудиоклипы с http://www.pingshu8.com/down_121010.html

Используя scrapy, я получаю реальную связь с файлом:

from urllib.parse import unquote
fetch('http://www.pingshu8.com/down_121008.html')
downurl=response.xpath('//script/text()').extract()[0]
downurl=unquote(unquote(downurl))
downurl1=response.urljoin(re.search('bzmtv_Inc/download.asp\?fid=\d+&t=\d+',downurl).group())

но когда я использую

fetch(downurl1)

Я получил статус 200 вместо 301 перенаправления на правильный URL.

Я обнаружил, что могу получить правильный результат только при нажатии кнопки загрузки.

1 Ответ

2 голосов
/ 20 марта 2019

Сайт проверяет как Referer , так и User-Agent :

import re
from urllib import unquote
from scrapy.http import Request

initial_url = 'http://www.pingshu8.com/down_121008.html'
fetch(initial_url)
downurl = unquote(unquote(response.xpath('//script/text()').extract()[0]))
downurl = response.urljoin(re.search('bzmtv_Inc/download.asp\?fid=\d+&t=\d+', downurl).group())

# if you request without these required headers (User-Agent and Referer) no content is returned
r = Request(downurl)
fetch(r)
print response.body

# but if you request with those headers, it will return content
request_with_headers = Request(
      downurl,
      headers = {
        'Referer': initial_url,
        'User-Agent':'Mozilla/4.6 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.326.109 Safari/507.23',
      },
      meta = {
        'dont_redirect': True,
        'handle_httpstatus_list': [301,302],
      }
)
fetch(request_with_headers)
print response.headers.get('Location')

Вывод из примера с заголовками:

>>> print response.headers.get('Location')
https://down01.pingshu8.com:8011/2/ys/儿童文学60年经典回放(16集)/儿童文学60年经典回放_01.mp3?t=ztmu1924596a0610b630ddd21a54fda258fa0&m=5C9208AE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...