Python爬虫抓取网页信息实战:URL处理与正则表达式应用

宋时安
宋时安
发布时间:2026-10-13 | 2人浏览过
原创

本文详细介绍如何使用Python的urllib、urllib2及re模块实现网页信息抓取。通过解析百度贴吧示例,演示如何构建请求、处理多页URL、利用正则表达式提取标题与正文,并包含文件读写及异常处理的完整代码实现,适合Python初学者参考。

本文通过具体实例讲解如何利用Python编写爬虫程序来抓取网页信息,内容可供读者参考学习。

在进行网页解析和数据读取之前,需要引入Python中相关的标准库模块。

import urllib
import urllib2
import re

我们可以尝试使用readline方法读取指定网站的内容,例如以百度为例进行演示。

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

接下来介绍如何实现网页信息的抓取,这里以百度贴吧的数据抓取为例进行说明。

实现该功能主要包含以下几个步骤:

首先需要获取网页源代码,由于涉及多页数据,网址会随页数变化,因此需要传递页数参数来动态生成URL。

  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)查看目标网站的标题标签结构,例如百度贴吧的标题通常位于<title>标签内。

因此,我们可以匹配reg=re.compile(r'<title>(.*?)。')这一正则表达式来提取标题信息。

标题抓取完成后,开始抓取正文。由于正文包含多个段落,需要循环遍历所有条目进行抓取,在此过程中需注意以下几点:

文件的读写操作必须放在循环外部执行。同时,需要添加机制去除超链接、<br>标签等无关HTML代码。

最后,在主函数中调用上述定义的方法即可完成整个抓取流程。

完整的实现代码如下:

# -*- 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')

此外,推荐以下两款正则表达式辅助工具供参考:

JavaScript正则表达式在线测试工具: http://tools.jb51.net/regex/javascript

正则表达式在线生成工具: http://tools.jb51.net/regex/create_reg

如需了解更多Python相关知识,可查阅本站相关专题,包括《Python正则表达式用法总结》、《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》以及《Python文件与目录操作技巧汇总》。

希望本文的内容能对大家的Python编程实践有所帮助。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表