抓取由asp.net / AJAX(__ doPostBack)

时间:2017-06-25 12:31:18

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

我已经阅读了很多关于废弃由javascript& amp ;; ASP.net和我了解到,首先你必须发送尽可能多的信息,以欺骗ASP服务器,使其相信你真的点击了分页。

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

或下一个按钮: enter image description here

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

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

到目前为止,我想知道我的代码是否有问题,或者我是否必须辞职并告诉自己"确定无法做到刮"

我使用client := &http.Client{}以便能够轻微更改标题:

    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请求中发送的Dataform:

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)中,直到我到达最后一页(我确切地知道要抓取的页数):< / p>

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

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

$ ctl参数是我在点击按钮时看到的唯一变化。 所以我认为这是修改从网址加载的内容。

然后,我会刮我的:

    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

所以我在这里,迷失和无能。如果有人有想法我会很感激!

1 个答案:

答案 0 :(得分:0)

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

因此,抓取移动版本有点尴尬,但它有效。