这里不多介绍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)
代码不一定严谨,但是简单的爬虫思路就是这样,看一下成果吧