दिलचस्प पोस्ट
होस्ट 'xxx.xx.xxx.xxx' को इस MySQL सर्वर से कनेक्ट करने की अनुमति नहीं है त्रुटि: सी स्टैक उपयोग सीमा के बहुत करीब है UINavigationBar पारदर्शी बनाओ क्या सभी पायथन कक्षाएं ऑब्जेक्ट को बढ़ाती हैं? नल योग्य प्रकार एक नल योग्य प्रकार नहीं है? लंबे समय से सी / सी ++ वेबसाइस के लिए jQuery कॉल रिटर्न "कोई ट्रांसपोर्ट" त्रुटि नहीं है संसाधनों से एक UIWebView में जावास्क्रिप्ट को लोड करना बिल्ड प्लान की गणना नहीं की जा सकी: प्लगइन org.apache.maven.plugins: maven-resources-plugin: 2.5 या इसके निर्भरता में से कोई भी हल नहीं किया जा सका नियंत्रण के उलटाव <निर्भरता इंजेक्शन क्या मूल्य से पारित किया गया एरे या जावा में संदर्भ द्वारा पारित किया गया है? PHP में मिनटों में समय अंतर कैसे प्राप्त करें ज्वैक @ ओवरराइड एनोटेशन पर क्यों असफल है बाइनरी फ़ाइल पढ़ना और लिखना कॉपी-और-स्वैप मुहावरे क्या है?

मैं PHP में एक साधारण क्रॉलर कैसे बनाऊं?

मेरे पास लिंक का एक गुच्छा वाला वेब पेज है मैं एक स्क्रिप्ट लिखना चाहता हूं जो स्थानीय फाइल में उन लिंक्स में मौजूद सभी डेटा को हटा देगा।

क्या किसी ने PHP के साथ किया है? सामान्य दिशानिर्देश और गौचस एक उत्तर के रूप में पर्याप्त होंगे।

वेब के समाधान से एकत्रित समाधान "मैं PHP में एक साधारण क्रॉलर कैसे बनाऊं?"

भावहीन। Regexes के साथ HTML को पार्स नहीं करें

यहां एक टॉम द्वारा प्रेरित डोम संस्करण है:

<?php function crawl_page($url, $depth = 5) { static $seen = array(); if (isset($seen[$url]) || $depth === 0) { return; } $seen[$url] = true; $dom = new DOMDocument('1.0'); @$dom->loadHTMLFile($url); $anchors = $dom->getElementsByTagName('a'); foreach ($anchors as $element) { $href = $element->getAttribute('href'); if (0 !== strpos($href, 'http')) { $path = '/' . ltrim($href, '/'); if (extension_loaded('http')) { $href = http_build_url($url, array('path' => $path)); } else { $parts = parse_url($url); $href = $parts['scheme'] . '://'; if (isset($parts['user']) && isset($parts['pass'])) { $href .= $parts['user'] . ':' . $parts['pass'] . '@'; } $href .= $parts['host']; if (isset($parts['port'])) { $href .= ':' . $parts['port']; } $href .= $path; } } crawl_page($href, $depth - 1); } echo "URL:",$url,PHP_EOL,"CONTENT:",PHP_EOL,$dom->saveHTML(),PHP_EOL,PHP_EOL; } crawl_page("http://hobodave.com", 2); 

संपादित करें: मैं Tatu के संस्करण से कुछ बग तय किए (अब रिश्तेदार यूआरएल के साथ काम करता है)

संपादित करें: मैंने एक नई कार्यक्षमता को जोड़ा जो उसे दो बार समान URL का अनुसरण करने से रोकता है

संपादित करें: आउटपुट को अब एसटीडीओओटी में गूंज करना ताकि आप उसे इच्छित फ़ाइल में रीडायरेक्ट कर सकें

