闲着无聊,小说也看完了,剑来又迟迟不更新,旧的小说也追到底了,每次上起点找小说都被各种“高分”,“高推荐”的小说雷得里焦外嫩,又没心情去自己找新小说了,咋办???
听着网易云的歌,突然想起来以前网易云火的时候,好像有个很nb的推荐算法,忽然想到,能不能直接把那个部分给搞来给我自己推荐小说?
说干就干。
网易云的推荐算法可以在知乎的相关回答下看到,这是我参考的一篇潜在因子算法。
那么,首先的第一步就是爬取相关数据,这里,我选择了起点上,各个小说其相关标签作为每个小说的“成分”,并将其爬取后备用。
另外一边,对于用户,我则按照用户所属的粉丝等级,来计算其相关的,对于各个小说的评分。
那么,为了可以顺利爬取到这些数据,我需要先去看看相关网页的文章结构。
首先是小说部分,在这个页面起点小说上可以看到所有的小说部分。
点到第二页,可以看到其链接组成:
www.qidian.com/all?orderId=&style=1&pageSize=20&siteid=1&pubflag=0&hiddenField=0&page=2
- orderId:排序方式,起点的这个排序方式很迷,这里不多说,可以自己去点点看。
- style:排列风格,带图片或者是带列表的
- pageSize:每一页的小说显示数量,这里面如果是带图片的方式,那么只有20个(无论你写多少)另一种则有50
- siteid,pubflag,hiddenField,这三没猜出来,不过不影响爬取工作
- 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来模仿人的点击操作,因此需要大量时间来等待其完成爬取操作。
以上,小说的爬取部分完成,下一篇会更新相关的用户爬取部分。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。