【python 小白到精通 | 课程笔记】第四章:问题拆分与网络爬虫

导读:本篇文章讲解 【python 小白到精通 | 课程笔记】第四章:问题拆分与网络爬虫,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

概述

课程地址飞桨AI Studio:Python小白到精通——第四章:自动通知-邮箱里的小秘书

这一节课程讲了函数以及问题拆分的思想,使用的一个“自动爬取网站的新通知,并发送到自己邮箱”的例子。(我并没有用过那个邮箱,不好调试代码,因此这部分没太清楚

本节的课后作业是利用爬虫写个北京地铁查询程序,查询网站:https://www.bjsubway.com/station/xltcx/,本次作业直接给出了可运行的源代码,我可以少花点脑子了,但是阅读源代码也还是挺消耗脑力的,因为源代码中并没有很多细节的解释。这次阅读过程还算流畅(可能代码本身就比较简单?

问题记录

1、报错文件不存在,如何创建一个文件

在使用下面这段代码进行文件写入操作时,发生了报错:[Errno 2] No such file or directory,说文件不存在。

size = os.path.getsize('./' + '网页源码.txt')
if size == 0:
    text = get_subway_page()
    with open('./' + '网页源码.txt', 'w') as f:
        f.write(text)

那怎么创建一个文件呢?可以在前面加入这段代码,在使用open()打开文件时,如果文件不存在,就会自动新建一个。

f = open('./' + '网页源码.txt', 'w')
f.close()

2、1号线/八通线的“苹果园”站点显示不出

在北京地铁的网站上,第一个站点是“苹果园”,但是课程给出的源代码中缺了这个站点。后面看了网站的html发现那一个站点的代码结构不一样,而课程的源代码中并没有考虑它。
在这里插入图片描述

小结

这一节以爬虫程序的例子讲解函数和问题拆分的思想。但我有时感觉,分得太细,模块就会变得很多,各种模块之间的调用关系就会变得复杂,此时程序同样也不太容易读懂。


程序代码

注:代码来自飞桨课程

# 1.取网页html
def get_webpage(url):
    r = requests.get(url)
    r.encoding = 'gbk'  # 编码格式

    return r.text


def get_subway_page():
    url = 'https://www.bjsubway.com/station/xltcx/'
    text = get_webpage(url)
    return text


# 2.定位
def is_line_start_line(line):
    mark = '<div class="subway_num'
    if mark in line:
        return True
    else:
        return False


def get_line_number(line):
    right = line.rfind('<')  # rfind()是什么
    left = line.find('>')

    return line[left + 1: right]


def is_target_line(line, line_num):
    if is_line_start_line(line) and get_line_number(line) == line_num:
        return True
    else:
        return False


def is_end_of_line_block(line):
    mark = '<div class="line_name">'
    if mark in line:
        return True
    else:
        return False


def get_target_line_info_block(page, line_num):
    target_lines = []
    start_record = False

    for line in page.split('\n'):  # page.split()是什么
        if is_target_line(line, line_num):
            start_record = True
            continue

        if start_record and is_end_of_line_block(line):
            break

        if start_record:
            target_lines.append(line)

    return target_lines


def contain_station_info(line):
    mark = '/station/xltcx/'  # ?? 苹果园不一样
    return mark in line


# 3.取信息部分
def get_station_info(line):
    left_mark = 'html">'
    left_index = line.find(left_mark) + len(left_mark)
    right_mark = '</a>'
    right_index = line.rfind(right_mark)  # rfind()与find()返回值

    return line[left_index: right_index]


def get_stations(line_info_lines):
    stations = []

    for line in line_info_lines:
        if contain_station_info(line):
            stations.append(get_station_info(line))

    return stations


def composing_get_line_station(line_name, text=None):
    if text is None: text = get_subway_page()  # 已经有html源码就不用去网页爬取了

    lines = get_target_line_info_block(text, line_name)

    stations = get_stations(lines)

    return stations


# 主程序
# -- step-00:创建文件

f = open('./' + '网页源码.txt', 'w')
f.close()

# -- step-01:获取网页源码,并写入文件

size = os.path.getsize('./' + '网页源码.txt')
if size == 0:
    text = get_subway_page()
    with open('./' + '网页源码.txt', 'w') as f:
        f.write(text)

# -- step-02:从文件读取源码

with open('./' + '网页源码.txt', 'r') as f:
    text = f.read()

# -- step-03:使用源码进行线路查询

road1 = composing_get_line_station('2号线', text)
print(road1)


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/114777.html

(0)
Java光头强的头像Java光头强

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!