Scrapy 处理 ASP.NET 站点的会话 Cookie 或 302

1 投票
1 回答
777 浏览
提问于 2025-04-18 10:05

我正在尝试抓取一个用asp.net写的网页应用。

我想执行一个搜索,并抓取搜索结果页面。假设搜索页面是 http://search.site.com/search/search.aspx

我的抓取程序其实很简单

class SitesearchSpider(Spider):
    name = 'sitecrawl'
    allowed_domains = ['search.site.org']
    start_urls = [
        "http://search.site.org/Search/Search.aspx"
    ]

def parse(self, response):
        self.log("Calling Parse Method", level=log.INFO)
        response = response.replace(body=response.body.replace("disabled",""))
        return [FormRequest(
            url="http://search.site.org/Search/Search.aspx",
            formdata={'ctl00$phContent$ucUnifiedSearch$txtIndvl': '2441386'},            
            callback=self.after_search)]

    def after_search(self, response):
        self.log("In after search", level=log.INFO)
        if "To begin your search" in response.body:
            self.log("unable to get result")            
        else:
            self.log(response.body)

但是无论我怎么做,返回的都是同一个页面(search.aspx),而不是我期待的带有结果的searchresults.aspx页面。

在浏览器中似乎发生了以下情况:

  1. 在一个输入框中输入搜索词
  2. 点击搜索按钮
  3. 提交表单后,页面(search.aspx)返回了一个302重定向到搜索结果页面
  4. 然后显示搜索结果页面
  5. 我发现这里使用了asp.net的会话cookie,因为一旦进行了搜索,我可以直接打开像这样的搜索结果页面的URL http://search.site.com/search/searchresults.aspx?key=searchkey&anothersearchparam=12,结果会直接加载
  6. 如果我打开一个新的会话并粘贴这个URL,我就会被重定向回搜索页面

我查看了文档,但不确定我是否需要处理这个302重定向或是asp.net的会话cookie。任何帮助都很感激。

1 个回答

2
  1. 你不需要自己处理302状态码,scrapy会自动帮你处理。
  2. 你可以调试cookie,只需在设置中把DEBUG_COOKIE设置为1。
  3. 你有没有检查一下在浏览器中搜索时,post或get方法发送了哪些其他参数?你需要把这些参数都放在表单数据里。

我建议你使用_response,像这样:

return [FormRequest.from_response(
        response,
        formdata={'ctl00$phContent$ucUnifiedSearch$txtIndvl': '2441386'},  

撰写回答