この記事は中水町で最初に公開されました: http://blog.reetsee.com/archives/366
携帯電話やコンピューターでより良い画像やコードを見たい場合は、元のアドレスにアクセスしてください。ブログ投稿。批判や修正も、ブログ投稿の元のアドレスで受け付けます。
??????????????????????????????
お久しぶりです!やっとまた日記を書きました。本当は載せたい日記がたくさんあったのですが、栄養にならない気がしたのでやめました。今日は主に、
Phpfetcher という名前の単純な PHP クローラー フレームワークを共有します。
プロジェクトのアドレスは次のとおりです: https://github.com/fanfank/phpfetcher このフレームワークの作成者は、reetsee.xu です。これは水を吹くという意味です。プロジェクト全体をダウンロードした後、Linux 上のターミナルの
demo フォルダーにある single_page.php を直接実行して、効果を確認します。ただし、デモ ファイルを実行する前に、文字化けの表示を避けるために、まず端末のエンコードを UTF-8 に設定してください。 ? ???? 0 背景
現在、Chuishui News (http://news.reetsee.com) のすべてのコンテンツは Python の Scrapy によってクロールされています。 News は現在、BAE (Baidu Application Engine) の下で実行されていますが、それでも毎月料金を支払う必要があります。私の現在のアイデアは、ニュースを現在の Alibaba Cloud ホストに完全に移行することであり、毎日手動でスクリプトを実行して、元のニュースをキャプチャし、Web サイトに更新します。ここに移行した後は、スクリプトのタイミングに Crontab を直接使用できます。ニュースを自動更新!最近、仕事で PHP を使用しています。PHP は、データベースを直接読み書きすることもできるので、ニュース Web サイトを再構築するためにも使用できます。作業を始めようとしたときに、適切な PHP クローラー フレームワークが見つからないことがわかりました (よく見ていなかったのかもしれません)。それで、自分で作成するつもりで、この Phpfetcher を思いつきました。名前は少し良くなりました...しかし、コードは少しわかりにくいです... とにかく、これで基本的に使用できるようになり、多くの簡単なニーズを満たすことができるはずです。使用例を次に示します。
1 基本概念
Phpfetcher には、順に Dom、Page、Crawler、Manager の 4 つの主要なオブジェクトがあります。
Dom オブジェクトは HTML を解析するために使用され、HTML 内の dom にアクセスできます。
Page オブジェクトは特定の HTML ページに対応し、Web ページ全体のコンテンツを取得できます。Page オブジェクトには Dom オブジェクトのメンバーがあります。
Crawler オブジェクトは、ページをクロールするためのルールを設定するために使用されるクローラー オブジェクトです。まだ実装されていないため、当面は役に立ちません
実際の使用は主に Crawler オブジェクトを操作することです。 Phpfetcher では、基本クラスの要件を満たす限り、独自の Dom、Page、および Crawler を実装できます。 Phpfetcher のデフォルトの Page オブジェクトの Dom オブジェクトは simple_html_dom を使用し、PHP が提供する DOMDocument クラスを使用しないことに注意してください。これは、DOMDocument が HTML 形式のコンテンツと互換性が低いことが判明したためです。他のコンテンツが含まれている場合、Web ページが解析されない場合があります。が混ざっています。以下の図は、Phpfetcher のディレクトリ構造です。独自のニーズに応じて、必要な Crawler、Page、および Dom クラスをカスタマイズできます。デフォルトでは、Crawler のデフォルト クラスは Phpfetcher_Crawler_Default、Page のデフォルト クラスは Phpfetcher_Page_Default です。および Dom クラス デフォルトのクラスは Phpfetcher_Dom_SimpleHtmlDom です。クラス名とそれが配置されているパスの間には対応関係があります。デフォルトの Page オブジェクトを使用する場合は PHP のcurl ライブラリが必要であり、デフォルトの Crawler オブジェクトを使用する場合は PHP の mb_string ライブラリを使用する必要があることに注意してください。ない場合はインストールする必要があります。理解を容易にするために、いくつかの図を描きました。最初の図は、Phpfetcher の 3 つの主要なオブジェクト間の関係を示しています。図は、Crawler の Page オブジェクトと Page の Dom オブジェクトを示しています。 Phpfetcher を使用する場合、最も重要なことは、下の図の 2 つの緑色の四角形で必要なことを完了することです。つまり、Phpfetcher が提供する Crawler クラスを継承するクラスを作成し、handlePage( という関数を実装する必要があります)。独自のクラスの $page )関数。 $page パラメータは、Phpfetcher の Page クラス オブジェクトです。最後に、基本的なフローチャートを示します。上記の内容は少し曖昧なので、例を見てみましょう。 2 簡単な例
****** 例 1: single_page.php ******たとえば、次の Web サイトのコンテンツをクロールしたいとします: http://news.qq.com/a/20140927/ 026557.htm ハイパーリンク、タイトル、ニュースの詳細、その他関心のあるコンテンツが多数あります。次の例を見てみましょう: export LANG=en_US.UTF-8
ログイン後にコピー
このスクリプトを「phpfetcher.php」および「Phpfetcher」フォルダと同じディレクトリに配置します (または、「phpfetcher.php」および「Phpfetcher」を PHP 環境のデフォルト インクルードに配置します) path) を指定してこのスクリプトを実行すると、得られる出力は次のとおりです。 <?phprequire_once('phpfetcher.php');class mycrawler extends Phpfetcher_Crawler_Default { public function handlePage($page) { //打印处当前页面的title $res = $page->sel('//title'); for ($i = 0; $i < count($res); ++$i) { echo $res[$i]->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' => 'http://news.qq.com/a/20140927/026557.htm', //起始网页 'link_rules' => array( /* * 所有在这里列出的正则规则,只要能匹配到超链接,那么那条爬虫就会爬到那条超链接 * Regex rules are listed here, the crawler will follow any hyperlinks once the regex matches */ ), //爬虫从开始页面算起,最多爬取的深度,设置为1表示只爬取起始页面 //Crawler's max following depth, 1 stands for only crawl the start page 'max_depth' => 1, ) , );//$crawler->setFetchJobs($arrJobs)->run(); 这一行的效果和下面两行的效果一样$crawler->setFetchJobs($arrJobs);$crawler->run();
ログイン後にコピー
クロールした Web ページのソース コードを確認すると、次の行のタイトル タグの内容が抽出されていることがわかります。 [root@reetsee demo]# php single_page.php 王思聪回应遭警方调查:带弓箭不犯法 我是绿箭侠_新闻_腾讯网
ログイン後にコピー
上記は最も単純です。例。 ****** 实例2:multi_page.php ******接下来就是另外一个简单的例子,例如说腾讯新闻的主页,上面有各种新闻,我们这次的目标是把腾讯新闻主页( http://news.qq.com)显示的部分新闻标题抓下来,直接先上例程: <?php//下面两行使得这个项目被下载下来后本文件能直接运行$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) { //打印处当前页面的第1个h1标题内荣(下标从0开始) $strFirstH1 = trim($page->sel('//h1', 0)->plaintext); if (!empty($strFirstH1)) { echo $page->sel('//h1', 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' => 'http://news.qq.com', //起始网页 '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' => 2, ) , );$crawler->setFetchJobs($arrJobs)->run(); //这一行的效果和下面两行的效果一样//$crawler->setFetchJobs($arrJobs);//$crawler->run();
ログイン後にコピー
相比于第1个例子,变化的地方有几个:首先这次我们增加了一条爬虫跟踪的规则“#news\.qq\.com/a/\d+/\d+\.htm$#”(注:PHP使用pcre正则表达式,可以到 PHP关于正则表达式的页面看一下),这是一个正则表达式,例如这种超链接“news.qq.com/a/12345678/00234.htm”那么爬虫就会跟踪;然后是我们把爬虫的最大跟踪深度设置为2,这样爬虫会跟踪1次起始页面上符合要求的超级链接;最后是我把原本的Dom选择从“//title”改为了“//h1”,意思就是抓取h1标签的内容而不是像之前那样抓取title标签,想知道这种Dom选择器的选择规则,需要了解一下 xpath。运行这个文件,能够看到大致效果如下: 这样第二个例子就结束了。暂时我就介绍这两个例子吧,Phpfetcher的源代码在这里: https://github.com/fanfank/phpfetcher把代码下载下来后,demo内的东西就可以直接运行了(当然你需要一个有curl和mb_string扩展的php,可以使用“php -m”命令来看一下你的PHP有没有装这两个扩展)。 3 后话
实际上这个phpfetcher目前还有很多问题,性能应该是比较差的,不过毕竟也是我写的第一个框架。另外是关于phpfetcher我有很多东西还没有提到,例如Page对象的一些设置,Crawler对象的设置等,主要是目前太过懒不想写文档,也不知道有没有必要写。我感觉这个框架还是蛮简单的,里面主要的函数我都做了详细的注释,欢迎阅读批评指正给建议!最后就是,如果你想写个爬虫,又想用PHP来写,不妨试一下phpfetcher。 祝大家国庆节快乐~!