使用python3爬取你喜欢的小说
程序员文章站
2024-03-18 09:59:52
...
运行代码之前需要安装几个模块和一个浏览器:
1、requests请求库
2、BeautifulSoup解析库
3、selenium自动化模块
4、Firefox火狐浏览器
5、selenium的火狐浏览器插件
具体安装方法度娘有教程。
import requests
from bs4 import BeautifulSoup
import time
import random
import os
import re
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
def search(home_url, inputs):
'''功能:(搜索)'''
'''两个参数分别是:
1、要爬取的小说url
2、获取用户输入的小说名
'''
driver = webdriver.Firefox()
driver.get(home_url)
elem = driver.find_element_by_name("searchkey")
elem.send_keys(inputs) # 在输入框输入元素
elem.send_keys(Keys.RETURN) # 这个类似于模拟按键,Keys.RETURN参数是按回车键
time.sleep(5)
soup = BeautifulSoup(driver.page_source, 'lxml')
driver.quit()
try:
if soup.find(class_='xxcont'):
# 判断只有一部小说
new_soup = soup.find(class_='btn-section-all').get('href')
re_soup = re.search(r'\d{1,10}', new_soup).group() # 提取url中间的数字
return re_soup # 返回url中间的那几个数字
elif soup.find(class_='blocktitle').string == '出现错误!':
# 判断是否输入错误
return '搜索错误,可能没有该小说!'
except:
# 判断查到多部小说,选出指定一部
if soup.select('.tit'):
# print(soup.find(class_='tit').get_text().strip()) # 搜索到的结果
for i in soup.select('h3.text-overflow a'):
if i.get_text() in inputs:
re_soup = re.search(r'\d{1,10}', i.get('href')).group()
return re_soup # 返回url中间的那几个数字
else:
return '未知错误,或请重新启动。。。!'
def request(url, headers):
'''功能:(请求访问并返回text)'''
'''两个参数分别是:
1、要访问的url
2、响应头
'''
r = requests.get(url, headers=headers)
r.encoding = r.apparent_encoding
if r.status_code == 200:
return r.text
return '请求访问失败!', r.status_code
def soup_request(_text, home_url):
'''功能:(提取:书名和作者,各章节的url,章节名。)'''
'''两个参数分别是:
1、通过请求返回的源代码,注:字符串格式
2、首页的url
'''
soup = BeautifulSoup(_text, 'lxml')
title_author = soup.find(id='article-title').get_text().strip() # 书名和作者
title_author = re.sub(r'\n', ',', title_author)
url_a_href = [home_url + i.get('href') for i in soup.select('#section-list > li > a')] # 各章节的url
url_title = [i.get_text() for i in soup.select('#section-list > li > a')] # 章节名
return title_author, url_a_href, url_title
def new_url(_text, home_url):
'''功能:(获取下一页URL)'''
'''两个参数分别是:
1、通过请求返回的源代码,注:字符串格式
2、首页的url
'''
soup = BeautifulSoup(_text, 'lxml')
new_url = home_url + soup.find(class_='next').get('href') # 获取下一页
return new_url
def book_text(url, headers, home_url):
'''功能:(提取章节里面的小说内容)'''
'''三个参数分别是:
1、要爬取的小说url
2、响应头
3、小说网址首页的url
'''
_text = ''
urlnew = url
while True:
qingqiu = request(urlnew, headers) # 请求url,并返回text
soup = BeautifulSoup(qingqiu, 'lxml')
text = soup.find(class_='size_1').get_text()
_text += text
if soup.find(id='nextChapterBtn').get_text() == '下一页':
# 判断当前章节是否还有下一页
new = soup.find(id='nextChapterBtn')
urlnew = home_url + new.get('href')
time.sleep(random.randint(1, 3))
else:
return _text
def preservation(url, headers, home_url, wenjian):
'''功能:(储存数据)'''
'''四个参数分别是:
1、要爬取的小说url
2、响应头
3、小说网页首页的url
4、文件夹'''
a = 1 # 因为怕小说的章节名有时候不符合文件名的命名规则而报错,所以用a来代替章节
while True:
qingqiu = request(url, headers) # 请求url,并返回text
title, url, url_title = soup_request(qingqiu, home_url)
# 判断是否有该小说名文件夹
if os.path.exists(wenjian + title):
pass
else:
os.mkdir(wenjian + title)
for j, i in zip(url, url_title):
book_t = book_text(j, headers, home_url)
with open(wenjian + title + '/第' + str(a) + '章.txt', 'w', encoding='utf-8') as f:
f.write(i)
f.write(book_t)
a += 1
print(i)
print('*' * 50)
url = new_url(qingqiu, home_url) # 提取下一页链接,直接覆盖原有的链接
return '完成!'
def main():
while True:
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'}
print('请输入小说名:(请输入准确书名,不支持模糊搜索。)')
input_search = input('>>')
wenjian = 'D:/IT/临时/'
home_url = 'https://www.laiyetxt.com' # 首页
seasea = search(home_url, str(input_search))
if re.match(r"\d{1,10}", str(seasea)) != None:
url = home_url + '/mulu/' + str(seasea) + '_1.html' # 小说网址
if url:
print(url)
find = input('已找到搜索结果,是否下载:(y/n)')
if find == 'y':
prv = preservation(url, headers, home_url, wenjian)
elif find == 'n':
pass
else:
print('输入错误,正在退出程序。。。')
exit()
else:
print(seasea)
if __name__ == '__main__':
main()
来看看执行结果:
打开文件夹看看
等待下载完成,你就能无广告的看小说啦
注:如有侵犯网站权的,请告知小编,小编立即删除当前文章。
上一篇: HBase分布式环境安装部署