Requests+BeautiSoup实现<<平凡的世界>>爬取和本地保存
  • 分类:Python
  • 发表:2019-01-09
  • 围观(798)
  • 评论(0)

项目灵感

最新想重温一下平凡的世界,然后网上虽然搜索到了资源,但是总感觉章节不全,然后我就找到了一个网站,网站很直接就叫平凡的世界,网站的内容很简单,就是平凡的世界的章节内容展示,全是静态页面,为什么不写个爬虫把文章全部保存下来呢?工作量似乎不大,事实上,整个代码也就二十分钟就能搞定,python的支持库不要太强大.

代码介绍

爬取站点: 平凡的世界[http://www.pingfandeshijie.net/]

Python库: requests 2.18.4, beautifulsoup4 4.7.1, tqdm 4.23.0

脚本共有五个函数:主函数->URL获取->页面爬取->页面分析->数据保存,数据不多总共一百多个章节,一分钟就执行完毕了,没必要用到线程访问,总的来说代码十分简单,beautifulsoup和xpath比起来还是有他的优势的.在开发小型爬虫时,requests和beautifulsoup真是绝配呀,在配上tqdm可视化进度条,可以说是一个十分精致的爬虫了.

import requests
from bs4 import BeautifulSoup
from tqdm import tqdm
import os

start_urls = "http://www.pingfandeshijie.net/ping-fan-de-shi-jie-"
path = os.getcwd()


if __name__ == '__main__':
    if not os.path.exists(path + "/平凡的世界"):
        os.mkdir(path + "/平凡的世界")
    print("平凡的世界全文爬取")
    print("作者:Weiney Blog:www.weiney.com")
    print("------------")
    print("爬虫开始运行")
    pages_crawl(get_urls())
    print("爬虫结束")
def get_urls():
    rt = {}
    for x in range(1, 4):
        req = requests.get(start_urls + str(x))
        req.encoding = "utf8"
        soup = BeautifulSoup(req.text, "html.parser")
        for link in soup.body.ul.find_all("li"):
            rt[link.a.string.strip()] = link.a["href"]
    return rt
def pages_crawl(pages):
    with tqdm(total=len(pages)) as phar:
        for key in pages.keys():
            article = page_analysis(pages.get(key))
            file_sava(key, article)
            phar.update(1)
def page_analysis(page: str):
    rt = []
    req = requests.get(page)
    req.encoding = "utf8"
    soup = BeautifulSoup(req.text, "html.parser")
    for x in soup.p.next_siblings:
        if x.name == "p":
            rt.append(x.text.replace("\n", "").strip())
    return rt
def file_sava(title, article):
    title = title.replace(" ", "-")
    with open(path + "/平凡的世界/" + title + ".txt", "w", encoding="utf8") as f:
        sum = 0
        for x in article:
            f.write(x + "\n\n")
            sum += len(x)
        f.write("本章节总字数:" + str(sum) + "\n")

编码过程中遇到的问题

一.页面读取问题

由于网页作者也是半桶水,导致html的结构十分混乱,在分析页面结构的时候要格外小心,结构错了将导致无法获取到正文内容,这个问题真的困扰了我蛮久的.

二.保存txt报错

在将数据保存txt的时候程序报错了具体报错原因如下:

UnicodeEncodeError: 'gbk' codec can't encode character '\ue131' in position 116: illegal multibyte sequence

报错原因分析:用open()方法打开txt文件时,系统默认编码为GBK,但是我们的数据是UTF-8,导致无法编码文内特殊字符,抛出异常.解决方法很简单,只需要给open()方法带一个encoding参数,参数设置为"utf8",用UTF-8格式保存文档就可以避免错误的产生.

小结

requests和beautifulsoup的组合可以说是开发python爬虫的经典组合了,在项目较小的时候,则可以通过这两个支持库快速的写出极其优美的爬虫,不得不说python的支持库实在是太强大了,即使两个库是刚上手的,根据自己的开发经验也能很快的上手开发.

当然本程序知只是练手项目,而且网站极其简易,如果是大型爬虫项目还是要用Scrapy之类的爬虫框架才能满足项目需求.另外:<<平凡的世界>>真的是一本十分好看的书.


共有 0 条评论

Top