前言:平时看小说都是手机上找个免费软件看的,但是现在的APP要么是只给你几天免费,然后就收钱;要么就是免费但是不断出现广告,忍无可忍!PC端可以找到可以看的免费小说,但是一来必须坐到电脑前不方便,二来总是会自动弹到广告页面,手机浏览器上网看小说也是一样。
所以决定还是自己写个程序把要看的小说爬下来吧~
不多说了,代码如下:

2019年3月27日更新:笔趣阁变更URL了,而且搞了一些http和https之类的变化,导致以前的不能用了,所以更新一下,同时增加了断点续爬的代码,后续计划还要增加代理地址库、分布式爬虫等手段(或者直接用spider等框架?)
2018年11月10日更新:增加了selenium的代码,可以通过输入书名和最近看的章节名字,自动爬取需要的小说章节
注:selenium的使用必须安装相应的浏览器控件,比如我这里用了Chrome,所以首先必须安装Chrome浏览器,然后还要下载版本相应的chromedriver

import requests
from bs4 import BeautifulSoup
import re
import datetime
from selenium import webdriver
import time
import os#首先通过chrome获得headers,包括user-agent和cookie
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36','Cookie': '__jsluid=2e1d5b068aad24f7ba11f9a858d4e6e9; jieqiVisitTime=jieqiArticlesearchTime%3D1553649546','Host': 'www.biquyun.com'
}def get_bookurl(book_name):'''通过selenium获得书名对应的链接'''browser = webdriver.Chrome()url = "http://www.biquyun.com/"browser.get(url)input = browser.find_element_by_xpath('//*[@id="wd"]') # 点击“搜索栏”input.send_keys(book_name)button = browser.find_element_by_xpath('//*[@id="sss"]') # 点击“搜索栏”button.click()time.sleep(1)#因为这个网站使用的是弹出新窗口,所以需要跳转到新的页面才能获得urlwindows = browser.current_window_handleall_handers = browser.window_handlesfor handle in all_handers:if handle != windows:browser.switch_to_window(handle)time.sleep(1)current_url = browser.current_urlbrowser.quit()print(current_url)book_id = re.search('^https://www.biquyun.com/(.*?)/',current_url).group(1)print(book_id)return book_iddef get_novel(href,book_id):'''获得小说的标题和正文'''url = r"http://www.biquyun.com/"+book_id+"/"+href+".html"r = requests.get(url=url, verify=False)r.encoding = 'gbk'# time.sleep(1)soup = BeautifulSoup(r.text, 'lxml')#获取小说的标题novel_title = soup.find(name='div',attrs={'class':'bookname'}).h1.text.replace(u'\xa0', u' ').replace(u'\ufffd', u' ')# print(novel_title)#获取小说的正文novel_content = soup.find(name='div',attrs={'id':'content'}).text.replace(u'\xa0', u' ').replace(u'\ufffd', u' ').strip()# print(novel_content)return novel_title, novel_contentdef make_novel(novel_title,novel_content,book_name):'''导出小说'''with open(book_name+'.txt', 'a', encoding='gbk') as file:file.write(novel_title)file.write('\r\n')file.write(novel_content)file.write('\r\n')file.write('\r\n')def get_noveltitle(novel_title):'''导出已爬取小说章节的名字,以便后续断点续爬'''with open('已爬取小说章节.txt', 'a', encoding='gbk') as file:file.write('\n')file.write(novel_title)def get_last_line(filename):'''获取文本内的最后一行'''try:filesize = os.path.getsize(filename)if filesize == 0:return Noneelse:with open(filename, 'rb') as fp:  # to use seek from end, must use mode 'rb'offset = -50  # initialize offsetwhile True:  # offset cannot exceed file sizefp.seek(offset, 2)  # read # offset chars from eof(represent by number '2')lines = fp.readlines()  # read from fp to eofif len(lines) >= 2:  # if contains at least 2 linesreturn lines[-1].decode('gbk')  # then last line is totally includedelse:offset *= 2  # enlarge offsetexcept FileNotFoundError:print(filename + ' not found!')return None# print(get_last_line('已爬取小说章节.txt'))def crawler(last_chapter, n):'''爬取小说,支持断点续爬!'''if n <= 5:n = n + 1dd = soup.find(name='a', text=re.compile(last_chapter)).find_all_next(name='dd')for i in range(len(dd)):href_temp = str(dd[i])# print(href_temp)href = re.search('^<dd><a href="/.*?/(.*?).html">.*?</a></dd>', href_temp).group(1)# print(href)try:novel_title = str(get_novel(href, book_id)[0]).strip()novel_content = get_novel(href, book_id)[1]get_noveltitle(novel_title)if novel_title.startswith('第'):make_novel(novel_title, novel_content, book_name)print('已爬取小说:《{}》'.format(novel_title))else:print('《{}》不是小说正文,已忽略'.format(novel_title))except:print('第{}次出现错误,开始断点续爬!'.format(n))last_chapter = get_last_line('已爬取小说章节.txt')print('从《{}》继续开始爬'.format(last_chapter))time.sleep(3)crawler(last_chapter, n)else:print('已经迭代5次了,可能被ban ip了,请检查!')return Noneif __name__=='__main__':starttime = datetime.datetime.now()book_name = input("请输入书名:")last_chapter = input('请输入最近看的一章的名称(如果新书直接回车):')book_id = get_bookurl(book_name)url = r"https://www.biquyun.com/" + book_id + "/"requests.packages.urllib3.disable_warnings()r = requests.get(url=url, verify=False)r.encoding = 'gbk'soup = BeautifulSoup(r.text, 'lxml')n = 1crawler(last_chapter, n)endtime = datetime.datetime.now()total_time = (endtime - starttime).secondsprint("小说爬取完毕,总共耗时{}秒".format(total_time))

