首页 > 解决方案 > 当我使用 Scrapy 时,如何在 POST 请求的正文中发送重复的某些行?

问题描述

为了抓取一个站点,我必须发送重复的行来获取 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",

我怎样才能绕过这个功能?

标签: pythonweb-scrapingscrapy

解决方案


以下是通过请求获取数据的方法。您必须对 HTTP 请求进行逆向工程。要获得对https://ukonlinestores.co.uk/wp-admin/admin-ajax.php的访问权限,您必须重新创建一个 POST HTTP 请求,仅使用请求,是否必须包含参数、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()

推荐阅读