20行代码爬取一篇小说,手把手把方法喂给你 | 【爬虫系列】
网络爬虫
那何为爬虫呢,网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
怎么使用
我这里教大家的是用python去爬,因为什么呢,因为简单冲就完事了,首先大家需要导入几个库requests,这个不用说肯定是必须的,我这里使用了beautifulsoup和xpath所以还需要导入lxml,bs4。安装方法也是非常简单,默认环境直接找到Terminal,然后pip install xxxx 就行了,anaconda环境也可以如此或者conda install xxxx.
import requests
from bs4 import BeautifulSoup
from lxml import etree
找到一篇你喜欢的小说
这里搜索了一下小说网首先提示的就是17k小说网,那我就用这个演示了,平时也没啥特别爱看的小说所以我直接找了榜一的小说
那就拿这个风起龙城来演示吧!
分析
我们点进去分析一下
可以看到这里是有一个跳转页面可以进入的,点进去就会发现这里面就是我们需要的小说内容,所以我们就可以从这里找他的规律可以看到这后面的章节也是这种类型的
所以我们可以这么做
这样我们就可以获得这个a标签的xpath地址,也就相当于我们可以获得a标签里的href,我们来试试这个链接怎么获取
获取地址
def fenqi():
url = "https://www.17k.com/list/3381946.html"
resp = requests.get(url)
tree = etree.HTML(resp.text)
result = tree.xpath("/html/body/div[5]/dl[2]/dd/a/@href")
return result
这样我们就得到了我们需要的这个div底下所有a标签的链接了,而这些链接就是对应着每篇文章的内容地址.但是有个问题这里的链接是不全的,大家可以打印看看
所以我们需要进行拼接,拼接很简单后面源代码有这里不赘述
获取内容
我们点进链接分析一下如何把小说内容给拿出来
可以看到小说内容都被这个div给包裹起来了,这时我们打开看看是不是我们需要的内容,OK没问题就是小说的内容这里应该小说内容被一个class为readAreaBox content的div给包裹着所以我们可以使用Beautifulsoup来获取这个div内的所有数据
def content(url):
resp = requests.get(url)
resp.encoding = "utf-8"
page = BeautifulSoup(resp.text, "html.parser")
table = page.find_all("div", class_="readAreaBox content")
txt = table[0].text
return txt
这样我们就获得了里面的所有文本数据。大家可以试试将url改为小说页面的url地址然后打印
逻辑就是这个逻辑了,接下来就是将其整合然后存入文件中
存入文件
如何存入文件呢,也很简单直接上代码理解
def write(path, text):
with open(path, mode="a", encoding="utf-8") as f:
f.write(text)
# path 就是你创建的文件地址,text就是小说的内容,记住模式得为"a",不能为"wb","wb"模式会覆盖掉先前存入的内容
源代码
import requests
from bs4 import BeautifulSoup
from lxml import etree
def fenqi():
url1 = "https://www.17k.com/list/3381946.html"
resp = requests.get(url1)
tree = etree.HTML(resp.text)
result = tree.xpath("/html/body/div[5]/dl[2]/dd/a/@href")
return result
def content(url):
resp = requests.get(url)
resp.encoding = "utf-8"
page = BeautifulSoup(resp.text, "html.parser")
table = page.find_all("div", class_="readAreaBox content")
txt = table[0].text
return txt
def write(path, text):
with open(path, mode="a", encoding="utf-8") as f:
f.write(text)
if __name__ == '__main__':
result = fenqi()
http = "https://www.17k.com"
for i in range(3):
write("xiaoshuo/风起龙城.txt", content(http+result[i])) # 将content中所需要的url进行拼接
这里我只要了前三章的内容,大家要想多少也可以自己更改。我看了一下这个代码可以用于获取17k小说网的大部分小说的内容,当然收费的章节是不行的。
效果图
总结
好了经过这么一番操作我们就可以获取到我们喜欢的小说的内容了,是不是很简单代码总共加起来20行左右,快去试试吧
- 点赞
- 收藏
- 关注作者
评论(0)