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

浏览: 5944

好久没写爬虫文章了,今天来一发~

(今天不插入表情包了,【一本正经脸】)

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


感谢阅读~

欢迎各位dalao批评指正


(说话算数,真没插入表情包)

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

25 个评论

可以有
请问 为什么我的preview里只有{"code":0,"data":0,"msg":"suc"},定位不到任何内容
可能是网页结构改了
那应该怎么办呢,怎么根据网页新结构定位呢
for news in soup.select('.rank-view-list li'):#定位
print(news)
为什么运行后只有“最新更新 第七百二十五章 灭个干净。。。“这些数据,前面题目介绍都不显示,我就是按照你写的代码运行的
应该是网站结构改变了 要重新分析结构
起点的网站结构变了,把上面那条语句替换成这个就可以了,不然爬取不到评论
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']})
点个赞
老师 还有定位软件推荐不?上面那个打不开 求推荐
老师 还有定位软件推荐不?上面那个打不开 求推荐
老师 还有定位软件推荐不?上面那个打不开 求推荐
老师 还有定位软件推荐不?上面那个打不开 求推荐
老师 还有定位软件推荐不?上面那个打不开 求推荐
老师 还有定位软件推荐不?上面那个打不开 求推荐
老师 还有定位软件推荐不?上面那个打不开 求推荐
推荐学习BeautifulSoup
我学了,想找个定位插件,类似于邱老师开发的那个,他那链接打不开
学BeautifulSoup lxml
学BeautifulSoup xpath
https://chrome.google.com/webstore/detail/infolite/ipjbadabbpedegielkhgpiekdlmfpgal 丘老师这个打不开,请问有其他推荐吗,谢谢
使用BeautifulSoup 用谷歌浏览器的开发者模式
newsary是啥,我这里报错name 'newsary' is not defined,不知道怎么弄额
newsary=[] 是空列表 注意先定义再使用
尽管不能全部看懂,但是照葫芦画瓢从另一个网页上抓了一个报告更新列表下来。谢谢王老师dalao~
加油 共同进步

要回复文章请先登录注册