zoukankan      html  css  js  c++  java
  • Python(五)编程小实例

    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:Python271.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('标题'+'	'+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('标题'+'	'+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('
    
    '+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('标题'+'	'+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('
    
    '+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的文本文件,你就可以打开查看你想看的小说了哦!加油吧,同学们!

  • 相关阅读:
    移动应用滑动屏幕方向判断解决方案,JS判断手势方向
    M1808本地配置IP全过程
    嵌入式板子tftpd交叉编译及使用
    七牛云ARM64交叉编译流程
    记录M1808Ubuntu18.04固定IP配置方案
    so库移植记录
    c++ 动态库的编译
    Linux提示Syntax error: end of file unexpected (expecting "then") 提示错误
    ubuntu18.04设置静态ip
    WebFlux中thymeleaf视图找不到的问题解决
  • 原文地址:https://www.cnblogs.com/zhuPython/p/6566967.html
Copyright © 2011-2022 走看看