为了账号安全,请及时绑定邮箱和手机立即绑定

抓取网页内容

/ 猿问

抓取网页内容

PHP
幕布斯6054654 2019-11-14 10:34:53

我正在开发一个项目,为此,我想在后台抓取网站的内容并从抓取的网站中获取一些有限的内容。例如,在我的页面中,我具有“用户名”和“密码”字段,通过使用这些字段,我将访问我的邮件并抓取我的收件箱内容,并将其显示在我的页面中。


我通过单独使用javascript完成了上述操作。但是,当我单击登录按钮时,页面的URL(http://localhost/web/Login.html)更改为URL(http://mail.in.com/mails/inbox.php?nomail= ....)我被刮了。但是我在不更改URL的情况下取消了细节。


查看完整描述

3 回答

?
慕的地10843

绝对可以使用PHP Simple HTML DOM Parser。快速,简便,超级灵活。它基本上将整个HTML页面粘贴在一个对象中,然后您可以访问该对象中的任何元素。


像官方网站的示例一样,要获取Google主页上的所有链接:


// Create DOM from URL or file

$html = file_get_html('http://www.google.com/');


// Find all images 

foreach($html->find('img') as $element) 

       echo $element->src . '<br>';


// Find all links 

foreach($html->find('a') as $element) 

       echo $element->href . '<br>';


查看完整回答
反对 回复 2019-11-14
?
慕婉清6462132

HTTP请求

首先,您发出HTTP请求以获取页面内容。有几种方法可以做到这一点。


开张

发送HTTP请求的最基本方法是使用fopen。主要优点是您可以设置一次读取多少个字符,这在读取非常大的文件时很有用。不过,这并不是最简单的正确操作,除非您正在读取非常大的文件并且担心会遇到内存问题,否则不建议这样做。


$fp = fopen("http://www.4wtech.com/csp/web/Employee/Login.csp", "rb");

if (FALSE === $fp) {

    exit("Failed to open stream to URL");

}


$result = '';


while (!feof($fp)) {

    $result .= fread($fp, 8192);

}

fclose($fp);

echo $result;

file_get_contents

最简单的方法就是使用file_get_contents。如果与fopen大致相同,但是您有较少的选择。这里的主要优点是只需要一行代码。


$result = file_get_contents('http://www.4wtech.com/csp/web/Employee/Login.csp');

echo $result;

插座

如果您需要更多控制将哪些标头发送到服务器,则可以结合使用套接字fopen。


$fp = fsockopen("www.4wtech.com/csp/web/Employee/Login.csp", 80, $errno, $errstr, 30);

if (!$fp) {

    $result = "$errstr ($errno)<br />\n";

} else {

    $result = '';

    $out = "GET / HTTP/1.1\r\n";

    $out .= "Host: www.4wtech.com/csp/web/Employee/Login.csp\r\n";

    $out .= "Connection: Close\r\n\r\n";

    fwrite($fp, $out);

    while (!feof($fp)) {

        $result .= fgets($fp, 128);

    }

    fclose($fp);

}

echo $result;

另外,您也可以使用流。流类似于套接字,可以与fopen和结合使用file_get_contents。


$opts = array(

  'http'=>array(

    'method'=>"GET",

    'header'=>"Accept-language: en\r\n" .

              "Cookie: foo=bar\r\n"

  )

);


$context = stream_context_create($opts);


$result = file_get_contents('http://www.4wtech.com/csp/web/Employee/Login.csp', false, $context);

echo result;

卷曲

如果您的服务器支持cURL(通常支持),则建议使用cURL。使用cURL的一个主要优点是,它依赖于其他编程语言中常用的流行C库。它还提供了一种方便的方法,用于创建请求标头和自动解析响应标头,并在出现错误时使用简单的界面。


$defaults = array( 

    CURLOPT_URL, "http://www.4wtech.com/csp/web/Employee/Login.csp"

    CURLOPT_HEADER=> 0

);


$ch = curl_init(); 

curl_setopt_array($ch, ($options + $defaults)); 

if( ! $result = curl_exec($ch)) { 

    trigger_error(curl_error($ch)); 

curl_close($ch); 

echo $result; 

图书馆

另外,您可以使用许多PHP库之一。不过,我不建议使用库,因为它可能会过分杀伤。在大多数情况下,最好在后台使用cURL编写自己的HTTP类。


HTML解析

PHP提供了一种将任何HTML加载到的便捷方法DOMDocument。


$pagecontent = file_get_contents('http://www.4wtech.com/csp/web/Employee/Login.csp');

$doc = new DOMDocument();

$doc->loadHTML($pagecontent);

echo $doc->saveHTML();

不幸的是,PHP对HTML5的支持是有限的。如果您在尝试解析页面内容时遇到错误,请考虑使用第三方库。为此,我可以推荐Masterminds / html5-php。使用此库解析HTML文件与使用解析HTML文件非常相似DOMDocument。


use Masterminds\HTML5;


$pagecontent = file_get_contents('http://www.4wtech.com/csp/web/Employee/Login.csp');

$html5 = new HTML5();

$dom = $html5->loadHTML($html);

echo $html5->saveHTML($dom);

或者,您可以使用例如。我的库PHPPowertools / DOM-Query。它在后台使用Masterminds / html5-php的自定义版本,将HTML5字符串解析为a DomDocument和symfony / DomCrawler,以将CSS选择器转换为XPath选择器。DomDocument即使将一个对象传递给另一个对象,它也始终使用相同的属性,以确保良好的性能。


namespace PowerTools;


// Get file content

$pagecontent = file_get_contents( 'http://www.4wtech.com/csp/web/Employee/Login.csp' );


// Define your DOMCrawler based on file string

$H = new DOM_Query( $pagecontent );


// Define your DOMCrawler based on an existing DOM_Query instance

$H = new DOM_Query( $H->select('body') );


// Passing a string (CSS selector)

$s = $H->select( 'div.foo' );


// Passing an element object (DOM Element)

$s = $H->select( $documentBody );


// Passing a DOM Query object

$s = $H->select( $H->select('p + p') );


// Select the body tag

$body = $H->select('body');


// Combine different classes as one selector to get all site blocks

$siteblocks = $body->select('.site-header, .masthead, .site-body, .site-footer');


// Nest your methods just like you would with jQuery

$siteblocks->select('button')->add('span')->addClass('icon icon-printer');


// Use a lambda function to set the text of all site blocks

$siteblocks->text(function( $i, $val) {

    return $i . " - " . $val->attr('class');

});


// Append the following HTML to all site blocks

$siteblocks->append('<div class="site-center"></div>');


// Use a descendant selector to select the site's footer

$sitefooter = $body->select('.site-footer > .site-center');


// Set some attributes for the site's footer

$sitefooter->attr(array('id' => 'aweeesome', 'data-val' => 'see'));


// Use a lambda function to set the attributes of all site blocks

$siteblocks->attr('data-val', function( $i, $val) {

    return $i . " - " . $val->attr('class') . " - photo by Kelly Clark";

});


// Select the parent of the site's footer

$sitefooterparent = $sitefooter->parent();


// Remove the class of all i-tags within the site's footer's parent

$sitefooterparent->select('i')->removeAttr('class');


// Wrap the site's footer within two nex selectors

$sitefooter->wrap('<section><div class="footer-wrapper"></div></section>');


查看完整回答
反对 回复 2019-11-14
?
吃鸡游戏

您是否尝试过OutWit Hub?这是一个完整的抓取环境。您可以让它尝试猜测结构或开发自己的刮板。我真的建议您看看。它使我的生活变得简单得多。ZR


查看完整回答
反对 回复 2019-11-14

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信