使用php的curl根据关键词爬取百度搜索结果页

「已注销」 2014-11-22 11:09:48
我想实现的是每次根据给出的关键词搜索百度结果页,比如百度搜索结果是这样的,百度推广内容加正文:

而我使用curl爬取结果是这样的:

也就是说每次爬取结果都是无法爬取到百度推广的内容。请问哪位大师能指导一下,鄙人刚入门,望各位不吝指导。先谢过了。
其中php抓取代码如下:

<?php
$url = "http://www.baidu.com/s?wd=生命动力";
// 构造包头,模拟浏览器请求
$header = array (
"Host:www.baidu.com",
"Content-Type:application/x-www-form-urlencoded",//post请求
"Connection: keep-alive",
'Referer:http://www.baidu.com',
'User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; BIDUBrowser 2.6)'
);
$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_URL, $url );
curl_setopt ( $ch, CURLOPT_HTTPHEADER, $header );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
// 执行
$content = curl_exec ( $ch );
if ($content == FALSE) {
echo "error:" . curl_error ( $ch );
}
// 关闭
curl_close ( $ch );

//输出结果
echo $content;
?>
...全文
6794 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
baidu_36923347 2016-12-04
  • 打赏
  • 举报
回复
在你爬虫的这个页面进行搜索能和百度一样搜出来吗?
baidu_36923347 2016-12-04
  • 打赏
  • 举报
回复
能做到实时更新吗?
傲雪星枫 2014-11-23
  • 打赏
  • 举报
回复
推广的内容是页面加载后再调用js二次请求获取,写入页面的。所以用curl只能获取到html有的东西。 而js加载的,你需要再用curl去获取它js获取的url得到。
傲雪星枫 2014-11-23
  • 打赏
  • 举报
回复
这个你需要看看页面有没什么隐藏参数,通常那些会影响的。 例如js也会的。而且这算是另一个问题,应该开新贴讨论。
「已注销」 2014-11-23
  • 打赏
  • 举报
回复
大虾们,求顶求指导。
「已注销」 2014-11-23
  • 打赏
  • 举报
回复
引用 4 楼 fdipzone 的回复:
你的user-agent没有模拟好,所以不行。
其实根本不需要用post,直接用get就可以了。
修改如下:

$url = "http://www.baidu.com/s?wd=生命动力";

$header = array (
'User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36'
);
$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_URL, $url );
curl_setopt ( $ch, CURLOPT_HTTPHEADER, $header );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
// 执行
$content = curl_exec ( $ch );
if ($content == FALSE) {
echo "error:" . curl_error ( $ch );
}
// 关闭
curl_close ( $ch );

//输出结果
echo $content;




感谢你的回复。你的结论是正确的。我这里还有一个问题,就是抓取到的网页图片第一次运行可以显示,之后就显示不了了。

查看源代码发现获取到的图片地址是真实地址啊,但就是显示不了,请问有什么思路可以绕过这个防外链。在curl伪造来路好像也行不通。
傲雪星枫 2014-11-23
  • 打赏
  • 举报
回复
你的user-agent没有模拟好,所以不行。
其实根本不需要用post,直接用get就可以了。
修改如下:

$url = "http://www.baidu.com/s?wd=生命动力";

$header = array (
'User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36'
);
$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_URL, $url );
curl_setopt ( $ch, CURLOPT_HTTPHEADER, $header );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
// 执行
$content = curl_exec ( $ch );
if ($content == FALSE) {
echo "error:" . curl_error ( $ch );
}
// 关闭
curl_close ( $ch );

//输出结果
echo $content;


「已注销」 2014-11-23
  • 打赏
  • 举报
回复
引用 2 楼 fdipzone 的回复:
推广的内容是页面加载后再调用js二次请求获取,写入页面的。所以用curl只能获取到html有的东西。 而js加载的,你需要再用curl去获取它js获取的url得到。
但是这个百度推广内容通过查看网页源代码是可以看到的?通过调用js生成的信息会出现在网页源代码吗?

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