Есть ли способ исправить реферер: нет ошибки 301? - PullRequest
0 голосов
/ 11 января 2019

Я относительно новичок в scrapy и мне интересно, есть ли способ передать реферер в команду response.follow (). Я пытаюсь вычистить цены на недвижимость из рук в руки сайта, и у меня возникают проблемы с получением копий для перехода по ссылкам на нумерацию страниц. Скребок отлично работает на главной странице, но сайт не позволит ему получить доступ ни к одной из других страниц.

Я пытался открыть вторую страницу напрямую, используя команду fetch в оболочке scrapy, но это не сработало. Я открыл страницу, используя вид для проверки элемента, и обнаружил следующую ошибку:

"Доступ к XMLHttpRequest в 'https://someaddress.com из источника' null 'был заблокирован политикой CORS: в запрошенном ресурсе отсутствует заголовок' Access-Control-Allow-origin '."

любой совет или ресурсы будут очень признательны.

-Спасибо

import scrapy


class cwSpider(scrapy.Spider):
    name = 'cushman2'
    custom_settings = {
        'DUPEFILTER_DEBUG': 'True',
    }
    start_urls = ['https://cwstevenson.ca/properties/advance-search-properties/']
    def parse(self, response):
        # follow links to author pages
        for href in response.css('.wpl_prp_bot a::attr(href)'):
            yield response.follow(href, self.parse_property)

        # follow pagination links
        for href in response.css('li.next a::attr(href)'):
            yield response.follow(href, self.parse)

    def parse_property(self, response):
        response.request.headers.get('Referrer', None)
        def extract_with_css(query):
            return response.css(query).extract()

        yield {
            'address' : extract_with_css('h1.title_text::text'),
            'Prop_Type': extract_with_css('.ldetailscont2 p.ldetailsinfo::text')[0],
            'Land Area': extract_with_css('.ldetailscont2 p.ldetailsinfo::text')[1],
            'Price': extract_with_css('.ldetailscont2 p.ldetailsinfo::text')[2],
            'Listing_Type': extract_with_css('.ldetailscont2 p.ldetailsinfo::text')[3],
            'Area_Avail': extract_with_css('.ldetailscont2 p.ldetailsinfo::text')[4],
            'Prop_Taxes': extract_with_css('.ldetailscont2 p.ldetailsinfo::text')[5],
        }

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Используйте параметр header в строке .follow, чтобы передать любую соответствующую информацию следующей команде, чтобы удовлетворить заголовки сайтов. в этом случае это был реферер. Чтобы понять заголовок сайта, вы можете открыть вкладку разработчика в Chrome, перейти на вкладку сети, затем на вкладку XHR (убедитесь, что она открыта при загрузке сайта, если не просто обновите страницу, когда она открыта) нажмите на вкладку заголовков и прокрутите вниз, пока не увидите реферера под заголовком. Вы можете использовать это для заполнения заголовков в вашем sprider. Я полагаю, что есть варианты сделать это через ваше промежуточное программное обеспечение, но ни один из вариантов, казалось, не удовлетворял требованиям этой проблемы (то есть: same_origin, origin ... ect)

def parse(self, response):
        # follow links to author pages
        for href in response.css('.wpl_prp_bot a::attr(href)').extract():
            yield response.follow(href, self.parse_property, headers = {'User-Agent': 'Chrome/71.0.3578.98', "Referer": href})

        # follow pagination links
        for href in response.css('li.next a::attr(href)').extract():
            yield response.follow(href, self.parse,headers = {'User-Agent': 'Chrome/71.0.3578.98', "Referer": href})
0 голосов
/ 12 января 2019

Вам нужно извлечь ссылку в виде строки, в противном случае она возвращает список selector s.
response.follow требует url в виде строки. Он не принимает список selector объектов.
поскольку response.follow не получает действительные аргументы - он не выполняет следующие запросы

def parse(self, response):
    # follow links to author pages
    for href in response.css('.wpl_prp_bot a::attr(href)').extract():   #
        yield response.follow(href, self.parse_property)

    # follow pagination links
    for href in response.css('li.next a::attr(href)').extract():   #
        yield response.follow(href, self.parse)
...