127 lines
5 KiB
Python
127 lines
5 KiB
Python
|
import json
|
|||
|
import random
|
|||
|
import time
|
|||
|
|
|||
|
from bs4 import BeautifulSoup
|
|||
|
import requests
|
|||
|
|
|||
|
|
|||
|
class Download_Novel:
|
|||
|
|
|||
|
def get_user_agent(self):
|
|||
|
# 定义多个User-Agent列表,每个列表中包含多个不同的User-Agent字符串
|
|||
|
user_agents = [
|
|||
|
[
|
|||
|
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
|
|||
|
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.3',
|
|||
|
'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'],
|
|||
|
[
|
|||
|
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:54.0) Gecko/20100101 Firefox/54.0',
|
|||
|
'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0',
|
|||
|
'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0'],
|
|||
|
[
|
|||
|
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.1 Safari/603.1.30',
|
|||
|
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
|
|||
|
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Safari/604.1.38']
|
|||
|
]
|
|||
|
|
|||
|
# 随机选择一个User-Agent列表
|
|||
|
user_agent_list = random.choice(user_agents)
|
|||
|
|
|||
|
# 从选定的User-Agent列表中随机选择一个User-Agent字符串
|
|||
|
user_agent = random.choice(user_agent_list)
|
|||
|
return {'User-Agent': user_agent}
|
|||
|
|
|||
|
def search_novel(self):
|
|||
|
# 定义请求间隔时间(秒)
|
|||
|
interval = 2
|
|||
|
hm_url = f'https://user.bqgso.cc/hm.html?&q={self.name}'
|
|||
|
result = requests.get(hm_url, headers=self.get_user_agent()).text
|
|||
|
# print(result)
|
|||
|
hm = result[2:-2]
|
|||
|
# print(hm)
|
|||
|
# 发起请求并获取响应
|
|||
|
url = f'https://user.bqgso.cc/search.html?&q={self.name}&hm={hm}'
|
|||
|
|
|||
|
response = json.loads(requests.get(url, headers=self.get_user_agent()).text[1:-1])
|
|||
|
# print(type(response))
|
|||
|
for i, book in enumerate(response):
|
|||
|
# i['url_list'][:9] = 'https://www'
|
|||
|
trans_url = book['url_list'].replace('https://m', 'https://www')
|
|||
|
response[i]['url_list'] = trans_url
|
|||
|
|
|||
|
# 返回一个json对象
|
|||
|
return response
|
|||
|
|
|||
|
def get_novel_info(self,response):
|
|||
|
|
|||
|
# todo:
|
|||
|
|
|||
|
# 定义请求间隔时间(秒)
|
|||
|
interval = 2
|
|||
|
|
|||
|
# 设置请求头,模拟浏览器访问
|
|||
|
|
|||
|
# 要爬取的小说主页链接
|
|||
|
url = 'https://www.bqg221.com/xs/17931/'
|
|||
|
|
|||
|
# 发起请求并获取响应
|
|||
|
response = requests.get(url, headers=self.get_user_agent())
|
|||
|
|
|||
|
# 将响应转换为BeautifulSoup对象
|
|||
|
soup = BeautifulSoup(response.text, 'html.parser')
|
|||
|
|
|||
|
# 获取小说名字
|
|||
|
title = soup.select_one('.book h1').get_text(strip=True)
|
|||
|
print(title)
|
|||
|
|
|||
|
# 获取小说简介
|
|||
|
# print(soup.select('.small')[0])
|
|||
|
div_tag = soup.find('div', {'class': 'small'})
|
|||
|
# print(div_tag)
|
|||
|
all_span_tags = div_tag.find_all('span')
|
|||
|
# print(all_span_tags)
|
|||
|
author = all_span_tags[0].text.strip()[3:]
|
|||
|
status = all_span_tags[1].text.strip()
|
|||
|
update_time = all_span_tags[2].text.strip()
|
|||
|
latest_update = all_span_tags[3].text.strip()
|
|||
|
# for i in all_span_tags:
|
|||
|
# print(i.text.strip())
|
|||
|
intro = soup.select_one('.intro').get_text(strip=True)[:-6]
|
|||
|
print(intro)
|
|||
|
|
|||
|
cover = soup.select_one('.cover img')['src']
|
|||
|
# print(cover)
|
|||
|
# 获取小说所有章节链接
|
|||
|
chapter_urls = [url + i.get('href').split('/')[-1] for i in soup.select('.listmain a') if
|
|||
|
i.get('href').split('/')[-1] != 'javascript:dd_show()']
|
|||
|
# print(chapter_urls)
|
|||
|
|
|||
|
print('开始下载。。。')
|
|||
|
# 停顿两秒
|
|||
|
time.sleep(interval)
|
|||
|
|
|||
|
def __init__(self, name):
|
|||
|
self.name = name
|
|||
|
# 要爬取的小说主页链接
|
|||
|
# self.novel_url = 'https://www.bqg221.com/xs/'
|
|||
|
|
|||
|
|
|||
|
if __name__ == '__main__':
|
|||
|
search_name = input('请输入要搜索的书籍名称: ')
|
|||
|
if search_name:
|
|||
|
my_object = Download_Novel(search_name)
|
|||
|
response = my_object.search_novel()
|
|||
|
print(response)
|
|||
|
print('搜索到 ' + str(len(response)) + ' 个结果\n')
|
|||
|
print('---------------------------------------\n')
|
|||
|
for i, book in enumerate(response):
|
|||
|
print(str(i)+' 书籍名称:' + book['articlename'] + '\n作者:' + book['author'] + '\n简介:' + book['intro'] + '...\n')
|
|||
|
print('---------------------------------------')
|
|||
|
print('---------------------------------------\n')
|
|||
|
select_book = int(input(f'选择要下载的书籍序号(从0-{str(len(response)-1)}中选择):'))
|
|||
|
# todo: 添加书籍下载处理
|
|||
|
|
|||
|
else:
|
|||
|
exit(0)
|