从外部网站提取PHP数据,然后写入数据库
只是想知道怎么做。假设在外部网站上有一个简单的HTML表,您有一个与该HTML表结构相同的数据库。我知道你可以使用从外部网站提取PHP数据,然后写入数据库,php,file-get-contents,data-extraction,Php,File Get Contents,Data Extraction,只是想知道怎么做。假设在外部网站上有一个简单的HTML表,您有一个与该HTML表结构相同的数据库。我知道你可以使用file\u get\u contents抓取整个网页 从这里开始,我假设您将删除文件中的所有内容,除了标记之间的内容,从而隔离包含您希望写入的数据的表 下一步是什么?假设您的数据库表结构与HTML表的结构相匹配,那么将表数据写入数据库的最简单方法是什么?您可以使用例如,您可以使用一个超级简单的类来解析HTML 仅使用DOMDocument和cURL <?php $scrap
file\u get\u contents
抓取整个网页
从这里开始,我假设您将删除文件中的所有内容,除了
标记之间的内容,从而隔离包含您希望写入的数据的表
下一步是什么?假设您的数据库表结构与HTML表的结构相匹配,那么将表数据写入数据库的最简单方法是什么?您可以使用例如,您可以使用一个超级简单的类来解析HTML
仅使用DOMDocument和cURL
<?php
$scraper = new DOMScraper();
//example couldent think of a site with an example table
$scraper->setSite('http://cherone.co.uk/forum')->setSource();
//all tables on page
echo '<table>'.$scraper->getInnerHTML('table').'</table>';
//get only tables with id="some_table_id" or any attribute match eg class="somthing"
echo '<table>'.$scraper->getInnerHTML('table','id=some_table_id').'</table>';
//get all tables contents but return only nodeValue/text
echo '<table>'.$scraper->getInnerHTML('table','id=some_table_id',true).'</table>';
/**
* Generic DOM scapper using DOMDocument and cURL
*/
Class DOMScraper extends DOMDocument{
public $site;
private $source;
private $dom;
function __construct(){
libxml_use_internal_errors(true);
$this->preserveWhiteSpace = false;
$this->strictErrorChecking = false;
}
function setSite($site){
$this->site = $site;
return $this;
}
function setSource(){
if(empty($this->site))return 'Error: Missing $this->site, use setSite() first';
$this->source = $this->get_data($this->site);
return $this;
}
function getInnerHTML($tag, $id=null, $nodeValue = false){
if(empty($this->site))return 'Error: Missing $this->source, use setSource() first';
$this->loadHTML($this->source);
$tmp = $this->getElementsByTagName($tag);
$ret = null;
foreach ($tmp as $v){
if($id !== null){
$attr = explode('=',$id);
if($v->getAttribute($attr[0])==$attr[1]){
if($nodeValue == true){
$ret .= trim($v->nodeValue);
}else{
$ret .= $this->innerHTML($v);
}
}
}else{
if($nodeValue == true){
$ret .= trim($v->nodeValue);
}else{
$ret .= $this->innerHTML($v);
}
}
}
return $ret;
}
function innerHTML($dom){
$ret = "";
$nodes = $dom->childNodes;
foreach($nodes as $v){
$tmp = new DOMDocument();
$tmp->appendChild($tmp->importNode($v, true));
$ret .= trim($tmp->saveHTML());
}
return $ret;
}
function get_data($url){
if(function_exists('curl_init')){
$ch = curl_init();
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}else{
return file_get_contents($url);
}
}
}
?>
也许这会引起人们的兴趣(希望如此lol),一个解析html的超级简单类
仅使用DOMDocument和cURL
<?php
$scraper = new DOMScraper();
//example couldent think of a site with an example table
$scraper->setSite('http://cherone.co.uk/forum')->setSource();
//all tables on page
echo '<table>'.$scraper->getInnerHTML('table').'</table>';
//get only tables with id="some_table_id" or any attribute match eg class="somthing"
echo '<table>'.$scraper->getInnerHTML('table','id=some_table_id').'</table>';
//get all tables contents but return only nodeValue/text
echo '<table>'.$scraper->getInnerHTML('table','id=some_table_id',true).'</table>';
/**
* Generic DOM scapper using DOMDocument and cURL
*/
Class DOMScraper extends DOMDocument{
public $site;
private $source;
private $dom;
function __construct(){
libxml_use_internal_errors(true);
$this->preserveWhiteSpace = false;
$this->strictErrorChecking = false;
}
function setSite($site){
$this->site = $site;
return $this;
}
function setSource(){
if(empty($this->site))return 'Error: Missing $this->site, use setSite() first';
$this->source = $this->get_data($this->site);
return $this;
}
function getInnerHTML($tag, $id=null, $nodeValue = false){
if(empty($this->site))return 'Error: Missing $this->source, use setSource() first';
$this->loadHTML($this->source);
$tmp = $this->getElementsByTagName($tag);
$ret = null;
foreach ($tmp as $v){
if($id !== null){
$attr = explode('=',$id);
if($v->getAttribute($attr[0])==$attr[1]){
if($nodeValue == true){
$ret .= trim($v->nodeValue);
}else{
$ret .= $this->innerHTML($v);
}
}
}else{
if($nodeValue == true){
$ret .= trim($v->nodeValue);
}else{
$ret .= $this->innerHTML($v);
}
}
}
return $ret;
}
function innerHTML($dom){
$ret = "";
$nodes = $dom->childNodes;
foreach($nodes as $v){
$tmp = new DOMDocument();
$tmp->appendChild($tmp->importNode($v, true));
$ret .= trim($tmp->saveHTML());
}
return $ret;
}
function get_data($url){
if(function_exists('curl_init')){
$ch = curl_init();
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}else{
return file_get_contents($url);
}
}
}
?>
每当我尝试使用DOM时,都会收到500个内部服务器错误…知道为什么吗?检查错误日志,可能是因为没有安装curls。我会更新代码我已经确认安装了curl。启用错误并得到以下结果:致命错误:在第27行的/var/www/html/test/index.php中找不到类“DOMDocument”。使用yum install php xml
Test if installedecho(class_exists(“DOMDocument”))修复了此问题?“已安装”:“未安装”代码>如果它没有安装它或要求您的主机安装。我弄明白了,我现在正在我的网站上显示该表。然而,我如何将内容写入数据库?每当我尝试使用DOM时,我都会收到500个内部服务器错误…知道为什么吗?检查错误日志,可能是因为没有安装curls。我会更新代码我已经确认安装了curl。启用错误并得到以下结果:致命错误:在第27行的/var/www/html/test/index.php中找不到类“DOMDocument”。使用yum install php xml
Test if installedecho(class_exists(“DOMDocument”))修复了此问题?“已安装”:“未安装”代码>如果它没有安装它或要求您的主机安装。我弄明白了,我现在正在我的网站上显示该表。但是,如何将内容写入数据库?