2013-02-21 19 views
0

首先,應該提到,我有從商店的權限刮這些數據,所以合法性不是問題在這裏!從各家網上商店刮來的數據

我試圖從各種網上商店刮取信息,並將它們存儲在數據庫中,每小時一次。

範例網站:http://www.uptherestore.com/department/accessories

我已經嘗試了PHP scrape這樣的:

<?php 
$file_string = file_get_contents('http://www.uptherestore.com/department/accessories'); 
preg_match('/<div class="view view-uc-products view-id-uc_products view-display-id-page_3 storeview view-dom-id-1"> 
(.*)<\/div>/i', $file_string, $title); 
$title_out = $title[1];?> 
<p><strong>Accessories:</strong> <?php echo $title_out; ?></p> 

,但它給我之流的錯誤:

[14-Feb-2013 07:39:49 UTC] PHP Warning: DOMDocument::loadHTML() [<a href='domdocument.loadhtml'>domdocument.loadhtml</a>]: htmlCheckEncoding: encoder error in Entity, line: 7 in scraping.php on line 5 
從日誌文件中

完整的錯誤是這裏:http://pastebin.com/W2Bhkc0s

即使我管理從該網站刮,它只會返回結果的第一頁(當我需要所有頁面)。我目前的解決方案,這將是:

  • 使用jQuery檢查多少元素在尋呼機頁面
  • 運行一個循環,擦傷的底部在這些頁面中

但這是不理想的 - 正如你所看到的,頁面底部有1 ... 9頁,但如果你點擊「最後」,實際上有11頁的內容。總之,從這樣的網站上獲取數據的最佳方法是什麼?如上所述,商店所有者已經允許我使用他們的內容,但他們不是特別注重技術,不能讓我訪問他們的服務器/在服務器的.htaccess中放置任何代碼以允許來自我的網站的請求。

+0

那麼你需要在網絡客戶端或服務器上做到這一點? – 2013-02-21 01:03:51

+0

JS/jQuery不會幫助你,除非A.你從一個不受[同源策略](http://en.wikipedia.org/wiki/Same_origin_policy)或B的擴展運行它。另一個網站啓用了CORS,允許您發送請求。你可能會在後端做這件事。 – 2013-02-21 01:04:21

+0

你爲什麼使用ajax/javascript?這隻需要一個預定的工作(cron?)和一個php腳本。 – jeroen 2013-02-21 01:04:27

回答

0

首先,你的錯誤信息似乎不適合你的php代碼:php試圖用正則表達式解析html(錯誤!)並且錯誤消息表明您正在使用html解析器(DOMDocument)來解析html(正確的方式)。

你需要做的是以下幾點:

  1. 從產品頁面獲取HTML(像你現在這樣......);
  2. 檢查該頁面是否已在數據庫中解析(請參閱下一點);
  3. 使用html解析器從該頁面獲取所需信息並將所有內容存儲在數據庫中 - 包括產品頁面的鏈接或該頁面的另一個標識屬性以及某種時間戳,以便您知道什麼你已經完成了;
  4. 使用html解析器獲取html中的所有產品鏈接;
  5. 轉至1.找到您找到的每個產品鏈接。

您可能需要構建一些邏輯以確保腳本不會進入永無止境的循環或運行時間過長,但基本上它是這樣的;除非您真的想在瀏覽器中查看操作的結果,否則不需要使用瀏覽器/ javascript/ajax。

+0

這是一個很好的答案,有一點我還不確定 - 上面鏈接的「附件」頁面有11頁附件,但它並不總是有11頁(顯然,因爲更多的股票來了和去)所以我怎麼能抓住所有的數據,並圍繞它建立邏輯?我應該只是讓PHP試圖抓住第1頁,2,3 ...無窮大,當它打到空白頁面時假設所有東西都被加載了? – Jascination 2013-02-21 04:49:51

+0

@Jascination不,你應該使用一個html解析器並獲取所有鏈接(獲取頁面上的所有鏈接)或者某個類的所有鏈接(對於產品鏈接,取決於你正在抓取的頁面)然後你按照這些鏈接開始他全過程。 – jeroen 2013-02-21 12:33:25

0

使用cURL和正則表達式來過濾你所需要的。 Google cURL php.net網站會給你所需要的所有信息

+0

得到這個和運行,雖然我怎樣才能瀏覽多個頁面刮(見示例網站 - 有11頁,雖然我需要 – Jascination 2013-02-21 01:31:08

1

分頁很簡單,你只需找到'next'的鏈接,然後按照它,直到它不再存在。除非你對xpath感到滿意,否則需要一個好的html解析器庫(phpquery,simple-html-dom)。準備花大量的時間來找出正確的方法來做到這一點,最重要的是,不要聽任何告訴你使用正則表達式的人。