Scrapy, Xpath, результатов нет? - PullRequest
0 голосов
/ 11 июля 2020

URL, который я пытаюсь очистить:

https://www.controller.com/listings/aircraft/for-sale/list?SortOrder=23&scf=False&page=1

Я новичок в Scrapy и программировании в целом, но мне все же удалось очистить несколько веб-сайтов до этого.

Когда я впервые попытался очистить вышеуказанный URL, я продолжал работать с кодом 403. После некоторых исследований я смог обойти это, загрузив пакет user_agents для scrapy. Работает следующий пользовательский агент:

'Mozilla / 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit / 537.36 (K HTML, как Gecko) Chrome / 60.0.3112.78 Safari / 537.36'

Я экспериментировал с простым кодом Xpath, например, ниже, просто чтобы убедиться, что получаю результат.

    def parse(self, response):
        text = response.xpath("//div[@class='mobile-map-select']/text()").extract()
        print(text)

После многократных попыток с другим кодом я все еще получаю пустой list в качестве вывода.

Кто-нибудь знает, почему это продолжает происходить?

1 Ответ

2 голосов
/ 11 июля 2020

Некоторые веб-сайты требуют, чтобы вы размещали заголовки и файлы cookie. Это называется реинжинирингом запроса. Иногда для доступа к HTML вам нужно попробовать mimi c точный запрос к серверу, поэтому это означает отправку заголовков и повар ie.

Переработка HTTP-запроса

Сначала вы хотите использовать что-то вроде chrometools, чтобы просмотреть запрос. Щелкнув правой кнопкой мыши и щелкнув вкладку сети, перезагрузите страницу, на которой вы хотите видеть запросы на вкладке сети, должны начать заполнять все запросы, сделанные сервером для загрузки страницы. Здесь мы можем найти именно тот тип HTTP-запроса, который необходим для загрузки HTML страницы.

Image1: Здесь

Здесь мы видим запрос сайта HTML слева, справа у нас есть URL-адрес запросов, который мы хотим сделать

Image2: Здесь

Теперь справа у нас есть заголовки запросов и отправленные файлы cookie. Вы создаете заголовки словаря с ключами и значениями. Мы также можем сделать то же самое для файлов cookie.

Затем мы хотим создать запрос Scrapy с этими заголовками и этими файлами cookie, и это имитирует запрос, который ожидает сервер.

Более простой способ повторной обработки. разработка HTTP-запроса

Вы можете скопировать команду curl HTTP-запроса, как показано на изображении ниже.

Изображение: здесь

Копирование это в здесь , веб-сайт, который преобразует его в запрос python. Это даст вам красиво отформатированные заголовки / файлы cookie и т. Д. c. Затем вы можете скопировать словарь для заголовков и файлов cookie.

Пример кода

import scrapy

class TestSpider(scrapy.Spider):
    name = 'test'
    allowed_domains = ['https://www.controller.com/listings/aircraft/for-\ 
                      sale/list?SortOrder=23&scf=False&page=1']
    start_urls = ['http://controller.com/']



    cookies = {
    '__cfduid': 'dec92bef19d6ab9ae41ad9a69d3cd1be21594487232',
    'ASP.NET_SessionId': '5cjpkvyh5sjstdhd12eglk5b',
    'USERID': '170264603',
    'TRACKING': 'SessionStarted=1&GUID=9a1b8738f0b94ccb943e2f865c9a2199&UserReferrer=https%3a%2f%2fwww.controller.com%2flistings%2faircraft%2ffor-sale%2flist%3fSortOrder%3d23%26scf%3dFalse%26page%3d1',
    'TopPopup-Cookie_11': 'Unit=available&Retry=2020-07-12T17:07:15.9365191Z',
    '__RequestVerificationToken': 'AJ3z0d7OpPyY49AuIT-JJCxLZ5-JjJ0Fwf20lAdSLIRmrowO1Kwv-Cy3Bo7AHkkyODF0Sg2',
    'BIGipServerwww.controller.com_http_pool': '1065461952.20480.0000',
    'UserSettingsSession': 'Geo=GB%7cUnited+Kingdom%7cEdinburgh%7cEdinburgh%7cEH11%7c55.9335%7c-3.254%7c0%7c0%7c%7c&screen-size-set=True',
    'UserSettings': 'currency-preference=USD&override-currency=True&onelinelistings=False&unit-preference=imperial&override-unit=True&DefaultMap=&thumbnailphotos=True&screen-height=912&screen-width=1368&image-height=480&image-width=639',
    'reese84': '3:vi2UoeO7DhA7Vp0/IEXo+Q==:0C/8X3VRY0DMDTzIz4ceLFK5QsFhd0l+hlqDe5lhpnON5Y0j4IuQ/kfec8PKCiE6bqdpfPB3/8EK0gk4yh43mSJnfJS3Xwmzm9Tl9YyEMnRrZ2+xNjWQHWqZydQVUlfJlQwPsBz/6/dF7I21OZq4KnSk8SbfVHOQM5J7NpDJIAWggoeLQmgbD1v/3+zePS13n71Xnkz3XAei43S/RI/U74wuRlYkO204yb/Me5hngUW/8Reqguk3iXdNN9H4GAjKdZKmYxsVVGtN/huigZQ4+05I2rHk+nV3zirdYAdZJ10qLw+2RpBAQ30S4YwBulz9wEODkSbUhJGTSh9dUK/i3grtrHIHfNDgyJqrI0Ydif1gDOf77qBz35gQQO1rRMvXj3p5VB7/FnOa+2UVlL8WG79AFSo1t7NEuINjGmKUaHc=:hH59BHHAflKbvFUyM1poFPhO9puxXq5tjYw7E9wzA78=',
    'KeepUserOnSite': 'True',
    'CurrentLatitude': '55.902207999999995',
    'CurrentLongitude': '-3.3292287999999997',
}

     headers = {
         'authority': 'www.controller.com',
         'cache-control': 'max-age=0',
         'upgrade-insecure-requests': '1',
         'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36',
         'accept':'text/html,application/xhtml+xml,application/xml;q=0.9,
             image/webp,image/apng,*/*;q=0.8,application/signed- 
             exchange;v=b3;q=0.9',
         'sec-fetch-site': 'none',
         'sec-fetch-mode': 'navigate',
         'sec-fetch-user': '?1',
         'sec-fetch-dest': 'document',
         'accept-language': 'en-US,en;q=0.9',
           }

     def start_requests(self):
         url = 'https://www.controller.com/listings/aircraft/for-sale/list? \
                SortOrder=23&scf=False&page=1'
         yield scrapy.Request(url=url,headers=self.headers,
              cookies=self.cookies,callback=self.parse)

     def parse(self,response):
         response.text 

Метод Request принимает URL-адрес, поскольку мы определили заголовки вне функции start_request, мы должны использовать self. заголовки и self.cookies, чтобы получить к нему доступ. Затем мы хотим отправить ответ на синтаксический анализ функции и делаем это, указывая обратный вызов. Функцию start_request можно использовать для обработки URL-адресов перед функцией синтаксического анализа. Scrapy автоматически передает ответ в обычном режиме, когда мы настраиваем паук для синтаксического анализа.

...