javascript - 将 scrapy 与 javascript __doPostBack 方法结合使用时出现问题

标签 javascript python asp.net scrapy dopostback

试图从公共(public)搜索中自动获取搜索结果,但遇到了一些麻烦。 URL 的形式为

http://www.website.com/search.aspx?keyword=#&&page=1&sort=Sorting

当我点击页面时,访问此页面后,它会略微变为

http://www.website.com/search.aspx?keyword=#&&sort=Sorting&page=2

问题是,如果我随后尝试直接访问第二个链接而不先访问第一个链接,我将被重定向到第一个链接。我目前的尝试是在 scrapy 中定义一长串 start_urls。

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 请求视为表单并相应地进行更新。但是,当我实际尝试运行它时,我得到以下回溯(为简洁起见进行了压缩):

2013-03-22 04:03:03-0400 [guru] ERROR: Unhandled error on engine.crawl()
dfd.addCallbacks(request.callback or spider.parse, request.errback)
      File "/usr/lib/python2.7/dist-packages/twisted/internet/defer.py", line 280, in addCallbacks
        assert callable(callback)
    exceptions.AssertionError: 

2013-03-22 04:03:03-0400 [-] ERROR: Unhandled error in Deferred:
2013-03-22 04:03:03-0400 [-] Unhandled Error
    Traceback (most recent call last):
    Failure: scrapy.exceptions.IgnoreRequest: Skipped (request already seen)

将问题更改为更针对这篇文章的内容。

想法?

附言当第二个错误发生时,scrapy 无法彻底关闭,我必须发送两次 SIGINT 才能让事情真正结束。

最佳答案

FormRequestformdata 的构造函数中没有位置参数:

class FormRequest(Request):
    def __init__(self, *args, **kwargs):
        formdata = kwargs.pop('formdata', None)

所以你实际上必须说formdata=:

requests.append(FormRequest(url, formdata=data))

关于javascript - 将 scrapy 与 javascript __doPostBack 方法结合使用时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15560746/

相关文章:

python - Pandas 使用旧的列名创建一个新的数据框

asp.net - 使用 Web.config 和 session 变量控制网站文件夹访问?

asp.net - 为什么 VS 编译器在使用嵌套配置文件时会提示找不到程序集,而 IIS 中的 ASP.NET 引擎却没有问题?

javascript - 如何使用onclick按钮更改div下的样式

javascript - 有人可以解释 ENOBUFS 错误吗?

python - 将 mininet 连接到外部主机

ASP.NET 自定义错误与编译调试 ="false"和安全性

javascript - 由于 JavaScript 验证,导入现有 Maven 项目后 Eclipse 构建工作区挂起

javascript - jquery自定义事件困惑

python - 求解所有可能的映射