下完后是一个txt文件,导入到手机比较好的阅读类APP中即可!

爬虫第四天:爬取我要看的小说相关推荐

  1. Python爬虫【四】爬取PC网页版“微博辟谣”账号内容(selenium多线程异步处理多页面)

    专题系列导引   爬虫课题描述可见: Python爬虫[零]课题介绍 – 对"微博辟谣"账号的历史微博进行数据采集   课题解决方法: 微博移动版爬虫 Python爬虫[一]爬取移 ...

  2. 爬虫练习四:爬取b站番剧字幕

    由于个人经常在空闲时间在b站看些小视频欢乐一下,这次就想到了爬取b站视频的弹幕. 这里就以番剧<我的妹妹不可能那么可爱>第一季为例,抓取这一番剧每一话对应的弹幕. 1. 分析页面 这部番剧 ...

  3. Python爬虫【二】爬取PC网页版“微博辟谣”账号内容(selenium同步单线程)

    专题系列导引   爬虫课题描述可见: Python爬虫[零]课题介绍 – 对"微博辟谣"账号的历史微博进行数据采集   课题解决方法: 微博移动版爬虫 Python爬虫[一]爬取移 ...

  4. Python爬虫【三】爬取PC网页版“微博辟谣”账号内容(selenium单页面内多线程爬取内容)

    专题系列导引   爬虫课题描述可见: Python爬虫[零]课题介绍 – 对"微博辟谣"账号的历史微博进行数据采集   课题解决方法: 微博移动版爬虫 Python爬虫[一]爬取移 ...

  5. Jsoup:用Java也可以爬虫,怎么使用Java进行爬虫,用Java爬取网页数据,使用Jsoup爬取数据,爬虫举例:京东搜索

    Jsoup:用Java也可以爬虫,怎么使用Java进行爬虫,用Java爬取网页数据,使用Jsoup爬取数据,爬虫举例:京东搜索 一.资源 为什么接下来的代码中要使用el.getElementsByTa ...

  6. 《python爬虫实战》:爬取贴吧上的帖子

    <python爬虫实战>:爬取贴吧上的帖子 经过前面两篇例子的练习,自己也对爬虫有了一定的经验. 由于目前还没有利用BeautifulSoup库,因此关于爬虫的难点还是正则表达式的书写. ...

  7. python爬虫第二弹-多线程爬取网站歌曲

    python爬虫第二弹-多线程爬取网站歌曲 一.简介 二.使用的环境 三.网页解析 1.获取网页的最大页数 2.获取每一页的url形式 3.获取每首歌曲的相关信息 4.获取下载的链接 四.代码实现 一 ...

  8. Python爬虫入门 | 7 分类爬取豆瓣电影,解决动态加载问题

      比如我们今天的案例,豆瓣电影分类页面.根本没有什么翻页,需要点击"加载更多"新的电影信息,前面的黑科技瞬间被秒--   又比如知乎关注的人列表页面:   我复制了其中两个人昵称 ...

  9. Python爬虫实战练习:爬取微信公众号文章

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:徐洲更 为了实现该爬虫我们需要用到如下工具 Chrome浏览器 Py ...

最新文章

  1. android 自定义span_Android自定义可点击的ImageSpan并在TextView中内置View
  2. oracle存储过程 调用java_Oracle存储过程调用Java方法
  3. 使用python装饰器计算函数运行时间的实例
  4. 【竞赛相关】Kaggle竞赛宝典国内外竞赛方案汇总
  5. [_CN] Eclipse精要与高级开发技术 note
  6. cisco数据中心理论小记-3
  7. 【安富莱二代示波器教程】第8章 示波器设计—测量功能
  8. 格式怎么转换_爱奇艺下载的视频怎么转换成常见的mp4格式?
  9. C#LeetCode刷题之#345-反转字符串中的元音字母​​​​​​​(Reverse Vowels of a String)
  10. numpy random 模块
  11. pytorch 与 numpy 的相互转换
  12. c语言实现数据结构中的链式表
  13. 让菜鸟飞上天,简单搞定linux服务器
  14. 风铃魔兽世界同步器(5开10开N开)V3.1免费共享版
  15. Aho-Corasick automaton(AC自动机)解析及其在算法竞赛中的典型应用举例
  16. 小游戏————坦克大战
  17. 轻量易用的网站bug与性能监控平台——灵雀应用监控平台
  18. [JavaScript] JS求闭区间[min,max]的和
  19. xshell 免费版
  20. Django Vue渲染动态数据(七)

热门文章

  1. 使用nginx的proxy_cache做网站缓存
  2. python 路由转发_python 洋葱路由列表创建
  3. 手机删除的照片怎么恢复
  4. Knot DNS架构详解0-简介
  5. citus 之一 setup
  6. 为什么说凡例,才是家谱的核心?答案来了
  7. Redis实战精讲(3)
  8. uts计算机博士,悉尼科技大学 (UTS) 招收2020 CSC博士生, 全奖博士生 (软件工程/人工智能方向 )...
  9. 编译安卓平台可执行文件,并在安卓手机上执行
  10. 计算机基础:IP地址,子网掩码,默认网关,DNS服务器