1 尝试下file_get_contents(urlencode("http://forum.xinhuanet.com/listtopic.jsp?bid=50")),如果需要登录才能得到的页面,最好使用curl进行模拟登陆,毕竟curl的功能要比file_get_contents强大的多。
2 我跟你的做法一样,首先应该采集帖子列表页。获取列表页所有的帖子链接,比如你来看下这个板块:http://www.tatazu.com/bbs/forumdisplay.php?fid=4
首先应该把这个列表页所有的帖子id采集到,装入一个数组。也就是列表页内所有的http://www.tatazu.com/bbs/viewthread.php?tid=38663&extra=page%3D1链接里面的tid=38663这个参数,把这一页的所有帖子id都获取到,再去循环采集每个链接页面的帖子就可以了。这应该是最好的方法了。数据量大那是肯定的,光采集一个板块的速度就相当的慢。这跟php本身不支持多线程有关。还有一点,你必须使用时间缓存数据,这种数据不可能实时得到。1,2个小时采一次就可以了。

解决方案 »

  1.   

    1.有些网站会通过cookie、session之类的信息屏蔽采集器
      搜索论坛,很多内容都需要登陆,建议lz做一个功能比较齐全的http客户端程序比较好。
      ZF的雷库不错,可以利用它开发:
      http://framework.zend.com/manual/zh/zend.http.html2.HTML/XHTML的标签很随意,也比较复杂,用正则解析内容,个人认为不现实。
      建议用html解析器
      http://php-html.sourceforge.net/3.数据量大师肯定的,但是可以把数据保存到数据库,以URL为键
    做采集器需要深入理解HTTP协议原理,理论方面,建议lz从理解HTTP请求处理方式、cookie的基本原理、session的实现机制等入手。
    有理论作基础,写http客户端程序就变得驾轻就熟了。
      

  2.   

    Warning: file_get_contents(): Circular redirect, aborting. in *\test.php on line 2重定向循环,放弃
    至于采集多个贴子,有了url就可以采集,如果想准确采取页中的一部分,那就很麻烦了,估计google都没有好的办法,只能一个一个地定义
      

  3.   

    先感谢ls诸位的回复file_get_contents(urlencode("http://forum.xinhuanet.com/listtopic.jsp?bid=50"))报错
    file_get_contents(http%3A%2F%2Fforum.xinhuanet.com%2Flisttopic.jsp%3Fbid%3D50): failed to open stream: No such file or directory英文看的懂,但这个是什么原因呢?新华网的论坛版块,直接是可以打开,不需要登录。(暂时也不准备做模拟登录的功能,大部分样本论坛可以匿名查看)
      

  4.   

    这个问题可能是它的程序用对user-agent的判断。会检验你的http头是否完整,是否由浏览器发出的。以此来逃避采集器的抓取。不过这其实是防君子不防小人的一种做法,你看看curl的那些相关函数,然后自己伪造一些user-agent信息,把http头模拟的更逼真一些就可以骗过了。
      

  5.   

    我觉得是新华网在接收请求时作了预处理他可能预先向你发送了信息,比如cookie,或其他信息,然后再读这个信息,如果能收到,是返回正确的信息,否则重定向到其他比如:能否让你再次请求这个页!或者重定向到自身!如果重定向,file_get_content可能取不到重定向后的值的你可以试其他的方法如curl实际上,服务器在后台做了什么,你很难知道