Python爬虫实现网页信息抓取功能示例【URL与正则模块】

329次阅读  |  发布于5年以前

本文实例讲述了Python爬虫实现网页信息抓取功能。分享给大家供大家参考,具体如下:

首先实现关于网页解析、读取等操作我们要用到以下几个模块


    import urllib
    import urllib2
    import re

我们可以尝试一下用readline方法读某个网站,比如说百度


    def test():
      f=urllib.urlopen('http://www.baidu.com')
      while True:
       firstLine=f.readline()
       print firstLine

下面我们说一下如何实现网页信息的抓取,比如说百度贴吧

我们大概要做几件事情:

首先获取网页及其代码,这里我们要实现多页,即其网址会改变,我们传递一个页数


      def getPage(self,pageNum):
         try:
            url=self.baseURL+self.seeLZ+'&pn;='+str(pageNum)
            #创建request对象
            request=urllib2.Request(url)
            response=urllib2.urlopen(request)
            #print 'URL:'+url
            return response.read()
         except Exception,e:
            print e

之后我们要获取小说内容,这里咱们分为标题和正文。标题每页都有,所以我们获取一次就好了。

我们可以点击某网站,按f12查看他的标题标签是如何构造的,比如说百度贴吧是…………</p> <p>那我们就匹配<code>reg=re.compile(r'<title>(.*?)。')</code>来抓取这个信息</p> <p>标题抓取完我们要开始抓去正文了,我们知道正文会有很多段,所以我们要循环的去抓取整个items,这里我们注意</p> <p>对于文本的读写操作,一定要放在循环外。同时加入一些去除超链接、<br>等机制</p> <p>最后,我们在主函数调用即可</p> <p>完整代码:</p> <pre><code> # -*- coding:utf-8 -*- import sys reload(sys) sys.setdefaultencoding('utf8') #爬虫之网页信息抓取 #需要的函数方法:urllib,re,urllib2 import urllib import urllib2 import re #测试函数->读取 #def test(): # f=urllib.urlopen('http://www.baidu.com') # while True: # firstLine=f.readline() # print firstLine #针对于百度贴吧获取前十页楼主小说文本内容 class BDTB: def __init__(self,baseUrl,seeLZ): #成员变量 self.baseURL=baseUrl self.seeLZ='?see_lz='+str(seeLZ) #获取该页帖子的代码 def getPage(self,pageNum): try: url=self.baseURL+self.seeLZ+'&pn;='+str(pageNum) #创建request对象 request=urllib2.Request(url) response=urllib2.urlopen(request) #print 'URL:'+url return response.read() except Exception,e: print e #匹配标题 def Title(self): html=self.getPage(1) #compile提高正则匹配效率 reg=re.compile(r'<title>(.*?)。') #返回list列表 items=re.findall(reg,html) f=open('output.txt','w+') item=('').join(items) f.write('\t\t\t\t\t'+item.encode('gbk')) f.close() #匹配正文 def Text(self,pageNum): html=self.getPage(pageNum) #compile提高正则匹配效率 reg=re.compile(r'"d_post_content j_d_post_content ">(.*?)</div>') #返回list列表 items=re.findall(reg,html) f=open('output.txt','a+') #[1:]切片,第一个元素不需要,去掉。 for i in items[1:]: #超链接去除 removeAddr=re.compile('<a.*?>|</a>') #用""替换 i=re.sub(removeAddr,"",i) #<br>去除 i=i.replace('<br>','') f.write('\n\n'+i.encode('gbk')) f.close() #调用入口 baseURL='http://tieba.baidu.com/p/4638659116' bdtb=BDTB(baseURL,1) print '爬虫正在启动....'.encode('gbk') #多页 bdtb.Title() print '抓取标题完毕!'.encode('gbk') for i in range(1,11): print '正在抓取第%02d页'.encode('gbk')%i bdtb.Text(i) print '抓取正文完毕!'.encode('gbk') </code></pre> <p><strong>PS:这里再为大家提供2款非常方便的正则表达式工具供大家参考使用:</strong></p> <p><strong>JavaScript正则表达式在线测试工具:<br /> </strong><a href="http://tools.jb51.net/regex/javascript">http://tools.jb51.net/regex/javascript</a></p> <p><strong>正则表达式在线生成工具:<br /> </strong><a href="http://tools.jb51.net/regex/create_reg">http://tools.jb51.net/regex/create_reg</a></p> <p>更多关于Python相关内容可查看本站专题:《<a href="http://www.jb51.net/Special/667.htm">Python正则表达式用法总结</a>》、《<a href="http://www.jb51.net/Special/663.htm">Python数据结构与算法教程</a>》、《<a href="http://www.jb51.net/Special/648.htm">Python Socket编程技巧总结</a>》、《<a href="http://www.jb51.net/Special/642.htm">Python函数使用技巧总结</a>》、《<a href="http://www.jb51.net/Special/636.htm">Python字符串操作技巧汇总</a>》、《<a href="http://www.jb51.net/Special/520.htm">Python入门与进阶经典教程</a>》及《<a href="http://www.jb51.net/Special/516.htm">Python文件与目录操作技巧汇总</a>》</p> <p>希望本文所述对大家Python程序设计有所帮助。</p> </div> </div> <div class="blockgap"></div> </div> <div class="blockgap"></div> <script> let url = window.location.href; function onWxReadyForShareArticle(){ let obj = { title: decodeURI(articleTitle), desc: decodeURI(articleSummary), link: window.location.href, imgUrl: "https://oss-cn-hangzhou.aliyuncs.com/codingsky/cdn/img/2024-02-01/89778da8387748299364fa73ad54f9a9", // 分享图标 success: function () { //console.log("update share success"); } }; wx.updateAppMessageShareData(obj); } function wechatShareArticle(){ //let data = {url:"https://hellobit.com.cn/doc/2024/1/29/1039.html"}; let data = { url : window.location.href }; postJsonV2(getUserToken(),"/api/tbs/v1/wxsdk/jssdk", data, function(code, data){ if(code != 200){ //console.log("get sign error,", code, data); return; } if(data.code != 0){ //console.log("get sign error, biz error ", data); return; } let appid = data.data.appid; let noncestr = data.data.noncestr; let timestamp = data.data.timestamp; let signature = data.data.signature; // get nonceStr, signature wx.config({ debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: appid, // 必填,公众号的唯一标识 timestamp: timestamp, // 必填,生成签名的时间戳 nonceStr: noncestr, // 必填,生成签名的随机串 signature: signature,// 必填,签名 jsApiList: ['updateAppMessageShareData'] // 必填,需要使用的JS接口列表 }); wx.ready(function(){ onWxReadyForShareArticle(); }); wx.error(function(res){ if(console.error){ //console.error(res); } }); }); } </script> <!-- footer --> <div class="mcontainer" style="margin-top: 10px;margin-bottom:0px;padding-top:10px;padding-bottom:10px;background-color:rgb(48, 60, 66);color:#fff;"> <div class="row" style="text-align:center;"> <p style="margin:0px;padding:0px;" class="mfont_1">Copyright© 2013-2020</p> <p style="margin:0px;padding:0px;" class="mfont_1">All Rights Reserved <a href="https://beian.miit.gov.cn">京ICP备2023019179号-8</a></p> </div> </div> <script> window.onload = function(){ hljs.highlightAll(); if(typeof wechatShareArticle === "function"){ wechatShareArticle(); } }; document.addEventListener('DOMContentLoaded', () => { // Get all "navbar-burger" elements const $navbarBurgers = Array.prototype.slice.call(document.querySelectorAll('.navbar-burger'), 0); // Add a click event on each of them $navbarBurgers.forEach( el => { el.addEventListener('click', () => { // Get the target from the "data-target" attribute const target = el.dataset.target; const $target = document.getElementById(target); // Toggle the "is-active" class on both the "navbar-burger" and the "navbar-menu" el.classList.toggle('is-active'); $target.classList.toggle('is-active'); }); }); }); </script> <!-- baidu union --> <script type="text/javascript" src="//cpro.baidustatic.com/cpro/ui/c.js" async="async" defer="defer" ></script> <!-- Global site tag (gtag.js) - Google Analytics <script async src="https://www.googletagmanager.com/gtag/js?id=UA-108792812-1"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'UA-108792812-1'); </script> --> <script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?713c92a31aa12d55b910e2065c7cda9d"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> <script> /*var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?e066867ae5a323a82641e57db7e7c914"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })();*/ </script> <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> <!-- <script type="text/javascript" src="http://tajs.qq.com/stats?sId=66376258" charset="UTF-8"></script> --> <!-- Google tag (gtag.js) --> <script async src="https://www.googletagmanager.com/gtag/js?id=G-2VE3RBLF6N"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-2VE3RBLF6N'); </script> </body> </html>