php抓取网页标签(开发一个爬虫界面,理清下思路。(图))
优采云 发布时间: 2022-01-04 20:19php抓取网页标签(开发一个爬虫界面,理清下思路。(图))
要开发爬虫,首先要知道爬虫是干什么的。我想去不同的网站找一个特定的关键字文章,并得到它的链接,这样我就可以快速阅读了。
根据个人习惯,我先source gaodai#ma#com 搞@@代~& 先写一个界面来理清思路。
1、与众不同网站。然后我们需要一个url输入框。
2、查找特定关键字的文章。然后我们需要一个文章标题输入框。
3、获取文章的链接。然后我们需要一个用于搜索结果的显示容器。
文章URL抓取 文章标题 网站URL抓取 文章URL
只需上传代码并添加一些自己的样式调整,界面就完成了:
那么接下来就是功能的实现了。我用PHP写的。第一步是获取网站的html代码。获取html代码的方法有很多。我就不一一介绍了,这里用的是curl。获取它,传入网站url获取html代码:
private function get_html($url){ $ch = curl_init(); $timeout = 10; curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_ENCODING, 'gzip'); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36'); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); $html = curl_exec($ch); return $html; }
虽然拿到了html代码,但是很快就会遇到一个问题,就是编码问题,这可能会让你下一步匹配不成功。这里我们将获取到的html内容统一转换为utf8编码:
$coding = mb_detect_encoding($html); if ($coding != "UTF-8" || !mb_check_encoding($html, "UTF-8")) $html = mb_convert_encoding($html, 'utf-8', 'GBK,UTF-8,ASCII');
获取网站的html,得到文章的url,接下来就是匹配网页下的所有a标签。需要使用正则表达式。经过多次测试,我们终于得到了一个比较靠谱的谱的正则表达式,不管a标签下的结构有多复杂,只要是标签就不要放过:(最关键的一步)
$pattern = '|]*>(.*)|isU'; preg_match_all($pattern, $html, $matches);
匹配的结果在$matches中,大概是这样的多维元素组:
array(2) { [0]=> array(*) { [0]=> string(*) "完整的a标签" . . . } [1]=> array(*) { [0]=> string(*) "与上面下标相对应的a标签中的内容" } }
只要你能拿到这些数据,其他的一切都可以被操纵。你可以遍历这个元素组,找到你想要的a标签,然后得到a标签对应的属性。你可以随心所欲。下面为大家推荐一个类,方便操作标签:
$dom = new DOMDocument(); @$dom->loadHTML($a);//$a是上面得到的一些a标签 $url = new DOMXPath($dom); $hrefs = $url->evaluate('//a'); for ($i = 0; $i length; $i++) { $href = $hrefs->item($i); $url = $href->getAttribute('href'); //这里获取a标签的href属性 }
当然,这只是一种方式,你也可以通过正则表达式匹配你想要的信息,用数据玩出新花样。
get和match得到你想要的结果,下一步当然是送回前端展示,写接口,然后在前端用js去获取数据,用jquery来动态添加内容以显示它:
var website_url = '你的接口地址'; $.getJSON(website_url,function(data){ if(data){ if(data.text == ''){ $('#article_url').html('<p>暂无该文章链接'); return; } var string = ''; var list = data.text; for (var j in list) { var content = list[j].url_content; for (var i in content) { if (content[i].title != '') { string += '' + '[' + list[j].website.web_name + ']' + '' + content[i].title + '' + ''; } } } $('#article_url').html(string); }); </p>
最终渲染: