python - 当我使用 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",
我怎样才能绕过这个功能?
解决方案
以下是通过请求获取数据的方法。您必须对 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()
推荐阅读
- java - 如何在 Spring Boot 应用程序中配置 elasticsearch 7.2.0?
- python - 测试 API 创建方法时出现错误请求 400
- node.js - Dialogflow 系统实体 sys.any 在字母数字文本中的数字前添加空格
- excel - 在 VBA 中将单元格或范围声明为变体
- ios - 从枚举中设置 UISegmentedControl 的标题(内置于 IB,而不是代码)
- c# - 查询已删除的列
- aws-lambda - KeyError:AWS Lambda 中的“记录”
- php - 如何在 git 中包含 WordPress 插件更改和相关的数据库迁移?
- ios - 快速按钮单击以显示带有工具栏视图的键盘
- typescript - 如何使用带有 Typescript 的 expo AppLoading 组件?