Scrapy получить URL запроса в разборе

20

Как я могу получить URL-адрес запроса в функции Scrapy parse() ? У меня много URL в start_urls , и некоторые из них перенаправляют моего паука на домашнюю страницу, и в результате у меня появляется пустой элемент. Поэтому мне нужно что-то вроде item['start_url'] = request.url для хранения этих URL. Я использую BaseSpider.

    
задан Goran 19.11.2013 в 21:07
источник
  • этот метод работал? –  NKelner 20.11.2013 в 23:33
  • вместо того, чтобы хранить их в стороне, во время очистки вы можете получить доступ к request_url, проверьте ниже мой ответ –  Rohan Khude 13.12.2017 в 13:19

5 ответов

36

Переменная 'response', передаваемая parse (), содержит необходимую информацию. Вам не нужно ничего переопределять.

например. (Edited)

def parse(self, response):
    print "URL: " + response.request.url
    
ответ дан Jagu 25.01.2015 в 08:50
  • Но это не URL-адрес запроса, а URL-адрес ответа. Средство связывания Scrapy обрабатывает перенаправления, поэтому вы можете получить другой URL-адрес. –  gusridd 20.01.2016 в 14:09
  • response.request.url –  Mayank Jaiswal 27.07.2016 в 17:30
  • Если URL-адрес перенаправлен, он дает перенаправленный URL-адрес, а не указанный URL-адрес –  Rohan Khude 13.12.2017 в 10:42
14

Объект запроса доступен из объекта ответа, поэтому вы можете сделать следующее:

def parse(self, response):
    item['start_url'] = response.request.url
    
ответ дан gusridd 29.12.2015 в 04:57
6

Вам необходимо переопределить make_requests_from_url(url) BaseSpider. функция , чтобы назначить start_url элементу, а затем использовать Request.meta специальные клавиши для передачи этого элемента в функцию parse

from scrapy.http import Request

    # override method
    def make_requests_from_url(self, url):
        item = MyItem()

        # assign url
        item['start_url'] = url
        request = Request(url, dont_filter=True)

        # set the meta['item'] to use the item in the next call back
        request.meta['item'] = item
        return request


    def parse(self, response):

        # access and do something with the item in parse
        item = response.meta['item']
        item['other_url'] = response.url
        return item

Надеюсь, это поможет.

    
ответ дан NKelner 19.11.2013 в 23:06
2

Вместо того, чтобы где-то хранить запрошенные URL-адреса, а также обработанные с помощью scrap URL-адреса не совпадают с последовательностью, указанной в start_urls .

Используя ниже,

response.request.meta['redirect_urls']

выдаст вам список перенаправлений, произошедших как ['http://requested_url','https://redirected_url','https://final_redirected_url']

Чтобы получить доступ к первому URL из списка выше, вы можете использовать

response.request.meta['redirect_urls'][0]

Для получения дополнительной информации см. doc.scrapy.org упоминается как:

RedirectMiddleware

This middleware handles redirection of requests based on response status.

URL-адреса, через которые проходит запрос (будучи перенаправленным), можно найти в ключе redirect_urls Request.meta .

Надеюсь, это поможет вам

    
ответ дан Rohan Khude 13.12.2017 в 13:17
1

Python 3.5

Scrapy 1.5.0

from scrapy.http import Request

# override method
def start_requests(self):
    for url in self.start_urls:
        item = {'start_url': url}
        request = Request(url, dont_filter=True)
        # set the meta['item'] to use the item in the next call back
        request.meta['item'] = item
        yield request

# use meta variable
def parse(self, response):
    url = response.meta['item']['start_url']
    
ответ дан Pleavă Sorin 17.04.2018 в 10:07