Для очистки одного сайта мне нужно отправить дубликаты строк, чтобы получить данные json. Я тестировал этот метод с запросами. Но это не работает, когда я использую Scrapy. В теле запроса нет дубликатов:

class MainSpider(scrapy.Spider):
    name = 'main'
    allowed_domains = ['ukonlinestores.co.uk']
    # start_urls = ['https://ukonlinestores.co.uk/amazon-uk-sellers/']
    search_url = 'https://ukonlinestores.co.uk/wp-admin/admin-ajax.php?action=get_wdtable&table_id=9'
    handle_httpstatus_list = [400]

    def parse_search(self, response):
        inspect_response(response, self)

    def start_requests(self):
        data = {
            'draw': '2',
            'columns[0][data]': '0',
            'columns[0][name]': 'wdt_ID',
            'columns[0][searchable]': 'true',
            'columns[0][orderable]': 'true',
            'columns[0][orderable]': 'true',
            'columns[0][search][value]': '',
            'columns[0][search][value]': '',
            'columns[0][search][regex]': 'false',
            'columns[0][search][regex]': 'false',
            'columns[1][data]': '1',
            'columns[1][data]': '1',
            'columns[1][name]': 'sellerid',
            'columns[1][name]': 'sellerid',
            'columns[1][searchable]': 'true',
            'columns[1][searchable]': 'true',
            'columns[1][orderable]': 'true',
            'columns[1][orderable]': 'true',
    }
        yield scrapy.Request(
                             self.search_url, 
                             callback=self.parse_search, 
                             method='POST', 
                             headers=headers, 
                             body=json.dumps(data))
>>> request.body
b'{"columns[0][data]": "0", "columns[0][name]": "wdt_ID", "columns[0][orderable]": "true", "columns[0][search][regex]": "false", "columns[0][search][value]": "", "co
lumns[0][searchable]": "true", "columns[10][data]": "10", "columns[10][name]": "positive12months", "columns[10][orderable]": "true", "columns[10][search][regex]": "f
alse", "columns[10][search][value]": "", "columns[10][searchable]": "true", "columns[11][data]": "11", "columns[11][name]": "positivelifetime", "columns[11][orderabl
e]": "true", "columns[11][search][regex]": "false", "columns[11][search][value]": "", "columns[11][searchable]": "true", "columns[12][data]": "12", "columns[12][name
]": "count30day", "columns[12][orderable]": "true", "columns[12][search][regex]": "false", "columns[12][search][value]": "", "columns[12][searchable]": "true", "colu
mns[13][data]": "13", "columns[13][name]": "count90day", "columns[13][orderable]": "true",

Как я могу обойти эту функцию?

1
Evgeniy K 17 Июл 2020 в 21:39

1 ответ

Лучший ответ

Вот как вы можете получить данные с помощью запросов. Вы должны перепроектировать HTTP-запросы. Чтобы получить доступ к https://ukonlinestores.co.uk/wp-admin /admin-ajax.php, вам необходимо воссоздать HTTP-запрос POST, используя только запрос, если вы должны включить параметры, файлы cookie, заголовки. Я обычно начинаю с простого запроса и наращиваю, здесь мне не нужны заголовки, но параметры и данные необходимы для получения данных JSON, которые вам нужны здесь.

Я обычно использую chrometools и копирую запрос на http://curl.trillworks.com. Таким образом я могу получить красиво отформатированные заголовки, файлы cookie и параметры.

Вы также можете использовать те же параметры и данные в скрипте scrapy.

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

Пример кода

import requests

params = (
    ('action', 'get_wdtable'),
    ('table_id', '25'),
)

data = {
  'draw': '1',
  'columns[0][data]': '0',
  'columns[0][name]': 'storeurl',
  'columns[0][searchable]': 'true',
  'columns[0][orderable]': 'true',
  'columns[0][search][value]': '',
  'columns[0][search][regex]': 'false',
  'columns[1][data]': '1',
  'columns[1][name]': 'positivefeedback',
  'columns[1][searchable]': 'true',
  'columns[1][orderable]': 'true',
  'columns[1][search][value]': '',
  'columns[1][search][regex]': 'false',
  'columns[2][data]': '2',
  'columns[2][name]': 'rank',
  'columns[2][searchable]': 'true',
  'columns[2][orderable]': 'true',
  'columns[2][search][value]': '',
  'columns[2][search][regex]': 'false',
  'columns[3][data]': '3',
  'columns[3][name]': 'storemarketplace',
  'columns[3][searchable]': 'true',
  'columns[3][orderable]': 'true',
  'columns[3][search][value]': '',
  'columns[3][search][regex]': 'false',
  'columns[4][data]': '4',
  'columns[4][name]': 'maincategory',
  'columns[4][searchable]': 'true',
  'columns[4][orderable]': 'true',
  'columns[4][search][value]': '',
  'columns[4][search][regex]': 'false',
  'columns[5][data]': '5',
  'columns[5][name]': 'noofproducts',
  'columns[5][searchable]': 'true',
  'columns[5][orderable]': 'true',
  'columns[5][search][value]': '',
  'columns[5][search][regex]': 'false',
  'columns[6][data]': '6',
  'columns[6][name]': 'fulfilmenttype',
  'columns[6][searchable]': 'true',
  'columns[6][orderable]': 'true',
  'columns[6][search][value]': '',
  'columns[6][search][regex]': 'false',
  'columns[7][data]': '7',
  'columns[7][name]': 'countlifetime',
  'columns[7][searchable]': 'true',
  'columns[7][orderable]': 'true',
  'columns[7][search][value]': '',
  'columns[7][search][regex]': 'false',
  'order[0][column]': '2',
  'order[0][dir]': 'asc',
  'start': '0',
  'length': '50',
  'search[value]': '',
  'search[regex]': 'false',
  'wdtNonce': '78ce0f8f66'
}

response = requests.post('https://ukonlinestores.co.uk/wp-admin/admin-ajax.php', headers=headers, params=params, data=data)

data = response.json()
0
AaronS 17 Июл 2020 в 19:13