1

闲着无聊,小说也看完了,剑来又迟迟不更新,旧的小说也追到底了,每次上起点找小说都被各种“高分”,“高推荐”的小说雷得里焦外嫩,又没心情去自己找新小说了,咋办???

听着网易云的歌,突然想起来以前网易云火的时候,好像有个很nb的推荐算法,忽然想到,能不能直接把那个部分给搞来给我自己推荐小说?

说干就干。

网易云的推荐算法可以在知乎的相关回答下看到,这是我参考的一篇潜在因子算法

那么,首先的第一步就是爬取相关数据,这里,我选择了起点上,各个小说其相关标签作为每个小说的“成分”,并将其爬取后备用。
另外一边,对于用户,我则按照用户所属的粉丝等级,来计算其相关的,对于各个小说的评分。

那么,为了可以顺利爬取到这些数据,我需要先去看看相关网页的文章结构。

首先是小说部分,在这个页面起点小说上可以看到所有的小说部分。

点到第二页,可以看到其链接组成:

www.qidian.com/all?orderId=&style=1&pageSize=20&siteid=1&pubflag=0&hiddenField=0&page=2
  1. orderId:排序方式,起点的这个排序方式很迷,这里不多说,可以自己去点点看。
  2. style:排列风格,带图片或者是带列表的
  3. pageSize:每一页的小说显示数量,这里面如果是带图片的方式,那么只有20个(无论你写多少)另一种则有50
  4. siteid,pubflag,hiddenField,这三没猜出来,不过不影响爬取工作
  5. page:当前页面

可见,只需要修改page的值,就可以遍历全部的小说了,接下来只需要获取到其小说对应id。

其过程不赘述,用py的beautifulsoup就可以轻松获取,代码如下:

with requests.Session() as s:
    r = s.get(url + str(page))
    soup = BeautifulSoup(r.text)
    try:
        result = soup.body.find('div', class_="wrap").find('div', class_="all-pro-wrap box-center cf")\
            .find('div', class_="main-content-wrap fl").find('div', class_="all-book-list")\
            .find('ul', class_="all-img-list cf").find_all('li')
    except AttributeError:
        continue

    for b in result:
        bookids.append(b.find(class_='book-img-box').a['data-bid'])

其id将会被储存在bookids里面。

拿到了小说的id,接下来就可以对小说标签进行爬取了。

小说部分的网址结构为book.qidian.com/info/ + bookid的形式,而在网页内部,其tag正好放在了<p class="tag"...</p>中,因此,直接使用soup.p.children然后逐个提取即可。代码如下:

for bid in bids:
    r = requests.get(burl + str(bid))
    if r.status_code == 400:
        continue
    soup = BeautifulSoup(r.text)
    bookattr.write(str(bid))

    for child in soup.p.children:
        #这一步会获取到为' '的子元素,需要排除
        if child.string not in '     ':
            bookattr.write(',' + child.string)
    #写入到相关文件内储存
    bookattr.write('\n')
    print("爬取了" + str(bid) + "号\n")

接下来,我将其部署到了自己的一个服务器内,因为使用了sleep来模仿人的点击操作,因此需要大量时间来等待其完成爬取操作。

以上,小说的爬取部分完成,下一篇会更新相关的用户爬取部分。


Saintmegu
19 声望0 粉丝

圣教徒,在此!(≧▽≦)/