Web crawler 具有相同url的两个页面。如何爬行?

Web crawler 具有相同url的两个页面。如何爬行?,web-crawler,scrapy,Web Crawler,Scrapy,我将展示我的确切示例,但我认为在一般情况下这可能是一个问题,在这种情况下,您必须抓取一个url将您指向另一个页面的页面 我想要抓取的页面位于此url下,但不是直接跟随此链接时获得的页面。我想要的就是你点击“全部显示”时看到的那个 我怎样才能让我的蜘蛛从我想要的开始呢 谢谢“show all”链接是对网页上Javascript函数的调用,它的调用方式如下: __doPostBack('ctl00$ContentPlaceHolder1$PGN01','') function __doPostBa

我将展示我的确切示例,但我认为在一般情况下这可能是一个问题,在这种情况下,您必须抓取一个url将您指向另一个页面的页面

我想要抓取的页面位于此url下,但不是直接跟随此链接时获得的页面。我想要的就是你点击“全部显示”时看到的那个

我怎样才能让我的蜘蛛从我想要的开始呢

谢谢“show all”链接是对网页上Javascript函数的调用,它的调用方式如下:

__doPostBack('ctl00$ContentPlaceHolder1$PGN01','')
function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}
<form id="aspnetForm"
<form id="aspnetForm" onsubmit="javascript:return WebForm_OnSubmit();"
 action="/Shoes-All.aspx" method="post" name="aspnetForm">
我的主浏览器是Firefox,它有很好的附加组件,你可以使用。 我使用了“Web开发者”附加组件

在具有该页的选项卡中,然后执行以下操作: 让鼠标光标悬停在show all链接上。 然后右键单击并选择“Web开发者”>“信息”>“查看Javascript Alt+Shift+J” Firefox将打开一个新选项卡,其中包含page正在使用的所有Java脚本

在选项卡-中,快速搜索会找到_doPostBack函数,其编码如下:

__doPostBack('ctl00$ContentPlaceHolder1$PGN01','')
function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}
<form id="aspnetForm"
<form id="aspnetForm" onsubmit="javascript:return WebForm_OnSubmit();"
 action="/Shoes-All.aspx" method="post" name="aspnetForm">
如果if statemment中的测试结果为true,并且我们使用函数调用中的参数,则JavaScipt函数可以简化为下面的JavaScript代码:

theForm.__EVENTTARGET.value = 'ctl00$ContentPlaceHolder1$PGN01';
theForm.__EVENTARGUMENT.value = '';
theForm.submit();
var theForm = document.forms['aspnetForm'];
if (!theForm) {
    theForm = document.aspnetForm;
}
现在我们需要知道“形式”是什么

以下代码位于_doPostBack函数的正上方:

theForm.__EVENTTARGET.value = 'ctl00$ContentPlaceHolder1$PGN01';
theForm.__EVENTARGUMENT.value = '';
theForm.submit();
var theForm = document.forms['aspnetForm'];
if (!theForm) {
    theForm = document.aspnetForm;
}
由此可知,“theForm”是对“form”HTML标记的引用,该标记具有id属性“aspnetForm”(id='aspnetForm'),这意味着在HTML文档中,我们应该查找以下开头的内容:

__doPostBack('ctl00$ContentPlaceHolder1$PGN01','')
function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}
<form id="aspnetForm"
<form id="aspnetForm" onsubmit="javascript:return WebForm_OnSubmit();"
 action="/Shoes-All.aspx" method="post" name="aspnetForm">
}

让我们看看ValidatorOnSubmit()函数和它使用的一个有趣的变量:

var Page_ValidationActive = false;

// ...

function ValidatorOnSubmit() {
    if (Page_ValidationActive) {
        return ValidatorCommonOnSubmit();
    }
    else {
        return true;
    }
}
这意味着函数将始终返回“true”,因此我们现在可以将表单开始标记重写为:

<form id="aspnetForm" onsubmit="javascript:return true;"
 action="/Shoes-All.aspx" method="post" name="aspnetForm">
。。。它的CSS选择器是:

form#aspnetForm div input#__VIEWSTATE
从Web服务器下载所有项目后,您将需要解析HTML页面

有趣的内容深深地嵌入到表单中。 这是一个HTML表

该表的相关XPath为:

//*[@id="ctl00_ContentPlaceHolder1_dlList"]
。。。CSS选择器是

table#ctl00_ContentPlaceHolder1_dlList
它包含一个tbody、tr、td、div和另一个表(=更糟糕的设计-有人需要了解无表设计。HTML表在智能手机和平板电脑上看起来很糟糕。)

我认为在这一点上,你应该把漂亮的汤放在工作上

在“研究”了一段时间您所写的内容之后,我了解到按钮SHOW ALL只是修改表单“aspnetForm”的输入事件目标的属性“value”,然后提交它,因此html会发生变化。但是我仍然不明白为什么我必须复制输入“\uuu VIEWSTATE”属性值的内容,为什么我必须从服务器下载一些项目。基本上我不知道如何让我的蜘蛛解析这个修改过的HTML,因为它不是一个链接。(我对这一切都很陌生,我不知道是否有办法抓取修改后的HTML而不是新的给定URL)