正在抓取需要JavaScript交互的页面

2024-09-27 00:19:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试着用刮痧刮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"

Tags: fromhttpsimportselfdefaultresponseblockgov
2条回答

在提交有效的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等连续获取

试试这个破壳:

pawel@stackoverflow:~/stack/scrapy$ scrapy shell "https://a836-propertyportal.nyc.gov/Default.aspx"

In [1]: from scrapy.http import Request

In [2]: req = Request("https://a836-propertyportal.nyc.gov/ExemptionDetails.aspx", cookies = {"borough":"1", "block":"01000", "style":"default", "lot":"0011"})

In [3]: fetch(req)

In [4]: view(response)

Out[5]: True # opening browser window

此时的响应将包含给定区块、行政区和地块的属性数据。现在你只需要在你的蜘蛛身上运用这些知识。只要用cookies替换您的POST,添加回调到shell中的内容,它就可以正常工作了。在

如果这仍然不起作用,或者不适合您的目的,请尝试提取隐藏的ajax参数(nullctl00_ScriptManager1_HiddenField的值),将其添加到formdata中(当然还要更正formdata,使其与浏览器发送的内容相同)。在

您不单击搜索按钮,但您向包含所有数据的页面发出POST请求。但是检查代码,它会发送很多数据。下面是我的请求。。。在

ctl00_ScriptManager1_HiddenField:;;AjaxControlToolkit, Version=3.0.11119.25904, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e:en-US:f48478dd-9360-4d50-94c1-5c5fa55bd379:865923e8:411fea1c:e7c87f07:91bd373d:1d58b08c:8e72a662:acd642d2:596d588c:77c58d20:14b56adc:269a19ae:bbfda34c:30a78ec5:5430d994
__EVENTTARGET:
__EVENTARGUMENT:
__VIEWSTATE:/wEPDwULLTEwMDA4NDY4ODAPZBYCZg9kFgICBQ9kFgQCAg9kFgQCAQ8WAh4HVmlzaWJsZWhkAgcPFgIfAGgWAgIBDxYCHglpbm5lcmh0bWwFGEFsZXJ0IGZvcjxiciAvPiBCQkwgOiAtLWQCBA9kFgQCAg9kFgQCAQ9kFgRmDw8WBB4IQ3NzQ2xhc3MFF2FjY29yZGlvbkhlYWRlclNlbGVjdGVkHgRfIVNCAgJkZAIBDw8WBB8CBRBhY2NvcmRpb25Db250ZW50HwMCAhYCHgVzdHlsZQUOZGlzcGxheTpibG9jaztkAgIPZBYEZg8PFgQfAgUPYWNjb3JkaW9uSGVhZGVyHwMCAmRkAgEPDxYEHwIFEGFjY29yZGlvbkNvbnRlbnQfAwICFgIfBAUNZGlzcGxheTpub25lOxYCAgEPZBYCZg9kFgZmDw9kFgIfBAUNZGlzcGxheTpub25lO2QCDA8PFgIfAGhkZAINDw8WAh8AaGRkAgMPD2QWBh4FU3R5bGUFN3dpZHRoOjM1MHB4O2JhY2tncm91bmQ6d2hpdGU7ZGlzcGxheTpub25lO29wYWNpdHk6MC45MjseC29ubW91c2VvdmVyBQ93d2hIZWxwLnNob3coKTseCm9ubW91c2VvdXQFD3d3aEhlbHAuaGlkZSgpO2Rky2sFuMlw1iy/E0GN9cB65RXg7Aw=
__EVENTVALIDATION:/wEWGgKWm9a2BgL687aTAwLmha0BAujn2IECAo3DtaEJAtLdz/kGAr3g5K4DAu78ttcEAvOB3+MGAvKB3+MGAvGB3+MGAvCB3+MGAveB3+MGAoHAg44PArT/mOoPAqrvlMAJAtzQstcEAoDswboFAoHswboFAoLswboFAoPswboFAoTswboFAtjqpO8KAujQ7b0GAqvgnb0NAsPa/KsBQz19YIqBRvCWvZh8bk6XKxp+wQo=
grpStyle:blue
ctl00$SampleContent$MyAccordion_AccordionExtender_ClientState:0
ctl00$SampleContent$ctl01$TextBox1:(unable to decode value)
ctl00$SampleContent$ctl01$ddlParclBorough:1
ctl00$SampleContent$ctl01$txtBlock:100
ctl00$SampleContent$ctl01$txtLot:200
ctl00$SampleContent$ctl01$btnSearchBBL:Please Wait...
ctl00$SampleContent$ctl03$TextBox2:(unable to decode value)
ctl00$SampleContent$ctl03$ddlParclBoroughPropAddr:1
ctl00$SampleContent$ctl03$txtHouseNbr:
ctl00$SampleContent$ctl03$txtStreetNm:
ctl00$SampleContent$ctl03$txtAptNbr:

我的建议是使用一个支持执行JS的废库。或者用别的东西。我在使用Selenium和WebDriver在支持JS的浏览器中执行代码方面取得了很多成功。在

更新:

你有一个例子How to submit a form using PhantomJS。在

相关问题 更多 >

    热门问题