最近在学习 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
原文地址:https://www.cnblogs.com/mumaniu/p/9275821.html