Python(五)编程小实例

简介: Python(五)编程小实例     抓取网页信息,并生成txt文件内容! Python抓取网页技能——Python抓取网页就是我们常看见的网络爬虫,我们今天所要用到的就是我们Python中自带的模块,用这些模块将网页内容爬取下来,并生成一个txt文件。

Python(五)编程小实例

 

 

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

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

 

(一)实例思路:

我们所需要用到的模块:

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

 

1 import urllib2
2 
3 response=urllib2.urlopen('http://tieba.baidu.com/p/4923127538?see_lz=1')
4 
5 html = response.read()

 

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

1 import re
2 
3 m = re.search ('ab+','asdfabbbbb')
4 
5 print m.group()
1 Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:53:40) [MSC v.1500 64 bit (AMD64)] on win32
2 Type "copyright", "credits" or "license()" for more information.
3 >>> 
4 ========================= RESTART: H:\Python27\1.py =========================
5 abbbbb
6 >>> 

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

 

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

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

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

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

1 # -*- coding: utf-8 -*-
2 
3 import urllib2
4 import re

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

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

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

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

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

1  def getPage(self,pageNum):
2         try:
3             url = self.baseUrl + str(pageNum)
4             request = urllib2.Request(url)
5             response = urllib2.urlopen(request).read()
6             #print response
7             return response
8         except Exception,e:
9             print e

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

我们在其中所用到的:

1 try:
2     语句1
3     语句2
4     .
5     .
6     语句N
7 except Exception e:
8     print e

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

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

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

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

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

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

参数描述:

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

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

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

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

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

1 items = re.findall(reg,html)

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

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

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

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

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

我们继续我们的项目:

 1 def Text(self,pageNum):
 2         html = self.getPage(pageNum)
 3         reg = re.compile(r'class="d_post_content j_d_post_content ">            (.*?)</div><br> ',re.S)
 4         req = re.findall(reg,html)
 5         #print req[0]
 6         for i in req:
 7             removeAddr = re.compile('<a.*?>|</a>')
 8             removeaddr = re.compile('<img.*?>')
 9             removeadd = re.compile('http.*?.html')
10             i = re.sub(removeAddr,'',i)
11             i = re.sub(removeaddr,'',i)
12             i = re.sub(removeadd,'',i)
13             i = i.replace('<br>','')
14             print i
15             f = open('text1.txt','a')
16             f.write('\n\n'+i)
17             f.close()

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

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

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

1 for i in req:
2             removeAddr = re.compile('<a.*?>|</a>')
3             removeaddr = re.compile('<img.*?>')
4             removeadd = re.compile('http.*?.html')
5             i = re.sub(removeAddr,'',i)
6             i = re.sub(removeaddr,'',i)
7             i = re.sub(removeadd,'',i)
8             i = i.replace('<br>','')
9             print i

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

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

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

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

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

 1 # -*- coding: utf-8 -*-
 2 
 3 import urllib2
 4 import re
 5 
 6 class BDTB:
 7     baseUrl = 'http://tieba.baidu.com/p/4923127538?see_lz=1'
 8     #获取源代码
 9     def getPage(self,pageNum):
10         try:
11             url = self.baseUrl + str(pageNum)
12             request = urllib2.Request(url)
13             response = urllib2.urlopen(request).read()
14             #print response
15             return response
16         except Exception,e:
17             print e
18     #匹配内容
19     def Title(self,pageNum):
20         html = self.getPage(pageNum)
21         reg = re.compile(r'title="这(.*?)"')
22         items = re.findall(reg,html)
23         print items[0]
24         for item in items:
25             f = open('text1.txt','w')
26             f.write('标题'+'\t'+item)
27             f.close()
28         return items
29     def Text(self,pageNum):
30         html = self.getPage(pageNum)
31         reg = re.compile(r'class="d_post_content j_d_post_content ">            (.*?)</div><br> ',re.S)
32         req = re.findall(reg,html)
33         #print req[0]
34         for i in req:
35             removeAddr = re.compile('<a.*?>|</a>')
36             removeaddr = re.compile('<img.*?>')
37             removeadd = re.compile('http.*?.html')
38             i = re.sub(removeAddr,'',i)
39             i = re.sub(removeaddr,'',i)
40             i = re.sub(removeadd,'',i)
41             i = i.replace('<br>','')
42             print i
43             f = open('text1.txt','a')
44             f.write('\n\n'+i)
45             f.close()
46 
47 
48 
49 bdtb = BDTB()
50 print '爬虫正在启动。。。。'
51 try:
52     for i in range(1,4):
53         print '正在爬取第%s小说' %(i)
54         bdtb.Title(1)
55         bdtb.Text(1)
56 except Exception,e:
57     print e

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

