126 lines
5 KiB
Python
126 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)
|