我已经阅读了很多有关废弃由javascript和ASP.net管理的网站的信息,并且我了解到,首先,您必须发送尽可能多的信息,以便欺骗ASP服务器以使您相信您确实单击了分页。
这是我要达到的目标:
或下一个按钮:
因此,我尽力了,但是我发现只有第一页被抓取了。我永远无法访问第二,第三等页面。
一切进展顺利,我唯一的问题是我无法访问其他页面!
至此,我想知道我的go代码是否做错了什么,还是我不得不辞职并告诉自己“好的,这是无法挽回的”。
我正在使用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请求中发送的数据格式:
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)
})
我没有尝试传递给表单的唯一字段是那些字段:
所以我在这里,迷茫而无知。如果有人知道我将不胜感激!
最佳答案
因此,我没有找到解决该问题的方法,但是我在移动设备上找到了一个简单的LoadMore按钮,该按钮绕过了主要问题。
因此,改为抓取移动版本有些尴尬,但它可以工作。