【python】保姆级网络爬虫爬取小说
首先需要安装python。最简单的python运行环境就是anaconda
https://repo.anaconda.com/archive/Anaconda3-2020.02-Windows-x86_64.exe
https://repo.anaconda.com/archive/Anaconda3-2020.02-Windows-x86.exe
https://www.anaconda.com
https://www.anaconda.com/products/individual
https://parsel.readthedocs.io/en/latest/index.html
首先是安装:在安好的anaconda开始菜单目录下点击如下窗口
在窗口中输入下面命令即可安装parsel插件,发现没,安装啥插件直接就pip install+插件名,大部分情况直接就安装上了。
pip install parsel
下面是我安装的过程
import requests
import parsel
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
}
response=requests.get('http://www.shuquge.com/txt/8659/2324752.html', headers=headers)
response.encoding = response.apparent_encoding
html = response.text
sel = parsel.Selector(html)
title = sel.css('.content h1::text').extract_first()
运行完后,标题出来了
接下来内容
内容我发现在id content下
contents = sel.css('#content::text').extract()
contents2 = []
for content in contents:
contents2.append(content.strip())
print(contents)
print(contents2)
print("\n".join(contents2))
之后用这个命令将里面空格去掉
对比一下 消除空格前
消除空格后
是不是清爽多了。
好了,最后我们要讲内容放到txt文件里,得保存下来。
with open('D:/1.txt', mode='w', encoding='utf-8') as f:
f.write("\n".join(contents2))
打开d盘下的1.txt然后as f 就是英文字面的意思,记做f
下面就用f表示上面的txt文件
f.write就是将上面的文本写入txt文件中
运行完,我们就发现
D盘下保存着咱们的文件
那么现在只是第一章,问题是我们想下载全部的小说,此外我们已经写了好多的内容,之后的章节都是重复操作。所以我们把刚才写的内容先封装起了,就是变成函数。之后直接调用函数就完成咱们刚才所有的功能。
函数在python下用def来表示。
def download_one_chapter(target_url):
response = requests.get(target_url, headers=headers)
response.encoding = response.apparent_encoding
html = response.text
sel = parsel.Selector(html)
title = sel.css('.content h1::text').extract_first()
contents = sel.css('#content::text').extract()
contents1 = [content.strip() for content in contents]
text = '\n'.join(contents1) print(text)
file = open(title + '.txt', mode='w', encoding='utf-8')
file.write(title)
file.write(text)
file.close()
函数封装好了。稍微改了点内容,基本上也能看明白。一周直接用这个函数就是下载一章的内容,只要传入网址。
接下来我们还要读取一本小说的目录,经常读小说的同学会发现其实小说网址是一模一样的,只不过不同章节知识后面一个数字改变了,所以我们要找到所有章节的网址。
我们返回小说封面,同样打开源码我们发现章节实际上是在
dd标签下 href里的我们用命令
links = sel.css('dd a::attr(href)').extract()
:
response = requests.get(book_url)
response.apparent_encoding =
html = response.text
sel = parsel.Selector(html)
links = sel.css('dd a::attr(href)').extract()
return links
我们想获得所有标签的网址所以也给它封装到函数里links就是所有章节的网址,例如2324763.html
那么完整的网址是
http://www.shuquge.com/txt/8659/2324752.html
实际上就是后面这部分么。下面我要下载完整的一本书其实就是把links里所有连接都下载下来
def get_one_book(book_url):
links = get_book_links(book_url)
for link in links:
print('http://www.shuquge.com/txt/8659/' + link)
download_one_chapter('http://www.shuquge.com/txt/8659/' + link)
找到这本书的连接,先得到章节目录,在for循环,循环links里所有的列表值放到link里。之后'http://www.shuquge.com/txt/8659/' + link就是我们章节的网址,在用我们封装好的章节的函数就可以下载了。
函数是都封装好了,下面我们开始运行主函数,其实python可以有主函数的
if __name__ == '__main__':
book_url = 'http://www.shuquge.com/txt/8659/index.html'
get_one_book(book_url)
if __name__ == '__main__': 就是主函数,函数先从这里运行
里面把书目录的链接放在里面直接就能下载整本小说了。
这篇文章遗留了一些问题,有很多同学想下载整个网站或者网站排行榜中所有的小说,下载它几百本,其实也是可以办到的,书的标记实际上就是网址:http://www.shuquge.com/txt/8659/index.html中8659这个数字,那么可以打开排行榜,找到所有小说的这个序号即可。还有就是保存txt文件的名字。我这里定义的是1.txt。那么如果下载多本小说就不能这么下载了。你们可以用文中说到的方法提取小说名字。作为txt文件的名字
with open('D:/1.txt', mode='w', encoding='utf-8') as f:就是这句1改成小说的名字变量即可。
文中css常用标志说明
#表示 id选择器
.表示 class选择器
>表示子元素,层级
一个空格也表示子元素,但是是所有的后代子元素,相当于 xpath 中的相对路径
1.css可以通过元素的id、class、标签这三个常规属性直接定位到
2.如下是百度输入框的的html代码:
<input id="kw" class="s_ipt" type="text" autocomplete="off" maxlength="100" name="wd"/>
3.css用#号表示id属性,如:#kw
4.css用.表示class属性,如:.s_ipt
5.css直接用标签名称,无任何标示符,如:input
-
-