之前尝试过用scrapy抓取过一些网站,实在有点杀鸡焉用牛刀。现在用asyncio的方式再来一遍。
技术点
任务使用到的技术点:
- asyncio
- aiohttp
- lxml
- shutil
所使用的技术点基本和之前的文章差不多,此处不再过多介绍。
逻辑
起初是想抓取一本小说,后来决定就选择整个专栏吧,其实技术难度也没增加多少。下面先从一本小说开始分析。
首先要获取章节目录的URL。
根据源代码获取章节的URL
1 | async def get_page_urls(url, sem): |
代码中将书籍信息设置为dict(),方便之后调用。
然后根据章节URL进行下载小说内容。
1 |
|
下面的代码是为了合并文件排序的目的:
1 | if i < 10: |
经过以上步骤就可以实现抓取一本小说并保存为文件了。
下面聊一下抓取整个专栏的小说的流程。首先获取专栏的所有链接,并且可以从页面可以获取最大页数。
然后从页面获取每一部书籍的章节入口的URL
1 |
|
到此为止,我们已经拿到了专栏里所有的书籍的章节URL,然后调用之前的内容下载函数就可以了。
此外还有一步需要处理,合并章节为一本小说。逻辑很简单,适用os.listdir()
遍历每个目录下的章节,然后写入到新的文件里即可。
1 |
|
示例
1 | #!/usr/bin/python |
总结
此项任务中遇到了几次nodename nor servname provided, or not known
的问题,可能是由于大量并发造成DNS解析出现的问题,适用gevent来解决。
1 | from gevent import monkey |