爬取起点中文网月票榜前500名网络小说

浏览: 1594

1.前言

昨晚学了一下bs4的BeautifulSoup,因为之前用的都是正则,感觉两者比起来,正则更加灵活,但控制不好就会爬到多余信息,而BeautifulSoup更加系统性。

2.观察网页结构

进入起点原创风云榜:http://r.qidian.com/yuepiao?chn=-1

Clipboard Image.png

老套路,懂我的人都知道我要看看有多少内容和页数需要爬。

Clipboard Image.png

翻到页面底部,发现有25页

Clipboard Image.png

去最后一页看了一下,是第500个作品

在谷歌浏览器(推荐)按下F12进入贤者模式,哦不,开发者模式。。。差点暴露了什么

我们跳到第一页

Clipboard Image.png

按F5刷新网页

Clipboard Image.png

点击network,点击下面红框消息

Clipboard Image.png

看Header,可以知道我们get请求的访问返回200表示正常访问

在谷歌浏览器中输入https://chrome.google.com/webstore/detail/infolite/ipjbadabbpedegielkhgpiekdlmfpgal,安装小插件(丘老师开发的定位小插件),为后文定位准确有很大帮助。

安装好之后,浏览器右上角会出现

Clipboard Image.png

点击之后会出现一个图形界面

Clipboard Image.png

比如我要爬作品名字,鼠标点击页面作品,会出现绿色,表示选中了,同时左边和上面出现的黄色表示同时选中了,但我们不要左边和上面的黄色信息(听起来怪怪的!),然后点击左边和上面的黄的区域,黄色区域变红色了(红色表示不选择)

Clipboard Image.png

Clipboard Image.png

此时只有文章名字是绿色了,同时插件界面上显示rank-view-list li,经测试要把#去掉,定位完成。

在Preview中定位到我们要的部分

Clipboard Image.png

接下来使用BeautifulSoup(美丽汤)找出我们要的内容

Clipboard Image.png

书名,作者,类型,简介,最新章节,书的地址链接  这些是我们要的

3.编写爬虫

import requests
from bs4 import BeautifulSoup

res=requests.get('http://r.qidian.com/yuepiao?chn=-1&page=1')
#print(res)#中间打印看看,好习惯
soup=BeautifulSoup(res.text,'html.parser')#
筛选器
#print(soup)

for news in soup.select('.rank-view-list li'):#定位
print(news)

结果如下:

Clipboard Image.png

注意这些标签(因为美丽汤提取是基于标签的)

经过测试

for news in soup.select('.rank-view-list li'):#Wrap后面一定有个空格,因为网页里有    
#print(news)
print(news.select('a')[1].text,news.select('a')[2].text,news.select('a')[3].text,news.select('p')[1].text,news.select('p')[2].text,news.select('a')[0]['href'])

可以设置提取内容如上面代码所示

提取结果是:

Clipboard Image.png

很乱,把内容存成字典格式再存放到列表中:

for news in soup.select('.rank-view-list li'):#Wrap后面一定有个空格,因为网页里有    
#print(news)
#print(news.select('a')[1].text,news.select('a')[2].text,news.select('a')[3].text,news.select('p')[1].text,news.select('p')[2].text,news.select('a')[0]['href'])
newsary.append({'title':news.select('a')[1].text,'name':news.select('a')[2].text,'style':news.select('a')[3].text,'describe':news.select('p')[2].text,'url':news.select('a')[0]['href']})
len(newsary)

Clipboard Image.png

显示每页20个作品

import pandas
newsdf=pandas.DataFrame(newsary)
newsdf

使用pandas的DataFrame格式存放

Clipboard Image.png

是不是舒服多了

但是,这只是第一页的信息,接下来老套路,观察网页结构,在我之前文章(爬取智联招聘信息里有写到:https://ask.hellobi.com/blog/wangdawei/6710

使用循环爬取25页内容

import requests
from bs4 import BeautifulSoup
newsary=[]
for i in range(25):
res=requests.get('http://r.qidian.com/yuepiao?chn=-1&page='+str(i))
#print(res)
soup=BeautifulSoup(res.text,'html.parser')
#print(soup)
#for news in soup.select('.rank-view-list h4'):#Wrap后面一定有个空格,因为网页里有

for news in soup.select('.rank-view-list li'):#Wrap后面一定有个空格,因为网页里有
#print(news)
#print(news.select('a')[1].text,news.select('a')[2].text,news.select('a')[3].text,news.select('p')[1].text,news.select('p')[2].text,news.select('a')[0]['href'])
newsary.append({'title':news.select('a')[1].text,'name':news.select('a')[2].text,'style':news.select('a')[3].text,'describe':news.select('p')[1].text,'lastest':news.select('p')[2].text,'url':news.select('a')[0]['href']})

import pandas
newsdf=pandas.DataFrame(newsary)
newsdf

Clipboard Image.png

这次终于完整了

Clipboard Image.png

最后存到本地~

newsdf.to_excel('qidian_rank1.xlsx')#输入到to按住Tab有很多格式,储存

用excel做一些后处理,把简介前面的空格去掉,换一下列之间的顺序(更符合正常阅读)

4.结果展现

Clipboard Image.png

推荐 0
本文由 柳岸河与风 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册