Python 爬取笔趣阁小说

  最近在学习 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

猜你喜欢

转载自www.cnblogs.com/mumaniu/p/9275821.html