7. 实战-获取的某个网站的小说资源

2020-03-24  本文已影响0人  运维开发_西瓜甜

本文链接:https://www.jianshu.com/p/6dfa229448bf
作者:西瓜甜

一、 需求

现在我们的需求是把下面网站上的小说下载下来,并把处理后的内容,写的本地的一个文件中

image.png

网址是: http://www.pingfandeshijie.net/di-yi-bu-01.html

分析技术点

模拟浏览器的行为

我们可以使用第三方模块来完成这件事

其实这几就是最底层的爬虫原理

requests 获取数据

import requests
url = 'http://www.pingfandeshijie.net/di-yi-bu-01.html'

# 模拟浏览器发送请求并得到回应, 返回的是一个 response 对象
r = requests.get(url)

# 从返回的对象中得到字符串类型的数据 r.content 是二进制的数据
html = str(r.content, encoding='utf-8')

# 这里为了测试的目的,可以把爬取的网页内容写的一个文件中
# 因为频繁的测试,会导频繁的请求,有可能被网站禁掉我们的 IP
# 写好后就可以把这段代码先注释掉了
with open('平凡的世界.txt', 'w', encoding='utf-8') as f:
    f.write(html)

python 操作文件

语法

with open("文件路径", "文件的打开模式",  encoding="字符编码")  as 变量(文件对象):
    执行文件对象对应的方法,这里的代码必须缩进 4 个空格
    多行缩进要一致
  • 文件路径支持绝对路径和相对路径
  • 文件的打开模式有:
    • r 只读 ,文件对象可以被 for 循环,每次循环一行
    • w 只写, f.write(接收的是字符串) f.writeline(接收一个列表) 每次都会把之前的内容先清空,之后才写入新的内容

处理数据

我们处理数据可以把刚才写入的文件再读到内存中,进行进一步的处理

with open('平凡的世界.html', 'r', encoding='utf-8') as f:
    for line in f:
        if line.startswith('<p>') and '=' not in line:
            print(line)

输出:

<p>1975年二、三月间,一个平平常常的日子,细蒙蒙的雨丝夹着一星半点的雪花,正纷纷淋淋地向大地飘洒着。时令已快到惊蛰,雪当然再不会存留,往往还没等落地,就已经消失得无踪无影了。黄土高原严寒而漫长的冬天看来就要过去,但那真正温暖的春天还远远地没有到来。</p>
...............................篇幅原因,后面略了..............................

作业:

继续爬取 到 第五章,并把数据处理后,写如到一个文件。
处理过的数据,不能有 html 的标签。

示例:

1975年二、三月间,一个平平常常的日子,细蒙蒙的雨丝夹着一星半点的雪花,正纷纷淋淋地向大地飘洒着。时令已快到惊蛰,雪当然再不会存留,往往还没等落地,就已经消失得无踪无影了。黄土高原严寒而漫长的冬天看来就要过去,但那真正温暖的春天还远远地没有到来

解题代码:

# 第三方模块,需要自己安装
# 如何安装?
# 在 shell 中,执行如下命令
# pip3 install  requests
import requests

def query_html(url):
    """
    请求url,并返回 html 页面内容
    :return: str html 页面内容
    """
    r = requests.get(url)

    # 把 二进制的内容转换成字符串, 就是页面的内容
    html = str(r.content, encoding='utf-8')
    return html


def parse_data(data):
    """
    清洗数据
    :param data:  str html page
    :return: list  处理之后数据列表
    """
    content = []
    url = ''

    for line in data.splitlines():
        if '<p>下一章:' in line:
            url = line.split()[1]
            url = url.split('"')[1]
            break
        elif '<p>' in line:
            # 去除 每行两端的 p 标签
            line = line[3:-4]
            content.append(line + '\n')
    return content, url


def write_file(conent='', file_name=''):
    """写文件"""
    if not file_name:
        file_name = '平凡的世界-路遥.txt'

    # 以 a (追加) 的模式打开文件,进行持续的写入内容
    with open(file_name, 'a', encoding='utf-8') as f:
        f.writelines(conent)



def main(url_path):
    
    while url_path:
        html = query_html(url_path)
        content_list, url_path = parse_data(html)
        write_file(content_list)

        if '06.html' in url_path:
            break

 


if __name__ == '__main__':
    url_path = 'http://www.pingfandeshijie.net/di-yi-bu-01.html'
    main(url_path)



上一篇下一篇

猜你喜欢

热点阅读