#php #curl #web-scraping #hyperlink #scrape
#php #curl #очистка веб-страниц #гиперссылка #очистить
Вопрос:
Я пытаюсь извлечь все ссылки из заданного списка или URL-адресов в текстовый файл и сохранить извлеченные ссылки в другом текстовом файле. Я пытаюсь использовать приведенный ниже скрипт, который изначально предназначался для извлечения электронных писем:
Я изменил часть извлечения электронной почты
// preg_match_all('/([w .]*w @[w .]*w [w -w ]*.w )/is', $sPageContent, $aResults);
для извлечения ссылок, подобных этому:
preg_match_all("/a[s] [^>]*?href[s]?=[s"'] (.*?)["'] .*?>([^<] |.*?)?</a>/is", $sPageContent, $aResults);
Вот полный код:
class getEmails
{
const EMAIL_STORAGE_FILE = 'links.txt';
public function __construct($sFilePath)
{
$aUrls = $this->getUrls($sFilePath);
foreach($aUrls as $sUrl) {
$rPage = $this->getContents($sUrl);
$this->getAndSaveEmails($rPage);
}
$this->removeDuplicate();
}
protected function getAndSaveEmails($sPageContent)
{
// preg_match_all('/([w .]*w @[w .]*w [w -w ]*.w )/is', $sPageContent, $aResults);
preg_match_all("/a[s] [^>]*?href[s]?=[s"'] (.*?)["'] .*?>([^<] |.*?)?</a>/is", $sPageContent, $aResults);
foreach($aResults[1] as $sCurrentEmail) {
file_put_contents(self::EMAIL_STORAGE_FILE, $sCurrentEmail . "rn", FILE_APPEND);
}
}
protected function getContents($sUrl)
{
if (function_exists('curl_init')) {
$rCh = curl_init();
curl_setopt($rCh, CURLOPT_URL, $sUrl);
curl_setopt($rCh, CURLOPT_HEADER, 0);
curl_setopt($rCh, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($rCh, CURLOPT_FOLLOWLOCATION, 1);
$mResult = curl_exec($rCh);
curl_close($rCh);
unset($rCh);
return $mResult;
} else {
return file_get_contents($sUrl);
}
}
protected function getUrls($sFilePath)
{
return file($sFilePath);
}
protected function removeDuplicate()
{
$aEmails = file(self::EMAIL_STORAGE_FILE);
$aEmails = array_unique($aEmails);
file_put_contents(self::EMAIL_STORAGE_FILE, implode('', $aEmails));
}
}
new getEmails('sitemap_index.txt');
Проблема, с которой я сталкиваюсь, заключается в том, что предполагается, что он получает все ссылки из списка URL-адресов, но он сканирует только первую ссылку и игнорирует остальные. У меня есть 30 ссылок, из которых я хочу извлечь, как я могу заставить приведенный выше код работать?
Комментарии:
1. У вас есть пример строки?
Ответ №1:
вы должны использовать trim() для URL-адреса..
попробуйте добавить обрезку в свой код
foreach($aUrls as $sUrl) {
$sUrl=trim($sUrl); //this
$rPage = $this->getContents($sUrl);
$this->getAndSaveEmails($rPage);
}