写在前面的废话
- 没错,这个爬虫的确只是我想统计下自己读小说的速度和自己已经读了多少小说写的,可以爬一些小说的数据,不能用来爬小说本身。不过稍加改进可以实现更多的功能,我会在之后的文章实现其他的功能。
- 话说我都好久没有发过文章了啊,所以就来水一篇博客了(x)
正文
一、使用工具和目标网站的分析
使用的工具,恩,如题,我使用的是 python3.7,其他版本问题应该也不大。
我用到的包有三个:
- requests 用于发出http请求来获取数据
- re 用来匹配正则表达式的(我没有使用 HTML 解析器)
- time
然后是网站的分析了。
这次我拿 SF轻小说 http://book.sfacg.com/ 这个网站开刀。
对网站分析就不难整理接下来的思路了。网站自带收藏夹功能,而访问别人的收藏夹并不需要登录,因而在之后爬取数据的时候不需要模拟登录,可以比较方便地爬取数据。收藏夹内有各本小说的标题,作者,链接等数据,在小说页就可以看到字数以及更多我们想要的数据了。因此我们可以在阅读时把小说添加进收藏夹内,之后统计整个收藏夹就可以得到我们想要的数据了。
二、开工!
随便打开一个火袋页:
就可以看到里面的基本信息了。
比如这个火袋的 URL 是: http://p.sfacg.com/p/1892478/1/
不难得出,前面的 http://p.sfacg.com/p/
就是每个火袋共有的前缀了。 1892478
是这个火袋的id, 最后的1/
是页码,第一页默认不会有这个页码,这里是我加的。默认一页现实10本书,可以根据上面显示的总共的小说数计算出总页数。虽然最下面可以选择每页数量,但是有最大限制,当总数过多时就起不到作用了。所以这里就按照默认的数量来。
开 f12,分析下html:
先找到小说的总数。
然后可以看到,一个 <ul class="content_comment cover" eid="xxxx">
就是一本小说了。点开标签还可以看到这本小说的封面标题作者等信息,不过这些我们都可以等进入详情页再去爬取。
SF轻小说的每本小说详情页的格式为: http://book.sfacg.com/Novel/xxx/
这后面的xxx就是前面的 eid
了。
我们先试试把这个火袋里的所有小说爬出来:
三、开爬!
代码写出来大概是这个样子:
import requests
import re
import time
favlist = 'http://p.sfacg.com/p/1892478/'
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'}
req = requests.get(favlist, headers=headers)
pat_getcount = re.compile(r'<a href="javascript:void\(0\)">全部小说\(([0-9]*)\)</a>'