爬虫保存html本地存档,Requests+BeautiSoup实现爬取和本地保存 - Weiney

项目灵感

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

4f94968208524503ff0c23171b92272c.png

编码过程中遇到的问题

一.页面读取问题

由于网页作者也是半桶水,导致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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值