我正试着用刮痧刮https://a836-propertyportal.nyc.gov/Default.aspx。我在使用FormRequest时遇到了困难——具体来说,我不知道如何告诉Scrapy如何填写block和lot表单,然后获得页面的响应。我尝试在这里找到的垃圾网站(http://doc.scrapy.org/en/latest/topics/request-response.html#using-formrequest-from-response-to-simulate-a-user-login)上遵循FormRequest示例,但是仍然难以正确单击“Search”按钮。在
如果您能提供任何建议,我将非常感谢,以便我可以从提交的页面中提取数据。soo上的一些海报建议Scrapy不能很好地处理JS事件,而是使用另一个库,比如CasperJS。在
更新:如果有人能给我指一个Java/Python/JS库,让我提交表单并检索后续信息,我将不胜感激
更新代码(以下是Pawel的评论):我的代码可以在这里找到:
from scrapy.spider import Spider
from scrapy.selector import Selector
from scrapy.http import FormRequest, Request
class MonshtarSpider(Spider):
name = "monshtar"
allowed_domains = ["https://a836-propertyportal.nyc.gov/Default.aspx"]
start_urls = (
'https://a836-propertyportal.nyc.gov/Default.aspx/',
)
def parse(self, response):
print "entered the parsing section!!"
yield Request("https://a836-propertyportal.nyc.gov/ExemptionDetails.aspx",
cookies = {"borough":"1", "block":"01000", "style":"default", "lot":"0011"}, callback = self.aftersubmit)
def aftersubmit(self, response):
#get the data....
print "SUCCESS!!\n\n\n"
在提交有效的POST request页面后,您的页面有点怪异,并且很难解析,页面的响应带有302个http状态和一堆cookies(顺便说一下,您的formdata是无效的,您需要用参数中的美元替换下划线)。在
将GET发送到https://a836-propertyportal.nyc.gov/ExemptionDetails.aspx后可以查看内容
最令人惊讶的是,你可以爬行这个网站只使用cookies,而不需要POST请求。POST只是为了给你cookies,它不重定向或用html响应。你可以操纵蜘蛛的饼干。你只需要让第一个GET-to-GET会话cookie,然后用borough、block等连续获取
试试这个破壳:
此时的响应将包含给定区块、行政区和地块的属性数据。现在你只需要在你的蜘蛛身上运用这些知识。只要用cookies替换您的POST,添加回调到shell中的内容,它就可以正常工作了。在
如果这仍然不起作用,或者不适合您的目的,请尝试提取隐藏的ajax参数(nullctl00_ScriptManager1_HiddenField的值),将其添加到formdata中(当然还要更正formdata,使其与浏览器发送的内容相同)。在
您不单击搜索按钮,但您向包含所有数据的页面发出POST请求。但是检查代码,它会发送很多数据。下面是我的请求。。。在
我的建议是使用一个支持执行JS的废库。或者用别的东西。我在使用Selenium和WebDriver在支持JS的浏览器中执行代码方面取得了很多成功。在
更新:
你有一个例子How to submit a form using PhantomJS。在
相关问题 更多 >
编程相关推荐