採集目標
微信文章頁標題、內容、釋出時間、作者等資訊。
採集示例URL
https://mp.weixin.qq.com/s?src=11×tamp=1523173327&ver=803&signature=6PCxJ*3ojH2ZM8pm56Lquward0mQMwSkPnqCvYlrDkQmL2kAEjGcFJMj2lzvpHyuyT30lczb2Ld0npUWmp*2Gj7bPJY3SCWrpRKlXJA0p4eQWPpAzMPJVmxPcRV5TtLS&new=1
採集內容區圖例
分析內容選擇器
利用瀏覽器開發者工具來分析待採集的區域選擇器,這裡不做詳細講解,如有不明白請自行了解jQuery選擇器和CSS選擇器相關知識,如圖:
分析結果:
- 標題選擇器為:
.rich_media_title
- 釋出時間選擇器為:
#post-date
- 作者選擇器為:
#meta_content>.rich_media_meta:eq(2)
- 內容選擇器為:
.rich_media_content
選擇器寫法並不是唯一的,只要能選擇到內容選擇器隨便怎麼寫都可以。
程式碼
選擇器分析出來後程式碼就很容易實現了。
安裝QueryList
composer require jaeger/querylist
微信採集程式碼
<?php
require `vendor/autoload.php`;
use QLQueryList;
$url = `https://mp.weixin.qq.com/s?src=11×tamp=1523173327&ver=803&signature=6PCxJ*3ojH2ZM8pm56Lquward0mQMwSkPnqCvYlrDkQmL2kAEjGcFJMj2lzvpHyuyT30lczb2Ld0npUWmp*2Gj7bPJY3SCWrpRKlXJA0p4eQWPpAzMPJVmxPcRV5TtLS&new=1`;
// 採集規則
$rules = [
`title` => [`.rich_media_title`,`text`],
`date` => [`#post-date`,`text`],
`author` => [`#meta_content>.rich_media_meta:eq(2)`,`text`],
`content` => [`.rich_media_content`,`html`]
];
$data = QueryList::get($url)->rules($rules)->query()->getData();
print_r($data->all());
可以很輕鬆的就寫出採集程式碼出來,來看看執行結果:
Array
(
[0] => Array
(
[title] => âè´¸ææâæç«å°æªçèµ·ï¼ç¹ææ®å·²è¢«å大åªä½ç®è½°ä¸¨å¤åªè¯´
[date] => 2018-04-08
[author] => åè¯å
[content] => <section class="xmteditor" style="display:none;" data-tools="æ°åªä½ç®¡å®¶" data-label="powered by xmt.cn"></section><p style="white-space: normal;"><img class="" data-ratio="0.134375" data-s="300,640" src="https://segmentfault.comhttps://mmbiz.qpic.cn/mmbiz_png/IqicDAGdXNibs5wrrbmbVJW8HZB9Qv5ajtuR4C4kIQI43GjtM0ZDsDWzFSCZ7UcthQ1bbPqBSENxEdvRyzzaBavg/640=png" data-type="png" data-w="640" style="color: rgb(62, 62, 62);text-align: justify;line-height: 28.4444px;background-color: rgb(255, 255, 255);box-sizing: border-box !important;word-wrap: break-word !important;visibility: visible !important;width: auto !important;" width="auto"></p>
<p style="white-space: normal;"><br></p>
<p style="white-space: normal;"><span style="font-size: 15px;">èªç¹ææ®æèµ·âè´¸ææâ以æ¥ï¼ä¸æå©åå°±æ¬å¨å
¨çå¸åºç头ä¸ã</span></p>
<p style="white-space: normal;"><br></p>
<p style="white-space: normal;"><span style="font-size: 15px;">ä¸ç¾ä¸¤å½å
¬å¸çå¾ç¨ååè§æ¨¡è¶åè¶å¤§ï¼è¡å¸éè¡ï¼ä¸çç»æµçä¸ç¡®å®æ§ä¸æ¥ä¿±å¢ã</span></p>
<p style="white-space: normal;"><br></p>
......
)
和預期一樣正確採集到了內容,但是內容亂碼了。
解決亂碼
解決亂碼的方法有很多,QueryList內建的解決方案是使用encoding()
和removeHead()
這個方法,但經過嘗試發現目前的場景都沒有效果,所以我使用了另一種方法來解決微信亂碼問題,修改後的程式碼如下:
<?php
require `vendor/autoload.php`;
use JaegerGHttp;
use QLQueryList;
$url = `https://mp.weixin.qq.com/s?src=11×tamp=1523173327&ver=803&signature=6PCxJ*3ojH2ZM8pm56Lquward0mQMwSkPnqCvYlrDkQmL2kAEjGcFJMj2lzvpHyuyT30lczb2Ld0npUWmp*2Gj7bPJY3SCWrpRKlXJA0p4eQWPpAzMPJVmxPcRV5TtLS&new=1`;
// 採集規則
$rules = [
`title` => [`.rich_media_title`,`text`],
`date` => [`#post-date`,`text`],
`author` => [`#meta_content>.rich_media_meta:eq(2)`,`text`],
`content` => [`.rich_media_content`,`html`]
];
$html = GHttp::get($url);
// 直接匹配出body中的內容
preg_match(`/<body[^>]+>(.+)s+</body>/s`,$html,$arr);
$html = $arr[0];
$data = QueryList::html($html)->rules($rules)->query()->getData();
print_r($data->all());
執行結果:
Array
(
[0] => Array
(
[title] => “貿易戰”戰火尚未燃起,川普已被各大媒體炮轟丨外媒說
[date] => 2018-04-08
[author] => 雙語君
[content] => <section class="xmteditor" style="display:none;" data-tools="新媒體管家" data-label="powered by xmt.cn"></section><p style="white-space: normal;"><img class="" data-ratio="0.134375" data-s="300,640" src="https://segmentfault.comhttps://mmbiz.qpic.cn/mmbiz_png/IqicDAGdXNibs5wrrbmbVJW8HZB9Qv5ajtuR4C4kIQI43GjtM0ZDsDWzFSCZ7UcthQ1bbPqBSENxEdvRyzzaBavg/640=png" data-type="png" data-w="640" style="color: rgb(62, 62, 62);text-align: justify;line-height: 28.4444px;background-color: rgb(255, 255, 255);box-sizing: border-box !important;word-wrap: break-word !important;visibility: visible !important;width: auto !important;" width="auto"></p>
<p style="white-space: normal;"><br></p>
<p style="white-space: normal;"><span style="font-size: 15px;">自川普挑起“貿易戰”以來,一把利劍就懸在全球市場的頭上。</span></p>
<p style="white-space: normal;"><br></p>
<p style="white-space: normal;"><span style="font-size: 15px;">中美兩國公佈的徵稅商品規模越變越大,股市震盪,世界經濟的不確定性與日俱增。</span></p>
<p style="white-space: normal;"><br></p>
....
)