最近竟然开始磕起了黄晓明和尹正的CP!!!
但是万恶的爱某艺不好好更新剧集,居然搞起了超前点映… WTF???有什么是我这个贫穷而又尊贵的VIP用户不能看的吗???
于是我决定开始看小说了!找个网站把小说爬下来慢慢看吧~
先物色一个投缘的小说网站吧
就它了!→ http://www.moyanxsw.com/binbianbushihaitanghong/
第一步:分析网页
首先需要了解要爬取网站的页面,查看网页源代码。然后根据网页源代码的结构,想好代码的步骤和思路。
在网页开发者模式中查看页面的源代码(F12)
- 先来看一下页面的请求方式:
在开发者模式的Network里找到.html的请求,可以看到请求方式是GET请求,也没有带什么特殊的请求参数之类的~ 比较简单。
(如果没有看到.html的请求,刷新一下页面就出来了)
- 然后再看代码结构:
(不太熟悉html的小伙伴可以使用圈圈里的小箭头,点一下自己想要看的元素,然后右侧就会自动跳转到该元素对应的代码区域的~四不四很简单)
小说网站的话会有两个比较重要的页面:
首先是目录页面,这里会有每一章的标题和链接,点击就会跳转到对应章节。
在目录页面中,可以看到 所有的目录都放在 < div class="book_list">
中的<a>
标签里,其中每一章的标题里带着一半链接,比如“第一节”是“href="7489410.html"
”,那后面实现跳转的时候就需要拼接一下了。
然后是正文页面,还是以第一章来举栗子:
先看它的地址:http://www.moyanxsw.com/binbianbushihaitanghong/ 加上前面章节里放的链接 7489410.html 就可以了,比较简单。
再看正文部分,是放在< div class="contentbox">
中的,也不复杂~
3. 确定实现思路:
①首先可以通过目录页面获得小说所有章节的链接地址。
②然后通过第一步获得的链接地址,爬取每一章节的正文内容。
③最后把爬取到的正文保存在本地的txt文档中。
第二步:开始编程
1. 定义库
import requests
from bs4 import BeautifulSoup
requests 库是用来发网络请求的,BeautifulSoup 是用来解析和提取 HTML 数据的。
关于它俩的详细说明可以参考我之前的文章呀:爬虫学习笔记——爬取单个网页里的所有图片(入门)
2. 对各步骤分别定义函数
2.1 获取网站数据并解析网页 getHtml():
获取网页数据还是用 requests.get()方法。
res = requests.get(url,params=params,headers=headers)
这样获取到的结果是一个 HTTP 状态码。
还需要用.text
方法再来获取一下这个结果里的文本信息。
#获取网页数据
html = requests.get(url)
htmlCode = html.text
有的网站对于反爬虫力度比较大,请求的时候可以构造一个请求头加上,请求头(Request Headers)在最前面开发者模式中的 Network 里就可以找到。
今天爬取的这个页面很简单,就直接 GET 请求 url 即可,可以啥都不带。
(我承认这段话是从我上篇文章里直接复制来的……)
接下来开始解析网页。
BeautifulSoup4 是将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,之后就可以利用 soup 加标签名轻松地获取这些标签的内容了。
BeautifulSoup(markup,'html.parser')
- markup 是被解析的 html 格式的内容
- html.parser 表示解析用的解析器
#解析网页
soup = BeautifulSoup(htmlCode,'html.parser')
2.2 获取章节目录 getList():
因为之前确定的实现思路是通过目录来获得小说所有章节的链接地址,然后分别对每一章内容进行爬取,所以接下来先要获得章节的目录。
前面分析过 在目录页面中,所有的目录链接都放在 < div class="book_list">
中的<a>
标签里,那么这里就可以用 soup.find('div', class_="book_list").find_all('a')
来获得所有符合条件的 <a>
标签了。
然后再看 <a>
标签的结构:
我们最终需要拿到的是 a 标签中的 href 属性值,获得href属性值的方法是a['href']
(这个小说的目录都是“第一节”、“第二节”这样,没什么用,就不用取出来