संपादित करें: एक बग फिक्स्ड जॉर्ज ने अपने जवाब में बताया। संबंधित यूआरएल अब यूआरएल पथ के अंत में संलग्न नहीं होंगे, लेकिन इसे ओवरराइट करें। इसके लिए जॉर्ज को धन्यवाद ध्यान दें कि जॉर्ज का जवाब किसी भी के लिए नहीं है: https, उपयोगकर्ता, पास या पोर्ट यदि आपके पास एचपी पीईसीएल विस्तार भरा हुआ है, तो यह काफी सरलता से http_build_url का उपयोग किया जाता है। अन्यथा, मुझे parse_url का उपयोग करके मैन्युअल रूप से गोंद करना होगा धन्यवाद फिर से जॉर्ज

उपर्युक्त उदाहरण / उत्तर के आधार पर यहां मेरा कार्यान्वयन

  1. यह कक्षा आधारित है
  2. कर्ल का उपयोग करता है
  3. HTTP एथ का समर्थन करें
  4. मूल डोमेन से संबंधित नहीं यूआरएल को छोड़ें
  5. प्रत्येक पेज के लिए एचटीपी हैडर रिस्पांस कोड लौटें
  6. प्रत्येक पृष्ठ के लिए समय लौटें

क्रॉल श्रेणी:

 class crawler { protected $_url; protected $_depth; protected $_host; protected $_useHttpAuth = false; protected $_user; protected $_pass; protected $_seen = array(); protected $_filter = array(); public function __construct($url, $depth = 5) { $this->_url = $url; $this->_depth = $depth; $parse = parse_url($url); $this->_host = $parse['host']; } protected function _processAnchors($content, $url, $depth) { $dom = new DOMDocument('1.0'); @$dom->loadHTML($content); $anchors = $dom->getElementsByTagName('a'); foreach ($anchors as $element) { $href = $element->getAttribute('href'); if (0 !== strpos($href, 'http')) { $path = '/' . ltrim($href, '/'); if (extension_loaded('http')) { $href = http_build_url($url, array('path' => $path)); } else { $parts = parse_url($url); $href = $parts['scheme'] . '://'; if (isset($parts['user']) && isset($parts['pass'])) { $href .= $parts['user'] . ':' . $parts['pass'] . '@'; } $href .= $parts['host']; if (isset($parts['port'])) { $href .= ':' . $parts['port']; } $href .= $path; } } // Crawl only link that belongs to the start domain $this->crawl_page($href, $depth - 1); } } protected function _getContent($url) { $handle = curl_init($url); if ($this->_useHttpAuth) { curl_setopt($handle, CURLOPT_HTTPAUTH, CURLAUTH_ANY); curl_setopt($handle, CURLOPT_USERPWD, $this->_user . ":" . $this->_pass); } // follows 302 redirect, creates problem wiht authentication // curl_setopt($handle, CURLOPT_FOLLOWLOCATION, TRUE); // return the content curl_setopt($handle, CURLOPT_RETURNTRANSFER, TRUE); /* Get the HTML or whatever is linked in $url. */ $response = curl_exec($handle); // response total time $time = curl_getinfo($handle, CURLINFO_TOTAL_TIME); /* Check for 404 (file not found). */ $httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE); curl_close($handle); return array($response, $httpCode, $time); } protected function _printResult($url, $depth, $httpcode, $time) { ob_end_flush(); $currentDepth = $this->_depth - $depth; $count = count($this->_seen); echo "N::$count,CODE::$httpcode,TIME::$time,DEPTH::$currentDepth URL::$url <br>"; ob_start(); flush(); } protected function isValid($url, $depth) { if (strpos($url, $this->_host) === false || $depth === 0 || isset($this->_seen[$url]) ) { return false; } foreach ($this->_filter as $excludePath) { if (strpos($url, $excludePath) !== false) { return false; } } return true; } public function crawl_page($url, $depth) { if (!$this->isValid($url, $depth)) { return; } // add to the seen URL $this->_seen[$url] = true; // get Content and Return Code list($content, $httpcode, $time) = $this->_getContent($url); // print Result for current Page $this->_printResult($url, $depth, $httpcode, $time); // process subPages $this->_processAnchors($content, $url, $depth); } public function setHttpAuth($user, $pass) { $this->_useHttpAuth = true; $this->_user = $user; $this->_pass = $pass; } public function addFilterPath($path) { $this->_filter[] = $path; } public function run() { $this->crawl_page($this->_url, $this->_depth); } } 

उपयोग:

 // USAGE $startURL = 'http://YOUR_URL/'; $depth = 6; $username = 'YOURUSER'; $password = 'YOURPASS'; $crawler = new crawler($startURL, $depth); $crawler->setHttpAuth($username, $password); // Exclude path with the following structure to be processed $crawler->addFilterPath('customer/account/login/referer'); $crawler->run(); 

PHP क्रॉलर देखें

http://sourceforge.net/projects/php-crawler/

देखें कि क्या यह मदद करता है

इसका सरलतम रूप में:

 function crawl_page($url, $depth = 5) { if($depth > 0) { $html = file_get_contents($url); preg_match_all('~<a.*?href="(.*?)".*?>~', $html, $matches); foreach($matches[1] as $newurl) { crawl_page($newurl, $depth - 1); } file_put_contents('results.txt', $newurl."\n\n".$html."\n\n", FILE_APPEND); } } crawl_page('http://www.domain.com/index.php', 5); 

उस फ़ंक्शंस को एक पृष्ठ से सामग्री मिल जाएगी, फिर सभी मिलाए गए लिंक क्रॉल करें और सामग्री को 'results.txt' पर सहेजें। फ़ंक्शंस एक दूसरा पैरामीटर, गहराई स्वीकार करता है, जो परिभाषित करता है कि लिंक का कब तक जाना चाहिए। अगर आप दिए गए पृष्ठ से केवल लिंक्स को पार्स करना चाहते हैं, तो 1 पास करें।

इसके लिए PHP का उपयोग क्यों करें, जब आप wget का प्रयोग कर सकते हैं, जैसे

 wget -r -l 1 http://www.example.com 

सामग्री को कैसे पार्स करने के लिए, HTML के विश्लेषण और उदाहरणों के लिए खोज फ़ंक्शन का उपयोग करने के लिए श्रेष्ठ तरीके देखें। एचटीएमएल को पार्स करने के लिए कई बार उत्तर दिए गए हैं।

एचबोडवे कोड में कुछ छोटे बदलावों के साथ, यहां एक कोडनिपेट है, जो आप पृष्ठों को क्रॉल करने के लिए उपयोग कर सकते हैं। यह आपके सर्वर में सक्षम होने के लिए कर्ल एक्सटेंशन की आवश्यकता है।

 <?php //set_time_limit (0); function crawl_page($url, $depth = 5){ $seen = array(); if(($depth == 0) or (in_array($url, $seen))){ return; } $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); $result = curl_exec ($ch); curl_close ($ch); if( $result ){ $stripped_file = strip_tags($result, "<a>"); preg_match_all("/<a[\s]+[^>]*?href[\s]?=[\s\"\']+"."(.*?)[\"\']+.*?>"."([^<]+|.*?)?<\/a>/", $stripped_file, $matches, PREG_SET_ORDER ); foreach($matches as $match){ $href = $match[1]; if (0 !== strpos($href, 'http')) { $path = '/' . ltrim($href, '/'); if (extension_loaded('http')) { $href = http_build_url($href , array('path' => $path)); } else { $parts = parse_url($href); $href = $parts['scheme'] . '://'; if (isset($parts['user']) && isset($parts['pass'])) { $href .= $parts['user'] . ':' . $parts['pass'] . '@'; } $href .= $parts['host']; if (isset($parts['port'])) { $href .= ':' . $parts['port']; } $href .= $path; } } crawl_page($href, $depth - 1); } } echo "Crawled {$href}"; } crawl_page("http://www.sitename.com/",3); ?> 

मैंने इस क्रॉलर स्क्रिप्ट ट्यूटोरियल में इस ट्यूटोरियल को समझाया है

जैसा कि उल्लेख किया गया है, वहाँ क्रॉलर चौखटे सभी को अनुकूलित करने के लिए तैयार हैं, लेकिन अगर आप जो भी कर रहे हैं वह उतना आसान है जितना आपने उल्लेख किया है, आप इसे स्क्रैच से आसानी से बना सकते हैं

लिंक स्क्रैप करना: http://www.phpro.org/examples/Get-Links-With-DOM.html

डंपिंग परिणाम एक फ़ाइल में: http://www.tizag.com/phpT/filewrite.php

होबोशेव आप बहुत करीबी थे केवल एक चीज जो मैंने बदल दी है वह अगर बयान के भीतर है तो यह देखने के लिए कि क्या पाया गया एंकर टैग की href विशेषता 'http' के साथ शुरू होती है $ Url वेरिएबल जोड़ने के बजाय जो उस पृष्ठ को समाहित किया गया था जिसमें आपको पारित किया गया था, उसे पहले मेजबान पर पट्टी करना चाहिए जो parse_url php फ़ंक्शन का उपयोग करके किया जा सकता है।

 <?php function crawl_page($url, $depth = 5) { static $seen = array(); if (isset($seen[$url]) || $depth === 0) { return; } $seen[$url] = true; $dom = new DOMDocument('1.0'); @$dom->loadHTMLFile($url); $anchors = $dom->getElementsByTagName('a'); foreach ($anchors as $element) { $href = $element->getAttribute('href'); if (0 !== strpos($href, 'http')) { /* this is where I changed hobodave's code */ $host = "http://".parse_url($url,PHP_URL_HOST); $href = $host. '/' . ltrim($href, '/'); } crawl_page($href, $depth - 1); } echo "New Page:<br /> "; echo "URL:",$url,PHP_EOL,"<br />","CONTENT:",PHP_EOL,$dom->saveHTML(),PHP_EOL,PHP_EOL," <br /><br />"; } crawl_page("http://hobodave.com/", 5); ?> 

सवाल यह है कि कैसे एजेक्स कॉल स्रोत कोड पाने के लिए? यह क्रॉल नहीं है, उदाहरण के लिए, इस तरह से लिंक पर चित्रों को क्रॉल कैसे करें? http://www.tiendeo.nl/Catalogi/amsterdam/16558&subori=web_sliders&buscar=Boni&sw=1366

PHPCrawl एक बहुत अच्छा और अच्छी तरह से सोचा हुआ क्रॉलर ढांचा है।

मैंने @ hobodave कोड का इस्तेमाल किया, इस छोटे से बदलाव के साथ ही समान यूआरएल के सभी टुकड़े के रूपों को पुनः क्रॉल करने से रोकने के लिए:

 <?php function crawl_page($url, $depth = 5) { $parts = parse_url($url); if(array_key_exists('fragment', $parts)){ unset($parts['fragment']); $url = http_build_url($parts); } static $seen = array(); ... 

उसके बाद आप $parts = parse_url($url); भी मिटा सकते हैं $parts = parse_url($url); लूप के भीतर की रेखा

आप यह कोशिश कर सकते हैं कि यह आपके लिए मदद हो सकती है

 $search_string = 'american golf News: Fowler beats stellar field in Abu Dhabi'; $html = file_get_contents(url of the site); $dom = new DOMDocument; $titalDom = new DOMDocument; $tmpTitalDom = new DOMDocument; libxml_use_internal_errors(true); @$dom->loadHTML($html); libxml_use_internal_errors(false); $xpath = new DOMXPath($dom); $videos = $xpath->query('//div[@class="primary-content"]'); foreach ($videos as $key => $video) { $newdomaindom = new DOMDocument; $newnode = $newdomaindom->importNode($video, true); $newdomaindom->appendChild($newnode); @$titalDom->loadHTML($newdomaindom->saveHTML()); $xpath1 = new DOMXPath($titalDom); $titles = $xpath1->query('//div[@class="listingcontainer"]/div[@class="list"]'); if(strcmp(preg_replace('!\s+!',' ', $titles->item(0)->nodeValue),$search_string)){ $tmpNode = $tmpTitalDom->importNode($video, true); $tmpTitalDom->appendChild($tmpNode); break; } } echo $tmpTitalDom->saveHTML();