聚沙成塔--爬虫系列(五)(请做个「优雅」的人)

苏菲▪玛索

版权声明:本文为作者原创文章,可以随意转载,但必须在明确位置表明出处!!!

通过上一篇文章聚沙成塔--爬虫系列(四)(爬取糗事百科段子)我们已经基本了解了爬虫的思想,首先是通过urlopen(...)函数去请求页面,然后通过正则表达式从函数返回回来的页面元素去匹配我们需要的信息,上一篇文章我们已经实现了从「糗事百科」爬取搞笑段子。

但是我们没有去考虑过编码规范,写法。随着需求越来越多我们的代码肯定会不断的增加,难道我们就这样从头写到尾吗?如果你的代码成千上万行了,到那时对你来说将会是一种灾难,代码会变得连你自己都不想去看一眼,生活中我们要做一个「优雅」的人,这样才会有人去欣赏你。编码一样,在编码中我们更要做一个「优雅」的人,让阅读你代码的人赏心悦目,让你的代码变得高可复用。不管在生活中还是工作中,请让自己做一个「优雅」的人。

函数的意义

在基础语法的一章聚沙成塔--爬虫系列(二)(python3基础语法)我们已经提到过函数,在这一章我们主要讲一讲函数的用法。让我们的代码变得像积木一样(可拼接),或者更通俗一点像“活字印刷术”一样

活字印刷

函数的设计

既然函数的作用是模块化,那么函数的设计就需要一定的要求了,从我个人的工作经验中,我一般设计函数通过参考一下几点:

  • 通用性: 何谓通用性呢,就是你设计的函数不仅你自己能用,别人也能用,这个在多人开发中经常会涉及到,这类函数一般是公共函数,或者工具类函数,比如时间格式的转化、文件读写的操作、文件的备份、移动等等。
  • 独立性: 你设计的函数只需要在你自己的工程中使用,这个时候你的函数参数可以是自己设计的对象。
  • 功能性: 函数的设计尽量以功能性为主,比如我们可以将上一篇文章的读取页面设计为一个函数,匹配规则设计为一个函数。
设计师

从现在开始让我们做个「优雅」的人


上一篇文章我们的代码写得并不「优雅」,如何让我们的代码变得更优雅一些呢。我们需要将代码封装成几个函数模块,让代码的可读性更高,可复用性更强。那我们的函数要怎么设计呢,下面是我用函数改写后的结果。

import urllib
from urllib import request
import re
url = 'https://www.qiushibaike.com'
user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'
headers = {'User-Agent': user_agent}


def read_html(url, headers, codec):
    '''[read_html]
    
    [读取html页面内容]
    
    Arguments:
        url {[string]} -- [url地址]
        headers {[dict]} -- [用户代理,这里是一个字典类型]
        codec {[string]} -- [编码方式]
    
    Returns:
        [string] -- [页面内容]
    '''
    # 构建一个请求对象
    req = request.Request(url, headers=headers)
    # 打开一个请求
    response = request.urlopen(req)
    # 读取服务器返回的页面数据内容
    content = response.read().decode(codec)

    return content

def match_element(content, pattern):
    '''[match_element]
    
    [匹配元素]
    
    Arguments:
        content {[string]} -- [文本内容]
        pattern {[object]} -- [匹配模式]

    Returns:
        [list] -- [匹配到的元素]
    '''
    # 匹配所有用户信息
    
    userinfos = re.findall(pattern, content)
    
    return userinfos

content = read_html(url, headers, 'utf-8')
pattern = re.compile(r'<div class="article block untagged mb15[\s\S]*?class="stats-vote".*?</div>', re.S)
userinfos = match_element(content, pattern)

if userinfos:
    pattern = re.compile(r'<a href="(.*?)".*?<h2>(.*?)</h2>.*?<div class="content">(.*?)</div>', re.S)
    for userinfo in userinfos:
        item = match_element(userinfo, pattern)
        #print(item)
        if item:
            userid, name, content = item[0]
            # 去掉换行符,<span></span>,<br/>符号
            userid = re.sub(r'\n|<span>|</span>|<br/>', '', userid)
            name = re.sub(r'\n|<span>|</span>|<br/>', '', name)
            content = re.sub(r'\n|<span>|</span>|<br/>', '', content)
            print((userid, name, content))

这样改写后的结果是不是要比没改写之前可读性好,可复用性更高了,首先read_html(...)函数保证了如果我们要读其它url网页内容,是不是只需要给函数传递相应的值就可以了。没改写之前若是我们又要去读取一个网页内容,唯一的做法就是再去重复的写一遍。march_element函数也是同样的道理。

当然这样的写法对代码的可读性和可维护性不是最好的,后面我们介绍到类的使用的时候将会再次重写它,期待你的持续关注,最后奉上运行结果。

结果.png

更多的文章可以关注我的blog:http://www.gavinxyj.com


欢迎关注我:「爱做饭的老谢」,老谢一直在努力...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容