【问题标题】:How to find where form parameters are stored and use them in Request如何查找表单参数的存储位置并在请求中使用它们
【发布时间】:2015-07-08 12:03:28
【问题描述】:

我正在尝试使用 Request 和 Cheerio 抓取 https://www.freelance.nl/opdrachten/zoeken 的数据,但在发布搜索字词时遇到了问题。

在使用网站时,我看不到搜索字符串和所选类别在发布期间的发送位置,以及如何在请求中使用它们来自动从我的节点应用程序进行搜索。

基本上我希望能够使用 Request 发送不同的搜索词,然后我可以从返回的 html 中抓取我需要的数据。

到目前为止,我有这个:

request.post('https://www.freelance.nl/opdrachten/zoeken', { form: { key: 'value' } },
    function (error, response, body) {
        if (!error && response.statusCode == 200) {
            console.log(body)

        }
    }
);

但由于我看不到表单数据在开发工具中的存储位置,因此我无法在“表单”对象中发送正确的值。我很确定它在请求有效负载中,但是我如何从我的节点应用程序中获得它?

有没有更简单的方法来做到这一点?我完全是在浪费时间吗?

【问题讨论】:

    标签: javascript node.js express web-scraping requestjs


    【解决方案1】:

    我稍微修改了你的代码:

    payload = {'projectFilterForm[keywords]':'javascript','projectFilterForm[category][]': '1'}
    request.post('https://www.freelance.nl/opdrachten/zoeken', { data:payload },
    function (error, response, body) {
        if (!error && response.statusCode == 200) {
            console.log(body)
        }
    }
    

    );

    【讨论】:

    • 它没有帮助。仍然在“body”变量中返回相同的 html,就好像我根本没有输入任何表单数据一样
    【解决方案2】:

    睁开眼睛 ;) 在图片底部,查看 Request Payload

    projectFilterForm[keywords]
    projectFilterForm[category][]
    projectFilterForm[province][]
    

    更新

    var request = require('request');
    var querystring = require('querystring');
    
    require('request').debug = true;
    
    var data = querystring.stringify({
        'projectFilterForm[keywords]': 'java'
    });
    
    var options = {
        followAllRedirects: true,
        uri: 'https://www.freelance.nl/opdrachten/zoeken',
        method: 'POST',
        headers: {
            'Content-Length': Buffer.byteLength(data),
            'cache-control': 'no-cache',
            'Content-Type': 'multipart/form-data',
            'origin': 'https://www.freelance.nl',
            'referer': 'https://www.freelance.nl/opdrachten/zoeken',
            'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36'
        }
    };
    
    var req = request(options, function (error, response, body) {
        console.log(body);
    });
    
    req.write(data);
    req.end();
    

    我尝试了一切 =)) 没有...重定向后,我们得到默认页面。也许他们使用了一些会话基础保护?

    这不是节点的问题。即使在 chrome 的邮递员扩展中,我也尝试过这样做,但没有运气。

    【讨论】:

    • 是的,我看到了这个,但我不确定如何从我的节点应用程序中得到这个:(
    • 得到它?您的意思是通过您的节点应用程序“发布”它?模拟用户点击发送表单?
    • 是的,抱歉,咖啡不足和疲倦 = 解释不佳
    • 也许他们使用了一些保护方法,因为在发送数据后获取内容的简单方法对我也不起作用。甚至使用邮递员。
    • 感谢您的尝试。我是这种事情的新手,有什么我应该阅读的内容会有所帮助吗?还是失败了?
    猜你喜欢
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    相关资源
    最近更新 更多