使用scrapy with javascript uu doPostBack方法时遇到的问题
试图从公共搜索中自动获取搜索结果,但遇到了一些麻烦。URL的格式如下所示使用scrapy with javascript uu doPostBack方法时遇到的问题,javascript,python,asp.net,scrapy,dopostback,Javascript,Python,Asp.net,Scrapy,Dopostback,试图从公共搜索中自动获取搜索结果,但遇到了一些麻烦。URL的格式如下所示 http://www.website.com/search.aspx?keyword=#&&page=1&sort=Sorting 当我点击页面时,在访问此页面后,它会稍微更改为 http://www.website.com/search.aspx?keyword=#&&sort=Sorting&page=2 问题是,如果我尝试直接访问第二个链接而不首先访问第一个链接,我
http://www.website.com/search.aspx?keyword=#&&page=1&sort=Sorting
当我点击页面时,在访问此页面后,它会稍微更改为
http://www.website.com/search.aspx?keyword=#&&sort=Sorting&page=2
问题是,如果我尝试直接访问第二个链接而不首先访问第一个链接,我将被重定向到第一个链接。我目前的尝试是在scrapy中定义一长串开始URL
class websiteSpider(BaseSpider):
name = "website"
allowed_domains = ["website.com"]
baseUrl = "http://www.website.com/search.aspx?keyword=#&&sort=Sorting&page="
start_urls = [(baseUrl+str(i)) for i in range(1,1000)]
目前,这段代码只是一次又一次地访问第一页。我觉得这可能很简单,但我不太知道如何解决这个问题
更新:
对此进行了一些调查,发现站点通过使用_doPostBack(arg1,arg2)向上一页发送POST请求来更新每个页面。我现在的问题是,如何使用scrapy准确地模拟此POST请求。我知道如何发出POST请求,但不知道如何传递我想要的参数
第二次更新:
我已经取得了很大的进步!我想。。。我仔细阅读了示例和文档,最终拼凑了这个版本,我认为应该做到这一点:
def start_requests(self):
baseUrl = "http://www.website.com/search.aspx?keyword=#&&sort=Sorting&page="
target = 'ctl00$empcnt$ucResults$pagination'
requests = []
for i in range(1, 5):
url = baseUrl + str(i)
argument = str(i+1)
data = {'__EVENTTARGET': target, '__EVENTARGUMENT': argument}
currentPage = FormRequest(url, data)
requests.append(currentPage)
return requests
其思想是,这将POST请求视为一个表单,并相应地进行更新。然而,当我实际尝试运行此程序时,我得到了以下回溯(为简洁起见,进行了压缩):
将问题改为更直接地针对这篇文章的内容
想法
另外,当第二个错误发生时,scrapy无法清除关机,我必须发送两次SIGINT以使事情真正结束。
FormRequest
在构造函数中没有formdata
的位置参数:
class FormRequest(Request):
def __init__(self, *args, **kwargs):
formdata = kwargs.pop('formdata', None)
所以你实际上必须说formdata=
:
requests.append(FormRequest(url, formdata=data))
令人惊叹的!非常感谢,但还有一个更深层次的问题。它现在统一返回404个错误。有什么想法吗?404表示服务器认为url是错误的,那么实际的url是什么?通常,如果POST数据错误,服务器通常会给出500 ish错误。顺便说一句:你刚刚让我超过了1k,很好。另外,如果你正在处理.aspx,你可能还需要在POST数据中包含巨人的viewstate。该网站是guru.com,真正奇怪的是,我在帖子中得到的回复是404个错误和200个代码的奇怪组合,给出了500个错误的回复体。意识到这可能是一个不同的问题,所以我将重新询问相关部分,并将其标记为已接受。
requests.append(FormRequest(url, formdata=data))