西北亮 發表於 2020-1-19 17:31:00

php 爬虫采集

<p>概述</p>
<p>现在爬虫技术算是一个普遍的技术了,各个语言的爬虫百家争鸣,但是根据笔者自己的感觉还是python是主流。爬虫涉及到太多的东西,笔者并不是专业的爬虫工程师,只不过个人兴趣分享一下。由于笔者是php工作,所以就使用php来进行简单爬虫。不过我的方法应该是很通用的,我相信java,C#等肯定有类似的函数,然后做法其实都一样了。</p>
<p>技术准备<br>看懂这段代码你需要对php的正则表达式函数以及正则表达式有一定的理解。</p>
<p>代码&nbsp; &nbsp;<span style="font-size: 14pt"><strong>注意实际代码就这么多</strong></span></p>
<p>&lt;?php</p>
<p>//<strong>这个是你网页正则匹配出来的字符串</strong></p>
<p>$str = '&lt;div class="title"&gt;<br>          &lt;h3&gt;&lt;span&gt;[小组] &lt;/span&gt;&amp;nbsp;&lt;a href="链接内容1" target="_blank"&gt;标签内容1&lt;/a&gt;&lt;/h3&gt;<br>          &lt;div class="info"&gt;<br>              237059 成员<br>          &lt;/div&gt;<br>          &lt;/div&gt;<br>          &lt;div class="title"&gt;<br>          &lt;h3&gt;&lt;span&gt;[小组] &lt;/span&gt;&amp;nbsp;&lt;a href="链接内容2" target="_blank"&gt;标签内容2&lt;/a&gt;&lt;/h3&gt;<br>          &lt;div class="info"&gt;<br>              237059 成员<br>          &lt;/div&gt;<br>          &lt;/div&gt;';</p>
<p>/<strong>/这个是正则的输出结果</strong></p>
<p><em id="__mceDel">preg_match_all('/&lt;div class="title"&gt;[\s\S]*?&lt;h3&gt;[\s\S]*?&lt;a href="(.*?)"[\s\S]*?&gt;(.*?)&lt;\/a&gt;/',$str,$match);</em></p>
<p>print_r($match);//根据打印的结果很明白了吧</p>
<p><span style="font-size: 14pt">//<strong>这个方法就是抓取网页内容的方法了可以吧需要抓取的页面传进去,然后正则匹配内容哦</strong></span></p>
<p>function getUrlContent($url){//通过url获取html内容</p>
<p>   $ch = curl_init();<br>      curl_setopt($ch,CURLOPT_URL,$url);<br>      curl_setopt($ch,CURLOPT_USERAGENT,"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1 )");<br>      curl_setopt($ch,CURLOPT_HEADER,1);<br>      curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);<br>      $output = curl_exec($ch);<br>      curl_close($ch);<br>      return $output;<br> }<br>?&gt;</p>
<p><span style="font-size: 18pt"><strong>到这里就可以匹配你想要的数据了,如果还是不懂,就继续往下瞅瞅</strong></span><br>流程图</p>
<p><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<img src="https://img2018.cnblogs.com/i-beta/1441117/202001/1441117-20200119172709888-2043653189.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><br>简单的爬虫,特殊字符处理就不进行了,保证插入数据库不出错就行了</p>
<p>思路<br>首先getUrlContent($url)函数,只需要穿一个url地址就行了,当然了因为各个网站都有反扒机制,不过笔者的这个函数并不是万能的,但是在豆瓣测试过,其他网站大家自行测试了。<br>任何网站都可以理解为一个很长的字符串,如果对html有研究无非就是:<br>    &lt;html&gt;</p>
<p>  &lt;head&gt;XXX&lt;/head&gt;<br>      &lt;body&gt;XXX&lt;/body&gt;<br>    &lt;/html&gt;<br>我们需要的只是将body标签里的东西拿出来,笔者模拟了一段body里的代码</p>
<p>&lt;html&gt;<br>&nbsp; &nbsp;&lt;head&gt;XXX&lt;/head&gt;<br>&nbsp; &nbsp;&lt;body&gt;<br>&nbsp; &nbsp;&lt;div class="title"&gt;<br>&nbsp; &nbsp;&lt;h3&gt;&lt;span&gt;[小组] &lt;/span&gt;&amp;nbsp;&lt;a href="链接内容1" target="_blank"&gt;标签内容1&lt;/a&gt;&lt;/h3&gt;<br>&nbsp; &nbsp;&lt;div class="info"&gt;<br>&nbsp; &nbsp;237059 成员<br>&nbsp; &nbsp;&lt;/div&gt;<br>&nbsp; &nbsp;&lt;/div&gt;<br>&nbsp; &nbsp;&lt;div class="title"&gt;<br>&nbsp; &nbsp;&lt;h3&gt;&lt;span&gt;[小组] &lt;/span&gt;&amp;nbsp;&lt;a href="链接内容2" target="_blank"&gt;标签内容2&lt;/a&gt;&lt;/h3&gt;<br>&nbsp; &nbsp;&lt;div class="info"&gt;<br>&nbsp; &nbsp;237059 成员<br>&nbsp; &nbsp;&lt;/div&gt;<br>&nbsp; &nbsp;&lt;/div&gt;<br>&nbsp; &nbsp;&lt;/body&gt;<br>&lt;/html&gt;<br>对于这段代码,可以理解为一个很长的字符串</p>
<p>$str ='&lt;html&gt;<br>&nbsp; &nbsp; &nbsp;&lt;head&gt;XXX&lt;/head&gt;<br>        &lt;body&gt;<br>                  &lt;div class="title"&gt;<br>                        &lt;h3&gt;&lt;span&gt;[小组] &lt;/span&gt;&amp;nbsp;&lt;a href="链接内容1" target="_blank"&gt;标签内容1&lt;/a&gt;&lt;/h3&gt;<br>                        &lt;div class="info"&gt;<br>                            237059 成员<br>                        &lt;/div&gt;<br>                        &lt;/div&gt;<br>                        &lt;div class="title"&gt;<br>                        &lt;h3&gt;&lt;span&gt;[小组] &lt;/span&gt;&amp;nbsp;&lt;a href="链接内容2" target="_blank"&gt;标签内容2&lt;/a&gt;&lt;/h3&gt;<br>                        &lt;div class="info"&gt;<br>                            237059 成员<br>                        &lt;/div&gt;<br>                     &lt;/div&gt;<br>           &lt;/body&gt;<br>    &lt;/html&gt;';<br><br>对这段字符串,只需要进行正则匹配拿出你想要的,假如需要a标签里的href与内容</p>
<p>preg_match_all('/&lt;div class="title"&gt;[\s\S]*?&lt;h3&gt;[\s\S]*?&lt;a href="(.*?)"[\s\S]*?&gt;(.*?)&lt;\/a&gt;/',<br>$str,$match);</p>
<p><br>然后如果你不认识这段正则表达式还有preg_match_all函数,这里笔者就简单说下了,[\s\S]*?代表懒惰匹配任意字符,因为标签之间会用空格符换行符,这里又出现新问题什么叫懒惰匹配,简单来说就是匹配最少的内容。(.*?)代表非空字符,加括号的原因简单来说就是括号里的内容是你想要的,前面的[\s\S]*?匹配到的是一堆特殊符号,并没有什么作用,你不用把特殊符号记录下来,所以不加括号。</p>
<p>最后打印结果,也就是$match数组。</p>
<p>Array<br>(<br>    =&gt; Array<br>      (<br>               =&gt; &lt;div class="title"&gt;<br>          &lt;h3&gt;&lt;span&gt;[小组] &lt;/span&gt;&amp;nbsp;&lt;a href="链接内容1" target="_blank"&gt;标签内容1&lt;/a&gt;<br>               =&gt; &lt;div class="title"&gt;<br>          &lt;h3&gt;&lt;span&gt;[小组] &lt;/span&gt;&amp;nbsp;&lt;a href="链接内容2" target="_blank"&gt;标签内容2&lt;/a&gt;<br>      )</p>
<p>    =&gt; Array<br>      (<br>               =&gt; 链接内容1<br>               =&gt; 链接内容2<br>      )</p>
<p>    =&gt; Array<br>      (<br>               =&gt; 标签内容1<br>               =&gt; 标签内容2<br>      )</p>
<p>)<br>根据这个数组,需要什么自己遍历数组,然后拼装sql语句,插入到自己的数据库中即可。但是插入过程中可能会有一些单引号双引号捣乱,所以你用str_replace()把他们替换掉,或者加转义符号。</p>
<p>总结<br>只是针对php进行的简单爬虫,不过爬虫的思路我相信很多种语言都用得到。不过很多网站的内容是通过js返回的,或者需要登陆才能获取到数据,这些比较高级的部分,有兴趣的推荐自学python爬虫。<br><br></p>
<p>本文转载自https://blog.csdn.net/qq_35370923/article/details/82901220</p><br><br>
来源:https://www.cnblogs.com/bkhdd/p/12214798.html
頁: [1]
查看完整版本: php 爬虫采集