Python(五)编程小实例

抓取网页信息,并生成txt文件内容!

Python抓取网页技能——Python抓取网页就是我们常看见的网络爬虫,我们今天所要用到的就是我们Python中自带的模块,用这些模块将网页内容爬取下来,并生成一个txt文件。

(一)实例思路:

我们所需要用到的模块:

urllib2—urllib2是Python的一个获取URLs(Uniform Resource Locators)的组件。他以urlopen函数的形式提供了一个非常简单的接口,这是具有利用不同协议获取URLs的能力,他同样提供了一个比较复杂的接口来处理一般情况,例如:基础验证,cookies,代理和其他。

 import urllib2

 response=urllib2.urlopen('http://tieba.baidu.com/p/4923127538?see_lz=1')

 html = response.read()

re—Python的re模块就是我们开始想知道的大名鼎鼎的正则表达式,正则表达式(可以称为REs,regex,regex pattens)是一个小巧的,高度专业化的编程语言,它内嵌于Python开发语言中,可通过re模块使用。正则表达式的pattern可以被编译成一系列的字节码,然后用C编写的引擎执行。

 import re

 m = re.search ('ab+','asdfabbbbb')

 print m.group()
 Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:53:40) [MSC v.1500 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>>
========================= RESTART: H:\Python27\1.py =========================
abbbbb
>>>

re—正则表达式我们本节就不去重点讲了,基础同学们可以去看看正则表达式的详细内容:http://www.runoob.com/python/python-reg-expressions.html。在我的博客中有详细的正则表达式(字符)详解!

那么接下来我们开始我们的小实例——爬取百度贴吧小说!

首先我们要明确一下我们项目的思路:

                # -*- coding: utf-8 -*-
                #模块:urllib2, re。
                #正则表达式:------想要的内容 findall(正则表达式,源码)
                #百度贴吧爬取内容:1.获取源码
                # 2.解析超链接
                # 3.获取标题
                # 4.获取内容
                # 5.发送命令,调用主函数

我们在进行项目时要将整体突出程序化,那么我们开始第一步的实施调取Python中自带的模块:

 # -*- coding: utf-8 -*-

 import urllib2
import re

将我们所需的模块插入后,我们开始项目的实施:

 class BDTB:
baseUrl = 'http://tieba.baidu.com/p/4923127538?see_lz=1'
#获取源代码
def getPage(self,pageNum):
try:
url = self.baseUrl + str(pageNum)
request = urllib2.Request(url)
response = urllib2.urlopen(request).read()
#print response
return response
except Exception,e:
print e

上述代码是我们要获取的网页源码信息,因为我们需要多方面的爬取我们想要的内容,所以我们创建一个类来实现其中所有函数的功能。

 baseUrl = 'http://tieba.baidu.com/p/4923127538?see_lz=1'

baseUrl就是我们想要获取的网址!

  def getPage(self,pageNum):
try:
url = self.baseUrl + str(pageNum)
request = urllib2.Request(url)
response = urllib2.urlopen(request).read()
#print response
return response
except Exception,e:
print e

网址获取到了之后,我们要定义一个函数,来获取我们想要获取的网页信息,在函数中我们定义了两个变量,这两个变量是我们正则匹配时要需要用到的!

我们在其中所用到的:

 try:
语句1
语句2
.
.
语句N
except Exception e:
print e

这样的语句就是判断我们的程序有没有错误,看我们是否获取到我们想要的信息,如果没有获取到就给编译器返回一个e值!

接下来我们要使用我们的正则表达式来获取其中我们想要的内容了!

 def Title(self,pageNum):
html = self.getPage(pageNum)
reg = re.compile(r'title="这(.*?)"')
items = re.findall(reg,html)
print items[0]
for item in items:
f = open('text1.txt','w')
f.write('标题'+'\t'+item)
f.close()
return items

这一段定义的函数是将我们所获取到的网页信息,匹配到我们想要的位置,然后截取下来!并且将网页匹配的信息生成一个text1.txt的文本文件,‘w’就是写入信息!

  reg = re.compile(r'title="这(.*?)"')

这里我们就用到了re模块中的包含一个重要函数是compile(pattern [, flags]) ,该函数根据包含的正则表达式的字符串创建模式对象

参数描述:

pattern匹配的正则表达式string要匹配的字符串。

flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

 >>> import re
>>> repp = 'a,b,,,,c d'
>>> reOB = re.compile('[, ]+')
>>> reOB.split(some_text)
['a', 'b', 'c', 'd']

接下来我们再看另一个re模块中的函数python 正则表达式 re findall 方法能够以列表的形式返回能匹配的子串。

re.findall(pattern, string[, flags]):

 items = re.findall(reg,html)

我们来看一下这个函数的实例:

 >>> import re
>>> p = re.compile(r'\d+')
>>> print p.findall('one1two2three3four4')
['', '', '', '']
>>>

将我们我所要查询到的数字以列表的形式输出出来!

 for item in items:
f = open('text1.txt','w')
f.write('标题'+'\t'+item)
f.close()

在这段代码中,我们用到了Python文件写入,这个地方就是生成我们txt文本文件的地方,同学门可以找找详细的资料来研究一下,这里是对于想保存长期看的同学有很大的帮助哦!在这里我就不详细讲解了!

我们继续我们的项目:

 def Text(self,pageNum):
html = self.getPage(pageNum)
reg = re.compile(r'class="d_post_content j_d_post_content "> (.*?)</div><br> ',re.S)
req = re.findall(reg,html)
#print req[0]
for i in req:
removeAddr = re.compile('<a.*?>|</a>')
removeaddr = re.compile('<img.*?>')
removeadd = re.compile('http.*?.html')
i = re.sub(removeAddr,'',i)
i = re.sub(removeaddr,'',i)
i = re.sub(removeadd,'',i)
i = i.replace('<br>','')
print i
f = open('text1.txt','a')
f.write('\n\n'+i)
f.close()

此处的代码就是我们要完成我们真正所需要的内容了,这里是完整的将我们所需要的小说爬取到手的,这里面用的正则匹配就是我们的贪婪匹配模式了!

  def Text(self,pageNum):
html = self.getPage(pageNum)
reg = re.compile(r'class="d_post_content j_d_post_content "> (.*?)</div><br> ',re.S)
req = re.findall(reg,html)

那么这一部分还是我们在上一匹配到的内容中,将class标签中的全部文字内容提取出来,但是其中我们会看到包含了很多img http等很多小标签,所以我们还需要将这些内容利用正则匹配中的sub函数将他们装换为空“ ”!

 for i in req:
removeAddr = re.compile('<a.*?>|</a>')
removeaddr = re.compile('<img.*?>')
removeadd = re.compile('http.*?.html')
i = re.sub(removeAddr,'',i)
i = re.sub(removeaddr,'',i)
i = re.sub(removeadd,'',i)
i = i.replace('<br>','')
print i

这一串代码就是我们想要把其中像re.compile('<a.*?>|</a>')这样的内容获取到,然后再利用我们的sub函数将这些获取到的内容装换为“ ”空白!然后在输出到 i 这个列表中!最后将 i 输出!

我们在结尾处需要做一个程序运行无误的判断,那么我们就需要用到在编译器中给我们返回我们程序运行的开始!文件的生成结果:

 bdtb = BDTB()
print '爬虫正在启动.....'
try:
for i in range(1,4):
print '正在爬取第%s小说' %(i)
bdtb.Title(1)
bdtb.Text(1)
except Exception,e:
print e

在这里我们要调用我们所创建的类,在这一个try中我们看到了一个range的函数,这个函数就是如果你需要一个数值序列,使用内建函数range() 会很方便,它产生等差级数序列。利用这个函数的意思就是我们要获取小说的全部内容!最后我们生成一个text1.txt的文件

最后附上我们实现的整体代码:

 # -*- coding: utf-8 -*-

 import urllib2
import re class BDTB:
baseUrl = 'http://tieba.baidu.com/p/4923127538?see_lz=1'
#获取源代码
def getPage(self,pageNum):
try:
url = self.baseUrl + str(pageNum)
request = urllib2.Request(url)
response = urllib2.urlopen(request).read()
#print response
return response
except Exception,e:
print e
#匹配内容
def Title(self,pageNum):
html = self.getPage(pageNum)
reg = re.compile(r'title="这(.*?)"')
items = re.findall(reg,html)
print items[0]
for item in items:
f = open('text1.txt','w')
f.write('标题'+'\t'+item)
f.close()
return items
def Text(self,pageNum):
html = self.getPage(pageNum)
reg = re.compile(r'class="d_post_content j_d_post_content "> (.*?)</div><br> ',re.S)
req = re.findall(reg,html)
#print req[0]
for i in req:
removeAddr = re.compile('<a.*?>|</a>')
removeaddr = re.compile('<img.*?>')
removeadd = re.compile('http.*?.html')
i = re.sub(removeAddr,'',i)
i = re.sub(removeaddr,'',i)
i = re.sub(removeadd,'',i)
i = i.replace('<br>','')
print i
f = open('text1.txt','a')
f.write('\n\n'+i)
f.close() bdtb = BDTB()
print '爬虫正在启动。。。。'
try:
for i in range(1,4):
print '正在爬取第%s小说' %(i)
bdtb.Title(1)
bdtb.Text(1)
except Exception,e:
print e

运行后,在你的Pyhton文件中会生成一个text1.txt的文本文件,你就可以打开查看你想看的小说了哦!加油吧,同学们!

Python(五)编程小实例的更多相关文章

  1. Python - 面向对象编程 - 小实战(1)

    题目 设计一个类Person,生成若干实例,在终端输出如下信息 小明,10岁,男,上山去砍柴 小明,10岁,男,开车去东北 小明,10岁,男,最爱大保健 老李,90岁,男,上山去砍柴 老李,90岁,男 ...

  2. Python - 面向对象编程 - 小实战(2)

    需求 小明和小美都爱跑步 小明体重 75 公斤 小美体重 45 公斤 每次跑步会减肥 0.5 公斤 每次吃东西体重增加 1 公斤 需求分析 小明.小美都是一个具体的对象,他们都是人,所以应该抽象成人类 ...

  3. python数据库编程小应用

    python DB api 数据库连接对象connection数据库交互对象cursor数据库异常类exceptions 流程:开始创建connection获取cursor执行查询.执行命令.获取数据 ...

  4. python 面向对象编程 - 小游戏

    面向对象写的小游戏 欢迎玩耍 class Omnicience: camp = 'Omniscience' def __init__(self, name, atk=100, hp=1000, mp= ...

  5. Python - 面向对象编程 - 小实战(3)

    需求 房子(House)有户型.总面积.家具名称列表:新房子没有任何的家具 家具(HouseItem)有名字.占地面积 席梦思(bed) 占地 4 平米 衣柜(bed) 占地 2 平米 餐桌(bed) ...

  6. (python)编程小练习

    1.将一串字符串反向输出,如将"abcd"变成“dcba” str1="abcd" print str1[::-1] 2.判断是否为回文——判断用户输入的字符串 ...

  7. Python进度条小实例

    代码理解: 函数view_bar(num,total) num是一个随即数,total是总数( num / total ) * 的int类型可以计算百分比 '\r%d%%%s' % (rate_num ...

  8. python面向对象编程小程序- 选课系统

    选课系统 花了一晚上写的,可能还存在不足 1.程序框架 2.文件夹建立 D:/选课系统 |___api | |___common_api.py |___bil | |___common.py |___ ...

  9. Python做单元测试小实例

    import sys#先定义一个函数,这个函数是计算高*宽,并返回计算结果def test(hight,width):    return hight*width #这是程序启动函数入口,给要测试的函 ...

随机推荐

  1. CAGradientLayer颜色渐变器

    使用CAGradientLayer可以实现颜色的渐变, 我们先看下头文件 @interface CAGradientLayer : CALayer @property(nullable, copy) ...

  2. JSTL标签之c:foreach,c:if标签小结

    <c:forEach>标签用于通用数据循环,它有以下属性 属 性 描 述 是否必须 缺省值 items 进行循环的项目 否 无 begin 开始条件 否 0 end 结束条件 否 集合中的 ...

  3. 为苹果ATS和微信小程序搭建 Nginx + HTTPS 服务

    昨天测试开发微信小程序,才发现微信也要求用HTTPS加密数据,想来是由于之前苹果的ATS审核政策的缘故吧,微信想在苹果上开放小程序必然也只能要求开发者必须使用HTTPS了,于是在服务器上测试安装Ngi ...

  4. SDWebImage源码解读之干货大总结

    这是我认为的一些重要的知识点进行的总结. 1.图片编码简介 大家都知道,数据在网络中是以二进制流的形式传播的,那么我们该如何把那些1和0解析成我们需要的数据格式呢? 说的简单一点就是,当文件都使用二进 ...

  5. requireJS的初步掌握

    前一段时间,因为一些事吧这个习惯落下了,现在争取重新捡起来. 最近开始自学requireJS,为了更好的掌握,所以写出一个自我理解的博客供参考. 分割线------------------------ ...

  6. ubuntu下安装pdo和pdo_mysql扩展

    ubuntu下安装好LAMP后默认情况没有安装mysql_pdo扩展,以下是安装步聚 1 安装pdo sudo pecl install pdo 出现以下错误是说明pdo已经加入了php的默认安装,不 ...

  7. HTML5中的WebSocket

    在HTML5规范中,我最喜欢的Web技术就是正迅速变得流行的WebSocket API.WebSocket提供了一个受欢迎的技术,以替代我们过去几年一直在用的Ajax技术.这个新的API提供了一个方法 ...

  8. Java中boolean类型到底占用多少字节

    虽然 Java 虚拟机定义了 boolean 这种数据类型,但是只对它提供了非常有限的支持.在 Java 虚拟机中没有任何供 boolean 值专用的字节码指令,在 Java 语言之中涉及到 bool ...

  9. ArcGIS制图技巧系列(2)地形渲染

    ArcGIS制图技巧系列(2)地形渲染 by 李远祥 DEM数据是常见的地形数据,在GIS常规的制图中,DEM一直扮演着增强效果.由于带有高程值,DEM在很多情况下都在三维中显示,但这里主要介绍的是在 ...

  10. 特殊的string类型

    1.前言 string是属于引用类型的,这个大家都知道吧?但是平常在使用的过程中,发现它还是拥有一些值类型的特征的,这到底是为什么呢? 原因就是.Net考虑到假如大量的操作string对象的时候,大量 ...