asp.net - 抓取由 asp.net/AJAX (__doPostBack) 管理的 html 分页

标签 asp.net ajax go web-scraping web-crawler

我读了很多关于取消由 javascript 和 ASP.net 管理的网站的文章,我了解到首先你必须发送尽可能多的信息才能欺骗 ASP 服务器相信你真的点击了分页。

这就是我要达到的目标: enter image description here

或者下一个按钮: enter image description here

所以我已经尽力了,但我发现只有我的第一页被抓取了。我永远无法访问第二个、第三个等页面。

一切顺利,我唯一的问题是我无法访问其他页面!

到目前为止,我想知道我的 go 代码是否做错了什么,或者我是否必须辞职并告诉自己“好的,不能被刮掉”。

我正在使用 client := &http.Client{} 以便能够稍微更改 header :

    req, err := http.NewRequest("POST", urlToScrap, strings.NewReader(form.Encode()))
    if err != nil {
        panic(err)
    }
    req.Header.Set("X-MicrosoftAjax", "Delta=true")
    req.Header.Set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.76 Safari/537.36")

    res, err := client.Do(req)
    if err != nil {
        panic(err)
    }

从现在开始,这是我尝试在 POST 请求中发送的数据表:

form.Add("__EVENTTARGET", "")
form.Add("_TSM_HiddenField_", "2GFwlGU9ATlFIxrdsXRzcja58_1t5F8HSleaZM4ZQwk1")
form.Add("__EVENTVALIDATION", eventvalidation)
form.Add("__VIEWSTATEGENERATOR", "20C6E8CA")
form.Add("__VIEWSTATE", viewstat)

我直接从网络上复制粘贴了VIEWSTATE和EVENTVALIDATION到一个变量中(它真的很大!)

所以事件目标是空白的,因为我将我的爬虫放在 for 中(我正在使用 GoQuery),它一直运行到我到达最后一页(我确切地知道我想爬多少页):

for page := 1; page < 139; page++ {

    urlPaginated := "ctl00$ContentPlaceHolder1$pager$rptPager$ctl" + strconv.Itoa(page) + "$lbtnClick"
    form.Set("__EVENTTARGET", urlPaginated)

$ctl 参数是我看到的唯一一个在单击按钮时发生变化的参数。 所以我以为是这个修改了从url加载的内容。

然后,我进行抓取:

    doc, err := goquery.NewDocumentFromResponse(res)
    if err != nil {
        fmt.Println("ok2")
        log.Fatal(err)
    }

    doc.Find(".resultstable tbody tr").Each(func(i int, s *goquery.Selection) {
        companyID, ok := s.Find("td > a").Attr("name")
        if !ok {
            fmt.Println("yolo")
        }

        fmt.Println(companyID)
        scrapIt(companyID)
        time.Sleep(time.Second / 2)
    })

我没有尝试传递给表单的唯一字段是那些:

enter image description here

所以我在这里,迷茫而无能为力。如果有人知道我将不胜感激!

最佳答案

所以我没有找到解决它的方法,但我在移动设备上找到了一个简单的 LoadMore 按钮,绕过了主要问题。

所以改为抓取移动版本有点尴尬,但它可以。

关于asp.net - 抓取由 asp.net/AJAX (__doPostBack) 管理的 html 分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44746392/

相关文章:

javascript - 为什么无法使用ajax请求下载文件?

javascript - 如何处理带有条件的ajax响应文本

去 GC 奇怪的行为

asp.net - jQuery lambda 函数

asp.net - Windows身份验证下HttpContext.Current.User为null(集成管道)

javascript - JS - 制作自定义 AJAX 函数时出现问题

http - 我应该在每个传入请求中创建新的上下文吗?

api - 如何找到我网站的所有 API?

asp.net - 如何从 ASP.Net MVC 中调用的操作结果获取 URL

c# - 保存的 ZIP 文件损坏(从 Android 应用程序到 IIS 服务器)