Python 需要JavaScript交互的抓取页面

Python 需要JavaScript交互的抓取页面,python,scrapy,scrapy-spider,Python,Scrapy,Scrapy Spider,我在用刮痧刮东西。我在使用FormRequest时遇到了困难——具体来说,我不知道如何告诉Scrapy如何填写区块和批次表单,然后获得页面的响应。我试着在这里()找到的Scrapy网站上遵循FormRequest示例,但仍然无法正确单击“搜索”按钮 如果您能提供任何建议,以便我从提交的页面中提取数据,我将不胜感激。SO上的一些海报建议Scrapy不能很好地处理JS事件,而是使用另一个库,如CasperJS 更新:如果有人能告诉我一个Java/Python/JS库,允许我提交表单并检索后续信息,我

我在用刮痧刮东西。我在使用FormRequest时遇到了困难——具体来说,我不知道如何告诉Scrapy如何填写区块和批次表单,然后获得页面的响应。我试着在这里()找到的Scrapy网站上遵循FormRequest示例,但仍然无法正确单击“搜索”按钮

如果您能提供任何建议,以便我从提交的页面中提取数据,我将不胜感激。SO上的一些海报建议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请求。但是检查代码,它会发送大量数据。下面我发布了我的请求

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的浏览器中执行代码方面取得了很多成功

更新:


你有一个例子。

你的页面有点奇怪,很难解析,在提交了302 http状态和一堆cookie的有效POST请求页面响应后(顺便说一下,你的formdata是无效的,你需要在参数中用美元替换下划线)

发送GET to后可以查看内容

最令人惊讶的是,您可以只使用cookie抓取此站点,而无需POST请求。帖子只是为了给你们提供cookies,它不会重定向到或者用html响应。你可以从你的蜘蛛那里操纵那些饼干。您只需首先获取会话cookie,然后使用borough、block等进行连续获取

在scrapy shell中尝试以下操作:

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
此时的响应将包含具有给定区块、自治区和地块的房地产数据。现在,您只需要在spider中使用这些知识。只需将您的帖子替换为GET with cookies,将回调添加到您在shell中拥有的内容中,就可以了


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

那么你推荐我使用什么样的刮库呢?你使用Scrapy+Selenium/WebDriver吗?我对非javascript网站使用Scrapy,涉及javascript时使用Selenium。afaik selenium不是为刮削而建造的,但它可以工作。一定要检查一下,我很确定有支持JS的库/项目可供删除。@eddwinpaz:BeautifulSoup没有任何用处。它只是解析HTML。是的,你不能用BeautifulSoup来解析@jsc123检查我的更新并链接到PhantomJS.Hi@Pawel:我现在可以打印出回复了,非常感谢!然而,并非所有感兴趣的价值观都会出现。例如,当我打印响应主体时,税率确实会出现,但所有者名称不会出现。你建议我如何补救?