最近在学习 Python,觉得爬虫很好玩,今天我准备爬取我看了至少三遍的小说《雪中悍刀行》,作者是烽火戏诸侯,他的小说很有才华,有着很多的粉丝,但他很多部小说都处于断更状态,因此人称大内总管。
我准备爬取小说的网站是新笔趣阁,这里一个盗版网站,是名门正派的眼中钉,不过对于我这种不想交钱看小说的人,没资格评论它,这个网站连载的小说更新的还是比较快的,内容都是和正版的内容一模一样。好了,废话不多说了,下面开始放代码:
我在抓取小说内容时先用了 requests 库来抓取,结果就抓到了一章小说的开头几句话,后来想到了刚在学习的 Selenium 自动化测试工具,利用 Selenium 可以驱动浏览器执行特定的动作,如点击、下拉等操作,同时还可以获取浏览器当前呈现的页面源代码,可以做到爬取呈现在你面前的所有内容。
首先我们先打开我们要爬取小说的主页 url = 'https://www.xxbiquge.com/0_807/',此时我们可以看到页面是小说的全部章节,我们先要拿到小说章节总数,代码如下:
def page_num():
"""
对小说的进行分析,得到小说总的章节数
:return: 章节数
"""
# 目标小说的 URL 地址,如果你想爬其他小说,只要改成你要爬的小说的主页就好了
url = 'https://www.xxbiquge.com/0_807/'
browser = webdriver.Chrome()
browser.get(url)
html = browser.page_source
soup = BeautifulSoup(html, 'lxml')
dd = soup.find_all(name="dd")
page = len(dd)
browser.close()
return page
接下来我们要对单章小说进行分析,比如第一章,第一章的 url = 'https://www.xxbiquge.com/0_807/4055527.html',我们很容易就能拿到第一章的源代码,关键是怎么得到下一章的内容,Selenium 可以模拟用户点击下一章,跳转到下一章的页面,
代码如下:
def index_page(i):
"""
加载出小说的每一章内容
:param i: 小说的第 i 章
"""
if i == 1:
# 小说第一章的 Url 地址, 你要爬取的小说的第一章 url
url = "https://www.xxbiquge.com/0_807/4055527.html"
browser.get(url)
# 等待 Content 节点加载出来
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#content')))
# 调用 get_info() 方法对页面进行解析
get_info()
# 寻找下一章点击的节点
next_p = browser.find_elements(By.XPATH,('//div[@class="bottem2"]/a'))[2]
# 点击按钮
next_p.click()
第三步,提取每一章的内容,代码如下:
def get_info():
"""
提取每一章小说的章章节名及正文
:return:
"""
# 找到章节的名字
name = browser.find_element_by_css_selector('#wrapper > div.content_read > div > div.bookname > h1').text
print(name)
# 找到小说正文
content = browser.find_element_by_id('content').text
print(content)
# 将拿到的小说名和对应的正文内容写入 txt 文件中
with open('雪中悍刀行.txt','a',encoding="utf-8") as f:
f.write('\n'.join([name, content]))
f.write('\n\n')
第四步,遍历每一页:
def main():
"""
b遍历小说的全部章节
:return:
"""
page = page_num()
print(page)
for i in range(1,page+1):
index_page(i)
最后一步,运行程序:
if __name__ == '__main__':
main()
然后就可以喝杯茶,等着小说下好。完整代码在:https://github.com/luoyunqa/Test/tree/master/biquge_novel