Welcome to Python world! I have a contract in this world! How about you?
相关文章
|
14天前
|
安全 数据处理 开发者
Python中的多线程编程:从入门到精通
本文将深入探讨Python中的多线程编程,包括其基本原理、应用场景、实现方法以及常见问题和解决方案。通过本文的学习,读者将对Python多线程编程有一个全面的认识,能够在实际项目中灵活运用。
|
8天前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
1天前
|
存储 人工智能 数据挖掘
从零起步,揭秘Python编程如何带你从新手村迈向高手殿堂
【10月更文挑战第32天】Python,诞生于1991年的高级编程语言,以其简洁明了的语法成为众多程序员的入门首选。从基础的变量类型、控制流到列表、字典等数据结构,再到函数定义与调用及面向对象编程,Python提供了丰富的功能和强大的库支持,适用于Web开发、数据分析、人工智能等多个领域。学习Python不仅是掌握一门语言,更是加入一个充满活力的技术社区,开启探索未知世界的旅程。
10 5
|
1天前
|
人工智能 数据挖掘 开发者
探索Python编程:从基础到进阶
【10月更文挑战第32天】本文旨在通过浅显易懂的语言,带领读者从零开始学习Python编程。我们将一起探索Python的基础语法,了解如何编写简单的程序,并逐步深入到更复杂的编程概念。文章将通过实际的代码示例,帮助读者加深理解,并在结尾处提供练习题以巩固所学知识。无论你是编程新手还是希望提升编程技能的开发者,这篇文章都将为你的学习之旅提供宝贵的指导和启发。
|
13天前
|
弹性计算 安全 小程序
编程之美:Python让你领略浪漫星空下的流星雨奇观
这段代码使用 Python 的 `turtle` 库实现了一个流星雨动画。程序通过创建 `Meteor` 类来生成具有随机属性的流星,包括大小、颜色、位置和速度。在无限循环中,流星不断移动并重新绘制,营造出流星雨的效果。环境需求为 Python 3.11.4 和 PyCharm 2023.2.5。
|
6天前
|
数据处理 Python
从零到英雄:Python编程的奇幻旅程###
想象你正站在数字世界的门槛上,手中握着一把名为“Python”的魔法钥匙。别小看这把钥匙,它能开启无限可能的大门,引领你穿梭于现实与虚拟之间,创造属于自己的奇迹。本文将带你踏上一场从零基础到编程英雄的奇妙之旅,通过生动有趣的比喻和实际案例,让你领略Python编程的魅力,激发内心深处对技术的渴望与热爱。 ###
|
9天前
|
数据采集 机器学习/深度学习 人工智能
Python编程入门:从基础到实战
【10月更文挑战第24天】本文将带你进入Python的世界,从最基础的语法开始,逐步深入到实际的项目应用。我们将一起探索Python的强大功能和灵活性,无论你是编程新手还是有经验的开发者,都能在这篇文章中找到有价值的内容。让我们一起开启Python的奇妙之旅吧!
|
11天前
|
设计模式 监控 数据库连接
Python编程中的设计模式之美:提升代码质量与可维护性####
【10月更文挑战第21天】 一段简短而富有启发性的开头,引出文章的核心价值所在。 在编程的世界里,设计模式如同建筑师手中的蓝图,为软件的设计和实现提供了一套经过验证的解决方案。本文将深入浅出地探讨Python编程中几种常见的设计模式,通过实例展示它们如何帮助我们构建更加灵活、可扩展且易于维护的代码。 ####
|
8天前
|
数据库 开发者 Python
“Python异步编程革命:如何从编程新手蜕变为并发大师,掌握未来技术的制胜法宝”
【10月更文挑战第25天】介绍了Python异步编程的基础和高级技巧。文章从同步与异步编程的区别入手,逐步讲解了如何使用`asyncio`库和`async`/`await`关键字进行异步编程。通过对比传统多线程,展示了异步编程在I/O密集型任务中的优势,并提供了最佳实践建议。
12 1
|
11天前
|
存储 人工智能 数据挖掘
Python编程入门:构建你的第一个程序
【10月更文挑战第22天】编程,这个听起来高深莫测的词汇,实际上就像搭积木一样简单有趣。本文将带你走进Python的世界,用最浅显的语言和实例,让你轻松掌握编写第一个Python程序的方法。无论你是编程新手还是希望了解Python的爱好者,这篇文章都将是你的理想起点。让我们一起开始这段奇妙的编程之旅吧!
16 3