import requests
import time
from bs4 import BeautifulSoup
url = "https://www.qu.la/paihangbang/"
def get_html(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status
# 我手动测试了编码。并设置好,这样有助于效率的提升
r.encoding = 'utr-8'
return r.text
except:
return "Someting Wrong!"
def get_content(url):
'''
爬取每一类型小说排行榜,
按顺序写入文件,
文件内容为 小说名字+小说链接
将内容保存到列表
并且返回一个装满url链接的列表
'''
url_list = []
html = get_html(url)
soup = BeautifulSoup(html, 'lxml')
# 由于小说排版的原因,历史类和完本类小说不在一个div里
category_list = soup.find_all('div', class_='index_toplist mright mbottom')
for cate in category_list:
name = cate.find('div', class_='toptab').span.string
with open('F:/CODE/Python/abc.csv', 'a+') as f:
f.write("\n小说种类:{} \n".format(name))
# 我们直接通过style属性来定位总排行榜
general_list = cate.find(style='display: block;')
# 找到全部的小说名字,发现他们全部都包含在li标签之中
book_list = general_list.find_all('li')
# 循环遍历出每一个小说的的名字,以及链接
for book in book_list:
link = 'http://www.qu.la/' + book.a['href']
title = book.a['title']
# 我们将所有文章的url地址保存在一个列表变量里
url_list.append(link)
# 这里使用a模式,防止清空文件
with open('F:/CODE/Python/abc.csv', 'a') as f:
f.write("小说名:{:<} \t 小说地址:{:<} \n".format(title, link))
return url_list
def get_txt_url(url):
url_list = []
html = get_html(url)
soup = BeautifulSoup(html, 'lxml')
lista = soup.find_all('dd')
for url in lista:
url_list.append('http://www.qu.la/' + url.a['href'])
return url_list
def get_one_txt(url):
'''
获取小说每个章节的文本
并写入到本地
'''
html = get_html(url)
soup = BeautifulSoup(html, 'lxml')
title = soup.find('h1')
return title
for url in get_content(url):
for url_ in get_txt_url(url):
print(get_one_txt(url_))
这个案例中url是每部小说的url
url_是每部小说的各个章节的url
最后输出的是各个章节url里面的title