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