!如何抓取动态页面的HTML并用正则表达式搜索匹配并抓取相关的匹配信息! 愿闻其详,我没有接触过curl。是不是php的扩展功能,需手动打开的那个。请提供一个思路或者相似的使用例子。非常感谢。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 要抓的是一个动态网页(比如a.php)返回结果页,仍然叫a.php。这个抓取html源文件的目的,主要是为了分析,然后得出最新更新信息的详情。 $str = file_get_contents("url");preg_match("/<title>(.*?)<\/title>/",$str,$arrStr);var_dump($arrStr); 据说用Curl最好,但没用过用ajax也可,即xmlhttp,可以用post提交,但能否用session不清楚对于返回的html,可以用正则,也可用解析成DOM(不知道PHP可以不可以) curl的一个简单用法<?php $data = array('__EVENTTARGET' => '', '__EVENTARGUMENT' => '', '__VIEWSTATE' => 'dDwxNzYwNDY0MjA4O3Q8O2w8aTwxPjs+O2w8dDw7bDxpPDEzPjs+O2w8dDxAMDw7Ozs7Ozs7Ozs7Pjs7Pjs+Pjs+PjtsPEltYWdlQnV0dG9uMTs+PvHJ+cz 7Hh6RMvGhVdpCm66xWrhx', 'drpwnls1' => '0', 'txbNumber' => '1501905056', 'ImageButton1.x' => '31', 'ImageButton1.y' => '6'); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,'http://www.xxx.com/ZFGJJSearch.aspx?tabId=84&menuId=43'); curl_setopt($ch, CURLOPT_POSTFIELDS,$data); curl_setopt($ch, CURLOPT_RETURNTRANSFER,false); echo curl_exec($ch); curl_close($ch); ?>$data为POST的数据首先curl_init返回一个curl的句柄接下来curl_setopt设置CURL的一些option...然后curl_exec返回结果 LZ这里就需要对结果进行正则匹配 正则怎么写就得根据内容了最后curl_close关闭curl句柄 要用curl的话需要PHP.INI的extention下打开php_curl.dll另外网上有些类也可以满足LZ的要求比如SNOOPY类具体可以google一下 提交以后,获取动态页面的html静态源文件,然后用正则搜索,匹配则抓取并存入数据库*****网上现成的类都不可能完全提供楼主的匹配要求,自己写吧 动态页面的意思是,要抓的是结果页。比如我提交一个表单,对方服务器回应并返回一些信息,然后给出一个结果页面。比如我提交报名信息,报名时间为7月与8月(checkbox),报名地点为北京和河北省(Checkbox)。提交往某个网址。(我这个是:http://toefl.etest.edu.cn/cn/SeatsQuery)然后会给我一个结果页面,但网址仍然是http://toefl.etest.edu.cn/cn/SeatsQuery。我需要抓的是给我的静态页面中的注册状态为“有名额”的行。并得到那行的机构名。正则我自己写没事,我需要知道的是怎么获取这个结果静态页面。 我用curl和snoopy试过。好像返回的页面都是提交的表单页。 所要提交的checkbox值是: name=mvfAdminMonths value=200707 value=200708 name=mvfSiteProvinces value=Beijing value=Hebei提交完以后,需要得到结果页。问题的核心是:如何得到结果页的信息 用post!看表单的action="XXX.php"用get方式传递值即XXX.php?mvfAdminMonths=200707 如对方接收是post,则用post提交 问题不在于提交,而在于如何获取提交以后的查询结果。因为服务器端用的session,方法是POST,这些数据传递中间的过程是完全无法获取的。如果没有权限,比如只是普通浏览者的话,只能根据查询结果页来间接取得查询结果。当然我可以一整天坐在电脑前每隔15秒刷一次,但是这是无比痛苦的事。 所以我希望写个小程序,代替这个工作。php应该能实现,其实以前有个vb小程序可以用在雅思的报名上。但是托福的系统做得严密比较麻烦,而且有重重的防刷新机制,所以只能绕弯子,取结果静态页来获取最新消息。 你是不是没POST全数据啊?mvfAdminMonths 200706mvfAdminMonths 200707mvfSiteProvinces BeijingwhichFirst AS__act __id.22.SeatsQuery.adp.actListsubmit.x 28submit.y 9点查询时有如上数据POST过去的 submit.x 和submit.y是什么作用?我调整了一下传值过去,发现:“访问被限制为防止自动注册机器人反复登录刷新,在您打开当前浏览器并第一次访问此服务器(或者退出后重新登录)后的 30 秒内不得访问此页面。违反此规则将被视为“盲抢”,来自同一个IP地址的反复“盲抢”行为将导致IP地址被封禁。 ”打开浏览器并第一次访问此服务器后30秒,,,才能访问,,,这个怎么实现?1.curl访问服务器?2.然后setTimeout(xx,3000)>?3.运行上面的curl代码 submit.x 和submit.y是什么作用?好像没啥作用 .net写的经常有这两个值第一次访问服务器30秒后用sleep(30)函数停止30s再循环执行代码应该可以吧 问题仍然很多,尝试好几天了。 哪位高手把关键代码写一下,我直接给分吧- -# 实在折腾得不行。正则不用写,只要写到获取并返回结果源文件即可。就是托福报名的网站,http://toefl.estest.edu.cn提供一个登录帐号 183939 密码是abc!123 不是我不去试,snoopy和curl我都试过了。 现在返回的是:“访问被限制为防止自动注册机器人反复登录刷新,在您打开当前浏览器并第一次访问此服务器(或者退出后重新登录)后的 30 秒内不得访问此页面。违反此规则将被视为“盲抢”,来自同一个IP地址的反复“盲抢”行为将导致IP地址被封禁。 ” 解决下实际问题,思路没有问题。但是没法实现,sleep(30)我试过了,整个程序停止了,30秒以后,回来的仍然是相同的消息,sleep(30)以后的代码没有执行。======================================1.流程控制的问题 登录->填写选择项->提交->获取结果信息->正则匹配处理每进行一步服务器都会返回信息,如果跳转到这个页面则下面代码皆无效,因为页面不存在了。 怎样实现在同一页面间只获取返回信息并处理后进行跳转。2.登录状态的问题,比如post以后,如果是浏览器则正常,如果是php页面则会返回上述的“访问被限制”的提示 如果以方用session,一般没法解决,据说curl可模拟,没试过实在不行的话只有手动了技术太复杂了 这个网站用了session..session id是通过cookie传递的以下例子已经过测试可以获得查询结果<?php $cookie_jar = 'cookie.txt';$data = array('mvfAdminMonths' => '200706', 'mvfSiteProvinces' => 'Beijing', 'whichFirst' => 'AS', '__act' => '__id.22.SeatsQuery.adp.actList', 'submit.x' => '28', 'submit.y' => '9'); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,'http://toefl.etest.edu.cn/cn/SeatsQuery'); curl_setopt($ch, CURLOPT_POSTFIELDS,$data); curl_setopt($ch, CURLOPT_RETURNTRANSFER,false); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar);echo curl_exec($ch);sleep(30);$data = array('mvfAdminMonths' => '200706', 'mvfSiteProvinces' => 'Beijing', 'whichFirst' => 'AS', '__act' => '__id.22.SeatsQuery.adp.actList', 'submit.x' => '28', 'submit.y' => '9'); $ch2 = curl_init(); curl_setopt($ch2, CURLOPT_URL,'http://toefl.etest.edu.cn/cn/SeatsQuery'); curl_setopt($ch2, CURLOPT_POSTFIELDS,$data); curl_setopt($ch2, CURLOPT_RETURNTRANSFER,false); curl_setopt($ch2, CURLOPT_COOKIEFILE, $cookie_jar); echo curl_exec($ch2);curl_close($ch); ?>第一次curl提交时 用curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar);获得cookie内容第二次curl提交时 用curl_setopt($ch2, CURLOPT_COOKIEFILE, $cookie_jar); 提交cookie内容需要注意的是cookie.txt这个文件需要手动建立 curl并不会替你建立并且要给php对当前目录的写权限,不然可能cookie无法被写入 非常感谢楼上的,我测试了以后可以了,我还想问个问题: 1.curl传值的时候,如果把checkbox的多选值传过去。比如 mvfAdminMonths mvfSiteProvinces有多个值,在这个例子中如何传过去? 2.cookie.txt在代码运行完以后仍然为0字节。不知道是否没有写入东西。 1.$data = array('mvfAdminMonths' => array('200706','200707'), 'mvfSiteProvinces' => 'Beijing', 'whichFirst' => 'AS', '__act' => '__id.22.SeatsQuery.adp.actList', 'submit.x'=> '28', 'submit.y'=> '9'); 类似于这样2.cookie.txt我这边测试时是有值得 里面记录了session_id第一次没写权限的时候 我测试是失败的 不知道你那边是怎么成功的 赫赫 cookie.txt自动生成到apache的安装目录了,我们的配置环境不一样。还有,你说的方法不行,用array()传值以后显示input value not long enough for date format 听前辈说... php中加一个属性 大家帮我分析一下,我的网站是不是存在漏洞? 用ajax读取xml文件 并进行增加 修改 删除(急急急!!!!!!!在线等!) PHPmyadmin 点导出数据库 然后再导入到原来的位置 就变乱码了? 如何有效设置Session 求教在PHP代码中如何嵌入3Dmax动画。 关于文字和图片一起上传mysql数据库的问题。 高分求教。DISCUZ 问题 用记事本作的留言版如何来删除留言? 为什么fsockopen()函数一直连接不上,请高手帮忙,谢谢! 如何突破防盗采集远程图片
preg_match("/<title>(.*?)<\/title>/",$str,$arrStr);
var_dump($arrStr);
用ajax也可,即xmlhttp,可以用post提交,但能否用session不清楚
对于返回的html,可以用正则,
也可用解析成DOM(不知道PHP可以不可以)
$data = array('__EVENTTARGET' => '',
'__EVENTARGUMENT' => '',
'__VIEWSTATE' => 'dDwxNzYwNDY0MjA4O3Q8O2w8aTwxPjs+O2w8dDw7bDxpPDEzPjs+O2w8dDxAMDw7Ozs7Ozs7Ozs7Pjs7Pjs+Pjs+PjtsPEltYWdlQnV0dG9uMTs+PvHJ+cz 7Hh6RMvGhVdpCm66xWrhx',
'drpwnls1' => '0',
'txbNumber' => '1501905056',
'ImageButton1.x' => '31',
'ImageButton1.y' => '6');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,'http://www.xxx.com/ZFGJJSearch.aspx?tabId=84&menuId=43');
curl_setopt($ch, CURLOPT_POSTFIELDS,$data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,false);
echo curl_exec($ch);
curl_close($ch);
?>$data为POST的数据
首先curl_init返回一个curl的句柄
接下来curl_setopt设置CURL的一些option...
然后curl_exec返回结果
LZ这里就需要对结果进行正则匹配 正则怎么写就得根据内容了
最后curl_close关闭curl句柄
name=mvfAdminMonths value=200707 value=200708
name=mvfSiteProvinces value=Beijing value=Hebei提交完以后,需要得到结果页。问题的核心是:如何得到结果页的信息
看表单的action="XXX.php"用get方式传递值即XXX.php?mvfAdminMonths=200707
如对方接收是post,则用post提交
所以我希望写个小程序,代替这个工作。php应该能实现,其实以前有个vb小程序可以用在雅思的报名上。但是托福的系统做得严密比较麻烦,而且有重重的防刷新机制,所以只能绕弯子,取结果静态页来获取最新消息。
mvfAdminMonths 200707
mvfSiteProvinces Beijing
whichFirst AS
__act __id.22.SeatsQuery.adp.actList
submit.x 28
submit.y 9点查询时有如上数据POST过去的
访问被限制
为防止自动注册机器人反复登录刷新,
在您打开当前浏览器并第一次访问此服务器(或者退出后重新登录)后的 30 秒内不得访问此页面。违反此规则将被视为“盲抢”,来自同一个IP地址的反复“盲抢”行为将导致IP地址被封禁。
”打开浏览器并第一次访问此服务器后30秒,,,才能访问,,,这个怎么实现?1.curl访问服务器?
2.然后setTimeout(xx,3000)>?
3.运行上面的curl代码
用sleep(30)函数停止30s再循环执行代码应该可以吧
实在折腾得不行。正则不用写,只要写到获取并返回结果源文件即可。就是托福报名的网站,http://toefl.estest.edu.cn提供一个登录帐号 183939 密码是abc!123
“
访问被限制
为防止自动注册机器人反复登录刷新,
在您打开当前浏览器并第一次访问此服务器(或者退出后重新登录)后的 30 秒内不得访问此页面。违反此规则将被视为“盲抢”,来自同一个IP地址的反复“盲抢”行为将导致IP地址被封禁。
” 解决下实际问题,思路没有问题。但是没法实现,sleep(30)我试过了,整个程序停止了,30秒以后,回来的仍然是相同的消息,sleep(30)以后的代码没有执行。======================================
1.流程控制的问题 登录->填写选择项->提交->获取结果信息->正则匹配处理每进行一步服务器都会返回信息,如果跳转到这个页面则下面代码皆无效,因为页面不存在了。 怎样实现在同一页面间只获取返回信息并处理后进行跳转。2.登录状态的问题,比如post以后,如果是浏览器则正常,如果是php页面则会返回上述的“访问被限制”的提示
实在不行的话只有手动了
技术太复杂了
<?php
$cookie_jar = 'cookie.txt';
$data = array('mvfAdminMonths' => '200706',
'mvfSiteProvinces' => 'Beijing',
'whichFirst' => 'AS',
'__act' => '__id.22.SeatsQuery.adp.actList',
'submit.x' => '28',
'submit.y' => '9');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,'http://toefl.etest.edu.cn/cn/SeatsQuery');
curl_setopt($ch, CURLOPT_POSTFIELDS,$data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,false);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar);
echo curl_exec($ch);
sleep(30);
$data = array('mvfAdminMonths' => '200706',
'mvfSiteProvinces' => 'Beijing',
'whichFirst' => 'AS',
'__act' => '__id.22.SeatsQuery.adp.actList',
'submit.x' => '28',
'submit.y' => '9');
$ch2 = curl_init();
curl_setopt($ch2, CURLOPT_URL,'http://toefl.etest.edu.cn/cn/SeatsQuery');
curl_setopt($ch2, CURLOPT_POSTFIELDS,$data);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER,false);
curl_setopt($ch2, CURLOPT_COOKIEFILE, $cookie_jar);
echo curl_exec($ch2);
curl_close($ch);
?>第一次curl提交时 用curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar);
获得cookie内容第二次curl提交时 用curl_setopt($ch2, CURLOPT_COOKIEFILE, $cookie_jar);
提交cookie内容需要注意的是cookie.txt这个文件需要手动建立 curl并不会替你建立
并且要给php对当前目录的写权限,不然可能cookie无法被写入
$data = array('mvfAdminMonths' => array('200706','200707'),
'mvfSiteProvinces' => 'Beijing',
'whichFirst' => 'AS',
'__act' => '__id.22.SeatsQuery.adp.actList',
'submit.x'=> '28',
'submit.y'=> '9'); 类似于这样2.cookie.txt我这边测试时是有值得 里面记录了session_id
第一次没写权限的时候 我测试是失败的 不知道你那边是怎么成功的 赫赫