Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用scrapy with javascript uu doPostBack方法时遇到的问题_Javascript_Python_Asp.net_Scrapy_Dopostback - Fatal编程技术网

使用scrapy with javascript uu doPostBack方法时遇到的问题

使用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 问题是,如果我尝试直接访问第二个链接而不首先访问第一个链接,我

试图从公共搜索中自动获取搜索结果,但遇到了一些麻烦。URL的格式如下所示

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))