在POST请求后,Scrapy无法检索数据

时间:2013-12-28 20:34:09

标签: python scrapy

我尝试使用scrapy爬几页,使我的家庭搜索研究不那么繁琐。我似乎遇到需要发布请求的表单的问题(我没有成功评估者的数据库网站或租金计,下面显示了蜘蛛)。

class RentSpider(BaseSpider):
    name = 'rentometer'

    def start_requests(self):
        request = FormRequest('http://www.rentometer.com',
            formdata={'address': '179 Commonwealth Ave, Apt 1, Boston, MA', 'beds': '1'},
            callback=self.after_response)
        return [request]

    def after_response(self, response):
        with open('response_html', 'w')as f:
            f.write(response.body)

我没有错误,但响应html似乎回到主页,好像没有输入数据。我确实看到蜘蛛转到http://www.rentometer.com/results,这是表单的提交页面,但从那里我被重定向回主页面。

我试图浏览一下cookie,看看是否有我遗漏的东西,但我发现唯一感兴趣的是会话ID,我应该自动获取。我也偶然发现了这个问题:How to crawl a post dependent website using scrapy,它没有解决方案,但我想知道我是否面临与该海报相同的问题,以及是否有任何解决方法或能力绕过此问题另一个图书馆?

1 个答案:

答案 0 :(得分:2)

不容易刮伤。

我用firebug试了一下,这是我在'net'标签中看到的请求:

请求:

https://www.rentometer.com/results?

参数:

address=179%20Commonwealth%20Ave%2C%20Apt%201%2C%20Boston%2C%20MA&
authenticity_token=%2BhrOEjFfwpI6f08lgiXB5%2B%2F9bWy0y20nVnQWn%2BKGgb0%3D&
beds=1&
latitude=42.351567&
longitude=-71.07978300000002&
price=&utf8=%E2%9C%94

我再看一下页面上的表格,发现authenticity_token是从页面上的另一个地方拍摄的,并尝试过:

from scrapy.spider import BaseSpider
from scrapy.http import FormRequest

class RentSpider(BaseSpider):
    name = 'rentometer'
    start_urls = [
        'http://www.rentometer.com'
    ]

    def parse(self, response):
        request = FormRequest.from_response(response=response,
            formxpath='//form',
            formdata={'address': '179 Commonwealth Ave, Apt 1, Boston, MA', 
                      'beds': '1',},
            callback=self.after_response)
        return [request]

    def after_response(self, response):
        with open('response_html', 'w')as f:
            f.write(response.body)

这不起作用,所以我猜这是因为缺少经纬度。

在firebug的javacript页面中搜索它们我找到了以下代码部分:

$("#search_form").submit(function(t){var i,n;return e?void 0:
 (t.preventDefault(),i=$("#address_field").val(),n=new google.maps.Geocoder,
 n.geocode({address:i},function(t,i){var n;
 return i===google.maps.GeocoderStatus.OK?(n
 =t[0].geometry.location,$("#latitude").val(n.lat()),$("#longitude").val(n.lng())

我手动添加了纬度和经度值:

formdata={'address': '179 Commonwealth Ave, Apt 1, Boston, MA', 
          'beds': '1',
          'latitude': '42.351567',
          'longitude': '-71.07978300000002'},

并取得了不错的成绩。

如果你想正确生成它们,请查看How can we execute javascript in scrapy?或实现与python方法相同的逻辑作为蜘蛛的一部分