Javascript 如何使用scrapy触发JS ASP.Net下一页事件?
我正在从中删除内容。我首先发送一个Javascript 如何使用scrapy触发JS ASP.Net下一页事件?,javascript,asp.net,scrapy,dom-events,Javascript,Asp.net,Scrapy,Dom Events,我正在从中删除内容。我首先发送一个FormRequest,根据我其他问题的答案生成搜索结果 我抓取所需内容,并希望移动到下一页,该页不包含url,由JS触发。下面是html标记的外观: <a href="javascript:__doPostBack('dgSearchResults$ctl24$ctl01','')">2</a> 我尝试了以下方法,但似乎没有任何效果: In [18]: fr = FormRequest.from_respons
FormRequest
,根据我其他问题的答案生成搜索结果
我抓取所需内容,并希望移动到下一页,该页不包含url,由JS触发。下面是html标记的外观:
<a href="javascript:__doPostBack('dgSearchResults$ctl24$ctl01','')">2</a>
我尝试了以下方法,但似乎没有任何效果:
In [18]: fr = FormRequest.from_response(response, formdata={"__EVENTTARGET": 'dg
...: SearchResults$ctl02$ctl03'})
In [19]: fetch(fr)
2020-08-24 16:47:06 [scrapy.core.engine] DEBUG: Crawled (200) <POST https://registers.maryland.gov/RowNetWeb/Estates/frmEstateSearch2.aspx> (referer: None)
In [20]: view(response)
Out[20]: True
[18]中的:fr=FormRequest.from_response(response,formdata={“u_EVENTTARGET”):'dg
…:搜索结果$ctl02$ctl03'})
In[19]:fetch(fr)
2020-08-24 16:47:06[碎片堆芯引擎]调试:爬网(200)(参考:无)
在[20]:视图(响应)
Out[20]:对
这是:
In [21]: fr = FormRequest.from_response(response, formdata={"__EVENTTARGET": 'dg
...: SearchResults$ctl02$ctl01'}, clickdata={'type': 'submit'})
In [22]: fetch(fr)
2020-08-24 16:50:24 [scrapy.core.engine] DEBUG: Crawled (200) <POST https://registers.maryland.gov/RowNetWeb/Estates/frmEstateSearch2.aspx> (referer: None)
In [23]: view(response)
Out[23]: True
[21]中的:fr=FormRequest.from_response(response,formdata={“u_EVENTTARGET”):'dg
…:SearchResults$ctl02$ctl01'},clickdata={'type':'submit'})
In[22]:获取(fr)
2020-08-24 16:50:24[scrapy.core.engine]调试:爬网(200)(参考:无)
在[23]:视图(响应)
Out[23]:对
当我查看响应时,它要么让我进入初始页面(包含初始表单的页面),要么什么都没有发生,页码仍然设置为1。正如我在评论中提到的,这是ASP网页上非常常见的问题。现在您可能已经知道,您提到的js将触发POST请求。此post请求的正文可能包含您在搜索表单中作为输入填写的字段以及页面实例生成的几个隐藏输入(如
\uuuu VIEWSTATE
或\uuu VIEWSTATEGENERATOR
)
使用FormRequest.from_response()
方法时,它将搜索这些输入以填充请求正文,方法是选择页面中//form
元素内的所有输入元素。有时候没关系,有时候没关系,这就是你的情况
当该方法选择所有输入时,它将获得一个用于其他对象的输入。在您的情况下,就是这种输入:
<input id="cmdSearchNew" value="New Search" ... />
但是,如果您检查scrapy请求的主体(您可以在您已经使用的shell中打印您的fr.body
),您将看到如下内容:
{
"__EVENTTARGET":"dgSearchResults$ctl24$ctl01",
"__EVENTARGUMENT":"",
"__VIEWSTATE":"jyAD4Bm...",
"__VIEWSTATEGENERATOR":"11C1F95B",
"__EVENTVALIDATION":"TmG0xFB..."
}
{
"__EVENTTARGET":"dgSearchResults$ctl24$ctl01",
"cmdSearchNew": "New Search"
"__VIEWSTATE":"jyAD4Bm...",
"__VIEWSTATEGENERATOR":"11C1F95B",
"__EVENTVALIDATION":"TmG0xFB..."
}
它将被URL编码,这是一个已解析的视图
该cmdSearchNew
字段不应该存在,它是用于其他内容的,但scrapy不知道,因为它在同一表单中。(另外,\uu EVENTARGUMENT
将不存在,因为该值为空,所以Scrapy将忽略它)
一旦确定了问题,您可以通过将设置为None
,从\u response()
方法告诉,您不希望特定字段出现在正文中
fr = FormRequest.from_response(response, formdata={
'__EVENTTARGET': 'dgSearchResults$ctl24$ctl01',
'cmdSearchNew': None
})
这应该足以让您获得第2页的响应。正如我在评论中提到的,这是ASP网页上非常常见的问题。现在您可能已经知道,您提到的js将触发POST请求。此post请求的正文可能包含您在搜索表单中作为输入填写的字段以及页面实例生成的几个隐藏输入(如\uuuu VIEWSTATE
或\uuu VIEWSTATEGENERATOR
)
使用FormRequest.from_response()
方法时,它将搜索这些输入以填充请求正文,方法是选择页面中//form
元素内的所有输入元素。有时候没关系,有时候没关系,这就是你的情况
当该方法选择所有输入时,它将获得一个用于其他对象的输入。在您的情况下,就是这种输入:
<input id="cmdSearchNew" value="New Search" ... />
但是,如果您检查scrapy请求的主体(您可以在您已经使用的shell中打印您的fr.body
),您将看到如下内容:
{
"__EVENTTARGET":"dgSearchResults$ctl24$ctl01",
"__EVENTARGUMENT":"",
"__VIEWSTATE":"jyAD4Bm...",
"__VIEWSTATEGENERATOR":"11C1F95B",
"__EVENTVALIDATION":"TmG0xFB..."
}
{
"__EVENTTARGET":"dgSearchResults$ctl24$ctl01",
"cmdSearchNew": "New Search"
"__VIEWSTATE":"jyAD4Bm...",
"__VIEWSTATEGENERATOR":"11C1F95B",
"__EVENTVALIDATION":"TmG0xFB..."
}
它将被URL编码,这是一个已解析的视图
该cmdSearchNew
字段不应该存在,它是用于其他内容的,但scrapy不知道,因为它在同一表单中。(另外,\uu EVENTARGUMENT
将不存在,因为该值为空,所以Scrapy将忽略它)
一旦确定了问题,您可以通过将设置为None
,从\u response()
方法告诉,您不希望特定字段出现在正文中
fr = FormRequest.from_response(response, formdata={
'__EVENTTARGET': 'dgSearchResults$ctl24$ctl01',
'cmdSearchNew': None
})
这应该足以让您获得第2页的响应。这在ASP网页中非常常见。from_response的非常适合处理这些字段,但有时它会跳过必填字段,或者包含不应该在请求主体中的字段。在您发出请求之前,请尝试检查您的请求。正文
,并将其与您的浏览器在更改页面时发出的POST请求正文进行比较。如果是相同的,你可能还需要复制标题。你能详细说明吗?当然,我会写一个正确的答案。这在ASP网页中很常见。from_response的非常适合处理这些字段,但有时它会跳过必填字段,或者包含不应该在请求主体中的字段。在您发出请求之前,请尝试检查您的请求。正文
,并将其与您的浏览器在更改页面时发出的POST请求正文进行比较。如果是相同的,你可能还需要复制标题。你能详细说明吗?当然,我会写一个正确的答案。