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