我想抓取NCBI网站并发送此链接提供蛋白质局部比对的请求: http://blast.ncbi.nlm.nih.gov/Blast.cgi?PROGRAM=blastp&BLAST_PROGRAMS=blastp&PAGE_TYPE=BlastSearch
我想知道我是否可以向此地址提交帖子请求,并使用PHP获取新页面中的结果。还有一个问题,在显示最终结果之前,页面经历了多次重定向 - 您可以使用以下输入进入文本区域来测试这种情况:
MHSSIVLATVLFVAIASASKTRELCMKSLEHAKVGTSKEAKQDGIDLYKHMFEHYPAMKKYFKHRENYTP
ADVQKDPFFIKQGQNILLACHVLCATYDDRETFDAYVGELMARHERDHVKVPNDVWNHFWEHFIEFLGSK
TTLDEPTKHAWQEIGKEFSHEISHHGRHSVRDHCMNSLEYIAIGDKEHQKQNGIDLYKHMFEHYPHMRKA
FKGRENFTKEDVQKDAFFVNKDTRFCWPFVCCDSSYDDEPTFDYFVDALMDRHIKDDIHLPQEQWHEFWK
LFAEYLNEKSHQHLTEAEKHAWSTIGEDFAHEADKHAKAEKDHHEGEHKEEHH
这是我的尝试:
$link = 'http://blast.ncbi.nlm.nih.gov/Blast.cgi?
PROGRAM=blastp&BLAST_PROGRAMS=blastp&PAGE_TYPE=BlastSearch';
$request = array(
'http' => array(
'method' => 'POST',
'content' => http_build_query(array(
'QUERY' => $aaText
)
),
)
);
$context = stream_context_create($request);
$html = file_get_html($link, false, $context);
echo $html;
此代码为我提供了初始页面,就像没有完成POST一样。 感谢
更新
我尝试过以下建议之一 - Goutte。
这是我的新代码:
require_once 'goutte.phar';
use Goutte\Client;
$client = new Client();
$crawler = $client->request('GET', $link);
$form = $crawler->selectButton('b1')->form();
$crawler = $client->submit($form, array('QUERY' => $aaTest));
echo $crawler->html();
变量$aaTest
是我上面给出的蛋白质序列。好的部分是:它发布,获取新页面,但不遵循所有重定向。如何使其遵循所有重定向?
答案 0 :(得分:8)
我认为这个网站非常容易抓取。要了解正在发生的事情,请在浏览器中关闭JavaScript并尝试浏览网站(为此,我使用Firebug中的Disable->禁用JavaScript菜单,这是一个Firefox插件)。
如果您转到第一个链接并粘贴到字符串中,则会在POST操作中获得一个表单,该表单实际上表示您的搜索正在进行中。它看起来像这样:
职位名称:蛋白质序列(333个字母)
请求ID:NR8ZP8E1071
由于此屏幕没有太多兴趣,我假设您不想从这里开始 - 但这实际上是您目前正在做的事情。
接下来会发生一件JavaScript使用以下代码提交隐藏的表单:
<SCRIPT LANGUAGE="JavaScript">
setTimeout('document.forms[0].submit();',1000);
</SCRIPT>
我的猜测是,在负载很重的时候,这里的延迟(目前设置为1000毫秒,即1秒)会增加一点。隐藏的表单如下所示:
<form action="Blast.cgi" enctype="application/x-www-form-urlencoded" method="post" name="RequestFormat" id="RequestFormat"">
<input name="CMD" value="Get" type="hidden">
<input name="ALIGNMENTS" value="100" type="hidden">
<input name="ALIGNMENT_VIEW" value="Pairwise" type="hidden">
<input name="BLAST_PROGRAMS" value="blastp" type="hidden">
<input name="CDD_RID" value="data_cache_seq:180192" type="hidden">
<input name="CDD_SEARCH" value="on" type="hidden">
<input name="CDD_SEARCH_STATE" value="4" type="hidden">
<input name="CLIENT" value="web" type="hidden">
<input name="COMPOSITION_BASED_STATISTICS" value="2" type="hidden">
<input name="CONFIG_DESCR" value="2,3,4,5,6,7,8" type="hidden">
<input name="DATABASE" value="nr" type="hidden">
<input name="DESCRIPTIONS" value="100" type="hidden">
<input name="EQ_OP" value="AND" type="hidden">
<input name="EXPECT" value="10" type="hidden">
<input name="FILTER" value="F" type="hidden">
<input name="FORMAT_NUM_ORG" value="1" type="hidden">
<input name="FORMAT_OBJECT" value="Alignment" type="hidden">
<input name="FORMAT_TYPE" value="HTML" type="hidden">
<input name="FULL_DBNAME" value="nr" type="hidden">
<input name="GAPCOSTS" value="11 1" type="hidden">
<input name="GET_SEQUENCE" value="on" type="hidden">
<input name="HSP_RANGE_MAX" value="0" type="hidden">
<input name="JOB_TITLE" value="Protein Sequence (333 letters)" type="hidden">
<input name="LAYOUT" value="OneWindow" type="hidden">
<input name="LINE_LENGTH" value="60" type="hidden">
<input name="MASK_CHAR" value="2" type="hidden">
<input name="MASK_COLOR" value="1" type="hidden">
<input name="MATRIX_NAME" value="BLOSUM62" type="hidden">
<input name="MAX_NUM_SEQ" value="100" type="hidden">
<input name="MYNCBI_USER" value="9311188414" type="hidden">
<input name="NEW_VIEW" value="on" type="hidden">
<input name="NUM_DIFFS" value="0" type="hidden">
<input name="NUM_OPTS_DIFFS" value="0" type="hidden">
<input name="NUM_ORG" value="1" type="hidden">
<input name="NUM_OVERVIEW" value="100" type="hidden">
<input name="OLD_BLAST" value="false" type="hidden">
<input name="OLD_VIEW" value="false" type="hidden">
<input name="PAGE" value="Proteins" type="hidden">
<input name="PAGE_TYPE" value="BlastSearch" type="hidden">
<input name="PROGRAM" value="blastp" type="hidden">
<input name="QUERY_INDEX" value="0" type="hidden">
<input name="QUERY_INFO" value="Protein Sequence (333 letters)" type="hidden">
<input name="QUERY_LENGTH" value="333" type="hidden">
<input name="REPEATS" value="5755" type="hidden">
<input name="RID" value="NR8ZP8E1071" type="hidden">
<input name="RTOE" value="21" type="hidden">
<input name="SELECTED_PROG_TYPE" value="blastp" type="hidden">
<input name="SERVICE" value="plain" type="hidden">
<input name="SHORT_QUERY_ADJUST" value="on" type="hidden">
<input name="SHOW_LINKOUT" value="on" type="hidden">
<input name="SHOW_OVERVIEW" value="on" type="hidden">
<input name="USER_DEFAULT_MATRIX" value="4" type="hidden">
<input name="USER_DEFAULT_PROG_TYPE" value="blastp" type="hidden">
<input name="USER_TYPE" value="2" type="hidden">
<input name="WORD_SIZE" value="3" type="hidden">
<input name="db" value="protein" type="hidden">
<input name="stype" value="protein" type="hidden">
<input name="x" value="41" type="hidden">
<input name="y" value="12" type="hidden">
</form>
这也会为程序创建一个POST请求,最感兴趣的是字段RID
,它将请求与您的初始查询参数相关联。这可能存储在数据库或临时文件中,并分配了一个ID,该ID将在几小时后到期。
提交此表单时,会提供许多有趣的信息,这些信息会在创建它的表单的POST请求中呈现。上述字段之一可能指定要显示的初始对齐数。如果你重新打开JavaScript,你会发现指向页面的末尾(它本身就是几个屏幕)将使用这个程序加载另一个块:
有趣的是,这里使用了GET请求。在Firefox中使用网络监视器,我触发了一系列这些监视器以查看是否可以发现一系列递增数字。我发现SEQ_LIST_START
从1开始并以5为块递增,但我不确定ALIGN_SEQ_LIST
中的元素来自哪里 - 可能来自当前页面。值得你看看自己是否能发现任何东西 - 特别是因为你会以一种我不理解的方式理解主题。
您可以修改此链接中的某些查询字符串参数,以查看控制返回项目数的内容。但是,要小心:如果您要求使用更大的系统,那么您可能会注意到并且在您的IP地址上放置了一个块。
除此之外,请记住,如果您抓取网站,则为passing your costs onto a third party。由于数据似乎是免费提供的,因此这在某种程度上是可以接受的,并且是他们已经花费的资金的好处。但是,请注意您放在服务器上的负载:不要请求过大的块,并在每个请求之间放置几秒钟。
如果您计划获取大量数据(例如超过半千兆字节),则可以在几秒钟到几分钟之间等待,或者在他们的服务器的夜晚(他们的时间)集中下载可能不那么忙。如果没有“负责任地”作为爬虫,可能会将您的IP范围放在他们的阻止列表中,并且在最坏的情况下可能构成拒绝服务攻击。
总而言之,这就是你需要做的事情:
愿意修改您的POST和GET参数以查看效果,并获得乐趣!