一个简单的开源PHP爬虫框架『Phpfetcher』
优采云 发布时间: 2020-05-27 08:02报dom为空
fanfank 文章作者
完整的代码贴下来我看一下,或者在微博私信我,我帮你看一下
aa
//下面两行促使这个项目被下载出来后本文件能直接运行
$demo_include_path = dirname(__FILE__) . ‘/../’;
set_include_path(get_include_path() . PATH_SEPARATOR . $demo_include_path);
require_once(‘phpfetcher.php’);
class mycrawler extends Phpfetcher_Crawler_Default {
public function handlePage($page) {
var_dump($page);
//打印处当前页面的第1个h1标题内荣(下标从0开始)
$strFirstH1 = trim($page->sel(‘//title’, 0)->plaintext);
if (!empty($strFirstH1)) {
echo $page->sel(‘//title’, 0)->plaintext;
echo “\n”;
}
}
}
$crawler = new mycrawler();
$arrJobs = array(
//任务的名子随意起,这里把名子叫qqnews
//the key is the name of a job, here names it qqnews
‘qqnews’ => array(
‘start_page’ => ‘#8217;, //起始网页
‘link_rules’ => array(
/*
* 所有在这里列举的正则规则,只要能匹配到超链接,那么那条爬虫才会爬到那条超链接
* Regex rules are listed here, the crawler will follow any hyperlinks once the regex matches
*/
//’#news\.qq\.com/a/\d+/\d+\.htm$#’,
),
//爬虫从开始页面算起,最多爬取的深度,设置为2表示爬取深度为1
//Crawler’s max following depth, 1 stands for only crawl the start page
‘max_depth’ => 1,
) ,
);
$crawler->setFetchJobs($arrJobs)->run(); //这一行的疗效和下边两行的疗效一样
其他的没变
aa
public function read() {
$this->_strContent = curl_exec($this->_curlHandle);
是_strContent取到了false造成的 这个是啥缘由呢Page default.php
fanfank 文章作者
我这儿返回的是403 forbidden,查了一下晓得缘由了,因为user_agent的问题csdn把爬虫给禁了。你可以这样更改:找到文件Phpfetcher/Page/Default.php,然后搜『user_agent』,把上面改掉,我改成『firefox』就可以了,当然你可以可以改得更真实一点,例如哪些『Mozilla/5.0 AppleWebKit』之类的
有些网站会依照UA来屏蔽恳求,可能是因为个别UA有恶意功击的特点,或者一些爬虫之类的开源爬虫框架,之前百度有一段时间屏蔽360浏览器就是通过360浏览器里一些特定的UA来做到的,当然后来360浏览器把UA给更改嗯,就须要依照其它特点屏蔽了。
所以你这儿先改一下user_agent吧。
aa
多谢哈
试着改成Mozilla/5.0 (Windows NT 6.1; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0 也不行呢
试了这儿的也不行 恐怕还是curl的问题
fanfank 文章作者
我这儿执行都是正常的,结果也能下来。还是通过微博私信说吧,这里说得刷屏了
aa
围脖id是?
fanfank 文章作者
另外是,你贴的代码上面,标点符号不对啊,你的start_page对应那一行的标点,怎么是英文的单冒号?后面的单冒号似乎也不是个单冒号吧?要全部用英语的单冒号才行。
aa
符号是对的哈 都是英语的 没句型错误
joke
为什么匹配的内容都一样?
代码:
sel(‘//span[@id=”text110″]’, 0)->plaintext);
if (!empty($strFirstH1)) {
echo “”;
echo $page->sel(‘//span[@id=”text110″]’, 0)->plaintext;
echo “”;
echo “\n”;
}
}
}
$crawler = new mycrawler();
$arrJobs = array(
‘joke’ => array(
‘start_page’ => ‘#8217;,
‘link_rules’ => array(
‘#/\woke\wtml/\w+/20151021\d+\.htm$#’,
),
‘max_depth’ => 2,
) ,
);
$crawler->setFetchJobs($arrJobs)->run();
fanfank 文章作者
你的代码没贴全,而且匹配的内容都一样我没很理解是哪些意思,这个问题有点长,你直接在微博私信我,我帮你看一下
fanfank 文章作者
已经修补了。之前的问题是爬虫不认识站内链接,例如有的超链接是『/entry』这样的,而不是『』。现在最新的Phpfetcher早已就能辨识站内链接,可以试一下
joke
谢谢 ,搞定了
modejun
楼主您好,问问假如我晓得了一个网站开源爬虫框架,但是要递交post参数,这个要如何弄呢,朋友提供一下思路
fanfank 文章作者
提交post参数,那觉得场景很特殊的,因为这个就不是单纯地按照链接爬取网页内容了,而且假如真的提供这个功能,针对什么样的链接什么样的参数,怎么递交,然后返回的内容是如何处理这种,目前我觉得似乎不太适宜爬虫做。或者你在微博私信我,告诉我你的使用场景是哪些,我瞧瞧是不是考虑找时间加进去
modejun
场景就是有一翻页时用ajax post递交的page参数,如果是get就太easy。还有顺便问问,如果翻页我明天试了要解决的话就是调节深度,但是似乎最大是20,还有就是更改正则循环调用setFetchJobs这个方式,总是觉得不是这么完美,有哪些好的思路解决翻页这个问题吗,现在公司在定方案我想多了解把这个框架的优势发挥下来,感谢了。
fanfank 文章作者
如果像你说的是个post恳求,那么它返回的应当不是一个HTML格式的文档,通常都是json格式的,然后由当前页面将异步返回的内容加载显示下来。
你们的post恳求应当是有类似pn,rn等参数,如果大家仅仅是想领到post恳求的所有内容,可以直接写一个for循环,然后使用php的curl来直接发送post恳求获取每一个页面内容,可以不使用爬虫,因为这个爬虫基本原理是针对GET恳求返回的HTML页面的,然后手动抽取HTML的标签
最大深度可以更改类『Phpfetcher_Crawler_Default』中的『MAX_DEPTH』变量,把20改成-1就没有限制了,不过建议还是设一个上限比较好
可以不需要循环更改正则呀,设置正则规则的可以是一个链表,把上面的所有你认为合适的正则都列上就可以,除非说你的正则表达式还得依据页面的某个参数或则内容不同而更改,那这个情况还是相对特殊了一点···
翻页的解决,如果是GET就用爬虫,如果是POST,那么直接for循环之后调用curl会更好。
;;;
好像不错
;;;
能不能写个DOM选择器和技巧的文档,最好支持css选择DOM标签,有子节点,父节点,兄弟节点选择才好
fanfank 文章作者
在这个项目的github页面:,中文说明的第2节上面,有介绍dom选择器的文档
jeremy
博主。。为什么https的页面没办法恳求呢?