素材牛VIP会员
如何获取这个政府网站的数据?
 th***kd  分类:Python  人气:1717  回帖:8  发布于6年前 收藏

1.地址是:http://app1.sfda.gov.cn/datas...

2.想要获取的数据是

3.调试工具

4.自己测试POST的数据返回的值是

5.不知道哪里错了,求助大家了

讨论这个帖子(8)垃圾回帖将一律封号处理……

Lv7 码师
yu***01 产品经理 6年前#1

http://htmlunit.sourceforge.net/

http://www.seleniumhq.org/

Lv6 码匠
这***生 技术总监 6年前#2

尝试了python下使用phantomjs模拟浏览器,来抓取目标网站的首页数据

1、request.js 文件

var url="http://app1.sfda.gov.cn/datasearch/face3/base.jsp?tableId=25&tableName=TABLE25&title=%B9%FA%B2%FA%D2%A9%C6%B7&bcId=124356560303886909015737447882";
var page = require('webpage').create();
page.open(url, function(status) {
  console.log(page.content);
  phantom.exit();
});

2、phantomjs request.js 获取的数据如下:

最后也还是未成功获取到网页数据 = =!

Lv3 码奴
钱***4 技术总监 6年前#3

好厉害 这网站怎么做到的

具体是我F12 再点击td标签 竟然自动断点?> 然后返回100什么的

Lv5 码农
ha***00 UI设计师 6年前#4

我试了下,发现返回结果与你的一样。这说明不是你的参数不全之类的问题,而是网站做了反爬,无法重试。所以你需要考虑的就是看看哪个参数是变化的以及从哪里可以获取获取这个参数。

Lv6 码匠
wo***fp CEO 6年前#5

做一下浏览器伪装试一下,用httpclient之类的包

Lv6 码匠
hx***lf JAVA开发工程师 6年前#6

chrome ctrl + shift + j

(function () {
    function devPage(jj) {
        return new Promise(r => {
            var curForm = document.getElementById('pageForm');
            curForm.curstart.value = jj;
            commitForECMA(function () {
                let request = this
                if (request.readyState == 4) {
                    if (request.status == 200) {
                        setTimeout(() => {
                            r(request.responseText)
                        }, 2e3)
                    }
                }
            }, 'search.jsp', curForm);
        })
    }

    async function a() {
        const el = document.createElement('html')
        for (let i = 1; i <= 11035; i++) {
            el.innerHTML = await devPage(i)
            el.querySelectorAll('a').forEach(t => {
                if (t.href.indexOf('javascript:commitForECMA(callbackC') === 0) {
                    console.log(t.innerHTML)
                }
            })
        }
    }

    a()
})()
Lv6 码匠
不***) 软件测试工程师 6年前#7

做浏览器插件处理吧。

自己用客户端拿的话,会很花时间。

这个站专门针对抓取作了处理的,而且整套机制是配合着前端 js 来的。要解析它的流程,需要人肉“翻译”它页面上的那段 js,那里面有些按位操作的东西,我猜就是它自己的一套“加解密逻辑”,好消息是,那段 js 代码还不算长。

Lv7 码师
飞***天 学生 6年前#8

哪来的什么加解密。。

request.onreadystatechange = callbackC;
function callbackC() {
    if (request.readyState == 1) document.getElementById("content").innerHTML="<br></br><br><img src=images/loading.gif>";
    if (request.readyState == 4) {
        if (request.status == 200) {
            oldContent[oldContent.length] = request.responseText;
            document.getElementById("content").innerHTML = request.responseText;
            request = null;
        }
        else {
            document.getElementById("content").innerHTML="<br><br><br><span style=font-size:x-large;color:#215add>服务器未返回数据</span>";
        }
    }
}

JSESSIONID的问题啦。

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取