Python爬虫:爬取一部自己喜欢的小说

这里不多介绍Python和爬虫,话不多说,直接开整。

我们首先从最简单的爬虫开始学习,我知道的一个小说网站——笔趣阁(http://www.biquw.com),无须登录,无须进行header验证,而且响应返回的是标准的HTML页面,可以说是对新手非常友好了。博主建议大家,爬取网站本身就不算什么合法的行为,所以至少,给你的每次请求加上一个时间间隔,不要让人家的服务器挂掉。

本文写于2018-12-14,不代表网站将来不会做反爬取措施,所以不保证本文的代码会一直有效,但是写爬虫的理念会一直如此。

我们随便点一本小说(http://www.biquw.com/book/100/77358.html)进去,来观察一下请求和响应:

首先可以看到请求方式是get:

 响应的话就是渲染完毕的HTML页面:

然后我们可以先写一部分代码了:

首先引入我们这个脚本所需要的库

import requests
from bs4 import BeautifulSoup
import time

requests是一个强大的HTTP库,如果你不是很了解,建议参考https://cuiqingcai.com/2556.html

BeautifulSoup是用来解析HTML代码的库,具体了解怎么用可以参考https://cuiqingcai.com/1319.html

time顾明思议,和时间相关的基本都可以用它

# 目标URL
target_url = 'http://www.biquw.com/book/100/77358.html'
# 发起get请求,并得到响应
response = requests.get(target_url)
# 我们先来看下响应的内容
print(response.text)

运行一下看一下结果:

 图太长,我就不都截下来了,但是很明显,我们已经得到了小说页面的HTML代码,截下来只要分析一下怎么拿到小说的文本就可以了。

我们再去浏览器分析一下HTML代码:

title里放的是小说的标题,我们记一下,留着爬下来给小说文件起名用

 class='next pager_next'的a标签里放的是下一章的链接,通过最后一章我们可以发现,最后一章点击下一页后,会回到小说的目录页,然后就没有了这个a标签,所以我们可以用这个标签来判断是否最后一章,并且来得到下一章的url

id=‘htmlContent’为的div里,放的就是小说的文本了

 得到了这三点信息,我们在加上解析的代码:

# 把响应的内容扔到BeautifulSoup里,生成BeautifulSoup对象,用来解析HTML
soup = BeautifulSoup(response.text, 'html5lib')
# 找到 id="htmlContent"的标签,也就是小说文本内容
contentsText = soup.find(id="htmlContent")
# 找到title标签
title = soup.title
# 获取title的文本内容,也就是去掉<title>
title = str(title.string)
# 再找到 class="next pager_next"的a标签
hasNext = soup.find("a", class_="next pager_next")
# 抽取这个a标签的href属性,也就是下一章的url
nextUrl = hasNext.attrs["href"]
# 我们来打印一下这三个内容
print("title:"+title)
print("下一章的地址:"+nextUrl)
print("小说内容:"+contentsText.text)

需要注意一点,因为class在Python里是关键字,所以在找a标签的时候,你要写成class_

看一下结果吧:

 然后我们把文本写到本地吧

# 写文件,不指定utf-8可能会报错    
with open("C:/Users/yss/Desktop/text/"+title+".txt", 'w+', encoding="utf-8") as file:
        file.write(contentsText.text)
        print(title + "完成!")
        file.close()

看看效果还可以

但是现在我们只下载了一章,后面的怎么办,各位读者在看下去的时候,可以发挥一下自己的脑洞,来试验一下自动下载后续章节,我们本篇 到此为止。

 

 

 

 

 

 

 

 

开玩笑的。我们继续,首先我们要知道,在Windows下给文件命名,有一些字符是不允许出现在文件名里的,只需要在文件重命名时试一下,系统就会告诉我们了

 都是英文字符,中文的字符并没有限制,而有些小说的title里恰好有这些字符,这样就会导致最后写文件出错,所以我们一定要针对此做一些处理。

既然要获取后面的章节,那必然是一个循环,而我又不知道具体有多少章,所以我们用while循环,最终呈现的代码应该会是下面这样:

import requests
from bs4 import BeautifulSoup
import time

# 这里是第一章的url
target_url = 'http://www.biquw.com/book/100/77358.html'
# 开始循环下载
while True:
    # 每次循环间隔2秒
    time.sleep(2)
    response = requests.get(target_url)
    soup = BeautifulSoup(response.text, 'html5lib')
    contentsText = soup.find(id="htmlContent")
    title = soup.title
    title = str(title.string)
    # 把title里的特殊字符统统去掉
    title = title.replace("?", "")
    title = title.replace(":", "")
    title = title.replace("<", "")
    title = title.replace(">", "")
    title = title.replace("|", "")
    title = title.replace("/", "")
    title = title.replace("\\", "")
    title = title.replace("*", "")
    title = title.replace("\"", "")

    nextUrl = ""
    # 这里我们加上try块,最后一章下一章后,就不会有这个a标签了,这里就会报错
    # 我们就可以认为已经全部下载完了,跳出循环即可
    try:
        hasNext = soup.find("a", class_="next pager_next")
        nextUrl = hasNext.attrs["href"]
    except Exception:
        print("下载完成!")
        break
    with open("C:/Users/yss/Desktop/text/"+title+".txt", 'w+', encoding="utf-8") as file:
        file.write(contentsText.text)
        print(title + "完成!")
        file.close()
        # 最后我们把下一章的链接拼好,来为下一次循环做准备
        target_url = "http://www.biquw.com" + str(nextUrl)

代码不一定严谨,但是简单的爬虫思路就是这样,看一下成果吧

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cRack_cLick

感谢你的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值