我想抓取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一样.谢谢
UPDATE
我尝试过以下建议之一 - 古特.
这是我的新代码:
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
是我上面给出的蛋白质序列.好的部分是:它发布,获取新页面,但不遵循所有重定向.如何使其遵循所有重定向?
我认为这个网站非常容易抓取.要了解发生了什么,请在浏览器中关闭JavaScript并尝试浏览网站(为此,我使用Firebug中的Disable-> Disable JavaScript菜单,这是一个Firefox插件).
如果您转到第一个链接并粘贴到字符串中,则会在POST操作中获得一个表单,该表单实际上表示您的搜索正在进行中.它看起来像这样:
职位名称:蛋白质序列(333个字母)
请求ID:NR8ZP8E1071
由于在这个屏幕上没有太多的兴趣,我假设你不想从这里刮 - 但这实际上是你目前正在做的.
接下来会发生一件JavaScript使用以下代码提交隐藏的表单:
我的猜测是,在负载很重的时候,这里的延迟(目前设置为1000毫秒,即1秒)会增加一点.隐藏的表单如下所示:
这也会为程序创建一个POST请求,最感兴趣的是RID
将请求与初始查询参数相关联的字段.这可能存储在数据库或临时文件中,并分配了一个ID,该ID将在几小时后到期.
提交此表单时,会提供许多有趣的信息,这些信息在创建它的表单的POST请求中呈现.上述字段之一可能指定要显示的初始对齐数.如果你重新打开JavaScript,你会发现指向页面的末尾(它本身就是几个屏幕)将使用这个程序加载另一个块:
http://blast.ncbi.nlm.nih.gov/t2g.cgi?CMD=Get&RID=NR8ZP8E1071&OLD_BLAST=false&DESCRIPTIONS=0&NUM_OVERVIEW=0&GET_SEQUENCE=on&DYNAMIC_FORMAT=on&ALIGN_SEQ_LIST=gi|160797,gi|9816,gi|121273,gi|428230092, GI | 417051&HSP_SORT = 0&SEQ_LIST_START = 1&QUERY_INDEX = 0&SHOW_LINKOUT = ON&ALIGNMENT_VIEW =成对&MASK_CHAR = 2&MASK_COLOR = 1&LINE_LENGTH = 60
有趣的是,这里使用了GET请求.在Firefox中使用网络监视器,我触发了一系列这些,以查看是否可以发现一系列递增数字.我发现SEQ_LIST_START
从1开始并以5为块递增,但我不确定元素的ALIGN_SEQ_LIST
来源 - 可能来自当前页面.值得你看看自己是否能发现任何东西 - 特别是因为你会以一种我不理解的方式理解主题.
您可以修改此链接中的一些查询字符串参数,以查看控制返回项目数的内容.但是,要小心:如果您要求使用更大的系统,那么您可能会注意到并且在您的IP地址上放置了一个块.
除此之外,请记住,如果您抓取网站,则将成本转嫁给第三方.由于数据似乎是免费提供的,因此这在某种程度上是可以接受的,并且是他们已经花费的资金的好处.但是,请注意您放在其服务器上的负载:不要请求过大的块,并在每个请求之间放置几秒钟的延迟.
如果您计划获取大量数据(例如超过半千兆字节),那么在几秒钟到几分钟等待之间交替,或者可能在夜间(他们的时间)集中您的下载,因为他们的服务器可能会更少忙.如果没有"负责任地"作为爬虫,可能会将您的IP范围放在他们的阻止列表中,并且在最坏的情况下可能构成拒绝服务攻击.
总而言之,这就是您需要做的事情:
发出检索表单的初始POST请求
等几秒钟
获取响应(特别是请求ID)并在新POST中重新提交该数据
从屏幕上收集数据
在第二个程序中使用GET请求来获取新数据
从响应中收集新数据
愿意修改你的POST和GET参数来看效果,玩得开心!