Python爬虫爬取静态网页实例一:爬取内涵段子吧上的段子

最近在学爬虫,这里用实例来与大家分享一下我学习的经验。

这里讲一个爬取静态网页内容的实例,Python一般利用正则表达式爬取静态静态网页的内容,而且因为静态网页源代码固定,不会发生变化,所以比较简单,这里选内涵段子吧作为例子。

内涵段子吧里的段子分为很多页,大家可以点击每一页,观察一下网址的变化,最后会发现每一页的url地址都遵循一个规则:

https://www.neihan8.com/article/list_5_"+page+".html"

page就是每一页在网页中的页码,比如第六页的内容,url地址是:

https://www.neihan8.com/article/list_5_6.html

给大家看一下网页的内容(第六页):

右击网页空白处,点击“查看网页源代码”:

我们的目标是把段子爬下来,可以发现,每个段子都可以找到一个特殊标记来作为开头和结尾:

我们的正则表达式就可以根据这个规则来进行编写:

#创建正则表达式规则对象,匹配每页里的段子内容,re.S表示匹配全部字符串内容
 pattern = re.compile(r'<div\sclass="f18 mb20">(.*?)</div>', re.S)

前期的准备工作都做完了,下面讲解代码。

现在一般项目的代码都采用模块化编程,因为这样可以降低代码间的耦合度并且易于扩展功能,我们的代码最好也进行模块化编程。

第一步,导入所需要的库文件:

from urllib import request
import re

注意:我这里用的是Python3,Python2需要导入的库文件是urllib2,urllib2.函数()==urllib.request.函数(),函数名是一样的。

第二步,需要找到网页并下载网页中的所有内容:

    def load_page(self,page):
        """
        下载页面
        :return:
        """
        #url地址
        url = "https://www.neihan8.com/article/list_5_" + str(self.page) + ".html"

        #报头,模拟网页点击
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"
        }

        #构建请求
        req = request.Request(url,headers=headers)
        #发送请求并接收网页返回值
        response = request.urlopen(req)

        #获得网页全部内容
        html = response.read()

        #创建正则表达式规则对象,匹配每页里的段子内容,re.S表示匹配全部字符串内容
        pattern = re.compile(r'<div\sclass="f18 mb20">(.*?)</div>', re.S)

        #转码
        html_tran = html.decode(encoding="gbk", errors="strict")

        #讲正则表达式对象应用到HTML源码,获得目标内容(段子)
        content_list = pattern.findall(html_tran)

        #调用deal_page处理段子里的杂七杂八的东西
        self.deal_page(content_list)

第二步,编写代码处理段子里杂七杂八的东西:

    def deal_page(self,content_list):
        """
        处理每页的段子
        content_list:煤业的段子列表集合
        :return:
        """
        for content in content_list:
            #将每个段子挨个处理
            content = content.replace("<p>","").replace("</p>","").replace("<br>","").replace("<br />","").replace("&ldquo;","").replace("&rdquo;","")
            #处理完后调用write_page()函数将每个段子写入文件内
            self.write_page(content)

第三步,将处理好的内容写到文件里:

    def write_page(self,content):
        """
        把网页内容逐个写到文件中
        :return:
        """
        #写入文件,a+为在原有的文件里追加,如果没有这个文件会自动创建
        with open("duanzi.txt","a+") as f:
            print("正在写入数据......")
            f.write(content)

至此,代码的主体部分就完成了,下面贴完整的代码:

from urllib import request
import re
import time

class Spider:
    def __init__(self):
        #初始化页面起始页码
        self.page = 1

        #如果是True继续爬取
        self.switch = True

    def load_page(self,page):
        """
        下载页面
        :return:
        """
        #url地址
        url = "https://www.neihan8.com/article/list_5_" + str(self.page) + ".html"

        #报头,模拟网页点击
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"
        }

        #构建请求
        req = request.Request(url,headers=headers)
        #发送请求并接收网页返回值
        response = request.urlopen(req)

        #获得网页内容
        html = response.read()

        #创建正则表达式规则对象,匹配每页里的段子内容,re.S表示匹配全部字符串内容
        pattern = re.compile(r'<div\sclass="f18 mb20">(.*?)</div>', re.S)

        #转码
        html_tran = html.decode(encoding="gbk", errors="strict")

        #讲正则表达式对象应用到HTML源码,获得目标内容(段子)
        content_list = pattern.findall(html_tran)

        #调用deal_page处理段子里的杂七杂八的东西
        self.deal_page(content_list)


    def deal_page(self,content_list):
        """
        处理每页的段子
        content_list:每页的段子列表集合
        :return:
        """
        for content in content_list:
            #将每个段子挨个处理
            content = content.replace("<p>","").replace("</p>","").replace("<br>","").replace("<br />","").replace("&ldquo;","").replace("&rdquo;","")
            #处理完后调用write_page()函数将每个段子写入文件内
            self.write_page(content)


    def write_page(self,content):
        """
        把网页内容逐个写到文件中
        :return:
        """
        #写入文件,a+为在原有的文件里追加,如果没有这个文件会自动创建
        with open("duanzi.txt","a+") as f:
            print("正在写入数据......")
            f.write(content)

    def start_work(self):
        """
        控制爬虫运行
        :return:
        """
        #循环执行,知道self.switch==False
        while self.switch==True:
            #用户控制爬取的次数
            command = input("如果继续爬取,请输入1,否则输入0:")
            if command=="0":
                self.switch=False
                print("谢谢使用!")
            elif command=="1":
                self.load_page(self.page)
                #每次爬取完后页面自动加1
                self.page += 1
            else:
                print("输入错误!")

if __name__ == "__main__":
    duanzi_spider = Spider()
    duanzi_spider.start_work()

这里我写的代码比较友好,所以代码量比较多,大家可以不用写这么多,只写出主体功能就可以了。爬取静态网页的套路比较固定:

第一步,要爬取的网页的URL地址;

第二步,查看网页源代码,看目标内容前后有什么特别的地方,利用这个特别的地方来写正则表达式;

第三步,构建请求;

第四步,发送请求并接收返回值;

第五步,利用第四步的返回值获取网页内容,利用正则表达式进行匹配。

至此,我们已经获得了我们想要的内容,接下来是打印还是往文件里写,就看大家怎么操作了。

如果有些的不对的地方还请大家批评指正。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值