前言
前半节把理论知识已经过了一遍,这节将具体实践一下。
一、目标选取与分析
该笔记记录纯学习使用。
选择目标
选择一个网站,将其内容爬取到本地进行保存或者展示。
网站:xx网
随便找的一个小说网站,这里建议大家经济没啥压力尽量多多支持正版啊。毕竟创作不易。
网站分析
网站提供了网络小说txt格式电子书的下载服务。
使用步骤
主要操作步骤如下:
-
进入网站,选择一本小说;
-
点击后进入小说详情页面,再点击“进入小说下载地址”
-
进入下载页面,点击下载地址进行下载。
发现这样类似的网站好几个。感觉是一堆马甲,内容都差不多一样,也许用的同一数据源,说不定也是爬取后再展示的,纯属猜测哈。
流程已经清楚了,主要是三个页面,接下来对页面源码进行分析。
页面源码
在当前网页按下“F12”键可以查看到源码。
-
从主页获取下一个详情页面链接:
-
从详情页获取下一个下载页面链接
-
最后获取下载链接
关于目标的分析就这些,下面能直接撸代码了。
二、代码实现
代码
- 导入
import requests
from bs4 import BeautifulSoup
- 获取网页html内容, 前面讲提的框架。
def getHTMLText(url: str) -> str:
try:
r = requests.get(url, timeout=30)
r.raise_for_status() # 若状态不是200,产生 HTTPError异常
r.encoding = r.apparent_encoding
return r.text
except:
return "产生异常"
- 解析主页获取页面详情url
def parseIndexGetDetail(text: str) -> str:
soup = BeautifulSoup(text,'html.parser')
res = soup.select("#container > div.maincontent > div.tclist.fl > ul > li:nth-child(2) > a")
url = "http://www.---.com/"
return url + res[0].attrs['href']
- 解析页面详情内容获取下载页面url.
def parseDetailGetDownWay(text: str) -> str:
soup = BeautifulSoup(text, 'html.parser')
res = soup.select("#container > div.nrcontent > div.down > div > ul > li > p > b > a")
url = "http://www.---.com/"
return url + res[0].attrs['href']
- 解析下载页面内容获取电子书书名和地址.
def parseDownGetDown(text: str) -> (str, str):
soup = BeautifulSoup(text, 'html.parser')
res = soup.select("#mainDownInfo > table .downlist >li")[0].contents[1].contents
title = res[0].attrs['title'][:-7]
return title, res[0].attrs['href']
- 调用上述函数
def run():
url_index = "http://www.----.com/"
text = getHTMLText(url_index)
url_detail = parseIndexGetDetail(text)
text = getHTMLText(url_detail)
url_down_way = parseDetailGetDownWay(text)
text = getHTMLText(url_down_way)
title, url_down = parseDownGetDown(text)
print("书名:", title)
print("下载地址:", url_down)
- main执行
if __name__ == '__main__':
run()
结果:
书名: 《武侠江湖大冒险》
下载地址: https://down.---.com/d/file/down/2022/02/18/武侠江湖大冒险.txt
代码展望
上面的代码仅实现了前面目标说的要求,相当于完全按照需求来做,没做任何新拓展,但是其实改进和能做的点还非常多,不过用于爬虫入门示例也勉强够。
实践上上面的例子并不怎么好,没有体现爬虫程序的自动化特点,比如大量数据自动爬取。例子中连个for循环都没有,就固定了某一个,当然这些都很容易改进。还有就是能将主页的搜索链接爬取下来使用,相当于可以再做一个壳将数据转发到网站上,爬虫程序做个数据中转站。
例子中用到了bs4的select函数,前面没介绍,可以看这里,多用下,多看看,还是挺简单的。顺便一提,这个select的入参字符串可以如下方式获取(结果不一定都能使用):