我尝试使用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,它没有解决方案,但我想知道我是否面临与该海报相同的问题,以及是否有任何解决方法或能力绕过此问题另一个图书馆?
答案 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方法相同的逻辑作为蜘蛛的一部分