今日目标:新笔趣阁的全部小说目录
爬取分析:暂无任何严重反爬
爬取思路:

  • Step1:从base网页获取所有小说名字+小说链接
  • Step2:请求小说链接,获得章节名+章节链接
  • Step3:请求章节链接,获得小说内容
  • Step4:根据小说名字创建文件,持久化保存小说内容

技术分析:

  • 01:采用requests库,进行验证请求
  • 02:文件读取操作需要用到os模块
  • 03:解析文件使用xpath
  • 04:验证爬取成功之后再改写为多线程爬虫

开始构建代码:

  • 定义2个常用函数
import os
import requests
from lxml.html import etree#请求函数
def get_html(link):#伪造请求头headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36','Referer': 'http://www.xbiquge.la/paihangbang/','Host': 'www.xbiquge.la'}#实例化sessionsession = requests.session()#发起请求res = session.get(url=link, headers=headers)try:if res.status_code == 200:#避免网页乱码res.encoding = 'utf-8'#返回获取到的网页return res.textexcept requests.ConnectionError:return None#解析函数
def parse_html(html, xpath_bds): ''':param html: 目标网页:param xpath_bds: xpath表达式:return: 解析后的列表  '''  parse_html = etree.HTML(html)result = parse_html.xpath(xpath_bds)return result
  • 构建爬虫文件
#自定义保存位置
PATH = r'G:\小说'+ os.path.sep  + '{}.txt'class BiquSpider:def __init__(self):self.base_url = 'http://www.xbiquge.la/xiaoshuodaquan/'def get_article(self):''':return: 返回格式为{文章名:文章链接}的字典'''html = get_html(self.base_url)xpath_bds = '//div[@id="main"]/div[contains(@class,"novellist")]'parsed_page = parse_html(html,xpath_bds)for article in parsed_page:# 小说名字列表article_title_list = article.xpath('./ul/li/a/text()')# 小说链接列表article_link_list = article.xpath('./ul/li/a/@href')return dict(zip(article_link_list,article_title_list))def get_content(self,article_link):''':param article_link: 文章链接:return: 返回{章节名字 : 章节内容链接} 形式的字典'''chapter_name_bds = '//div[@id="list"]/dl/dd/a/text()'chapter_link_bds = '//div[@id="list"]/dl/dd/a/@href'html = get_html(article_link)# 章节名列表chapter_name_list = parse_html(html, chapter_name_bds)# 章节链接列表chapter_link_list = parse_html(html, chapter_link_bds)return dict(zip(chapter_name_list,chapter_link_list))def downloader(self,article_title, article_link):''':param article_title: 小说名字:param article_link: 小说链接:return:'''#章节内容表达式xpath_bds = '//div[@id="content"]/text()'content_dict = self.get_content(article_link)target = PATH.format(article_title)print(article_title + '开始下载请等候。。。')with open(target, 'w', encoding='utf-8', newline='') as f:for chapter_name, chapter_link in content_dict.items():html = get_html('http://www.xbiquge.la' + chapter_link)#文章内容列表chapter_info_list= parse_html(html,xpath_bds)print(chapter_name+'下载完毕')# self.write_txt(article_title,chapter_name,chapter_info_list)f.write(chapter_name)f.write('\n')for i in chapter_info_list:f.write("\n" + i.strip())f.write('\n\n')print(article_title + '下载完毕')def main(self):article_dict = self.get_article()for article_title, article_link in article_dict.items():self.downloader(article_title, article_link)if __name__ == '__main__':spider = BiquSpider()spider.main()
  • 改写代码
  • 导入所需要的库
from threading import Thread
from queue import Queue
  • 将所有小说链接入队列
def __init__(self):#实例化队列  self.url_queue = Queue()
def get_article(self):for article_link in article_link_list:#将小说链接放入队列self.url_queue.put(article_link)
  • 编写多进程函数,将mian函数移入
def my_thread(self):#文章链接 与 文章名的字典article_dict = self.get_article()while True:# 当队列不为空时,获取url地址if not self.url_queue.empty():#从队列中取出文章链接article_link = self.url_queue.get()#根据链接获得 文章名字article_title = article_dict[article_link]#开始下载self.downloader(article_title,article_link)
  • 改写main 函数,控制程序多线程运行
def main(self):# 存放所有线程的列表t_list = []for i in range(10):t = Thread(target=self.my_thread)t.start()t_list.append(t)# 统一回收线程for p in t_list:p.join()
  • 总体代码如下
import os
import requests
from threading import Thread
from queue import Queue
from lxml.html import etree#自定义保存位置
PATH = r'G:\小说'+ os.path.sep  + '{}.txt'#请求函数
def get_html(link):#伪造请求头headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36','Referer': 'http://www.xbiquge.la/paihangbang/','Host': 'www.xbiquge.la'}#实例化sessionsession = requests.session()#发起请求res = session.get(url=link, headers=headers)try:if res.status_code == 200:#避免网页乱码res.encoding = 'utf-8'#返回获取到的网页return res.textexcept requests.ConnectionError:return None#解析函数
def parse_html(html, xpath_bds):''':param html: 目标网页:param xpath_bds: xpath表达式:return: 解析后的列表'''parse_html = etree.HTML(html)result = parse_html.xpath(xpath_bds)return resultclass BiquSpider:def __init__(self):#初始目标网页self.base_url = 'http://www.xbiquge.la/xiaoshuodaquan/'#实例化队列self.url_queue = Queue()def get_article(self):''':return: 返回格式为{文章链接:文章名}的字典'''html = get_html(self.base_url)xpath_bds = '//div[@id="main"]/div[contains(@class,"novellist")]'parsed_page = parse_html(html,xpath_bds)for article in parsed_page:# 小说名字列表article_title_list = article.xpath('./ul/li/a/text()')# 小说链接列表article_link_list = article.xpath('./ul/li/a/@href')for article_link in article_link_list:#将小说链接放入队列self.url_queue.put(article_link)return dict(zip(article_link_list,article_title_list))def get_content(self,article_link):''':param article_link: 文章链接:return: 返回{章节名字 : 章节内容链接} 形式的字典'''chapter_name_bds = '//div[@id="list"]/dl/dd/a/text()'chapter_link_bds = '//div[@id="list"]/dl/dd/a/@href'html = get_html(article_link)# 章节名列表chapter_name_list = parse_html(html, chapter_name_bds)# 章节链接列表chapter_link_list = parse_html(html, chapter_link_bds)return dict(zip(chapter_name_list,chapter_link_list))def downloader(self,article_title, article_link):''':param article_title: 小说名字:param article_link: 小说链接:return:'''#章节内容表达式xpath_bds = '//div[@id="content"]/text()'content_dict = self.get_content(article_link)target = PATH.format(article_title)print(article_title + '开始下载请等候。。。')with open(target, 'w', encoding='utf-8', newline='') as f:for chapter_name, chapter_link in content_dict.items():html = get_html('http://www.xbiquge.la' + chapter_link)#文章内容列表chapter_info_list= parse_html(html,xpath_bds)# print(chapter_name+'下载完毕')# self.write_txt(article_title,chapter_name,chapter_info_list)f.write(chapter_name)f.write('\n')for i in chapter_info_list:f.write("\n" + i.strip())f.write('\n\n')print(article_title + '下载完毕')def my_thread(self):# 文章链接 与 文章名的字典article_dict = self.get_article()while True:# 当队列不为空时,获取url地址if not self.url_queue.empty():# 从队列中取出文章链接article_link = self.url_queue.get()# 根据链接获得 文章名字article_title = article_dict[article_link]# 开始下载self.downloader(article_title, article_link)def main(self):# 存放所有线程的列表t_list = []for i in range(10):t = Thread(target=self.my_thread)t.start()t_list.append(t)# 统一回收线程for p in t_list:p.join()if __name__ == '__main__':spider = BiquSpider()spider.main()

使用多线程爬取笔趣阁相关推荐

  1. python爬取小说写入txt_Python BeautifulSoup 爬取笔趣阁所有的小说

    这是一个练习作品.用python脚本爬取笔趣阁上面的免费小说. 环境:python3 类库:BeautifulSoup 数据源:http://www.biqukan.cc 原理就是伪装正常http请求 ...

  2. spider_使用随机User-Agent库, 爬取笔趣阁万古天帝章节目录_(fake_useragent)

    """使用随机User-Agent库,爬取笔趣阁万古天帝章节目录 """ import requestsfrom fake_useragen ...

  3. python爬取笔趣阁小说(附源码)

    python爬取笔趣阁小说 文章目录 python爬取笔趣阁小说 前言 一.获取小说目录结构 获取目录连接 请求代码 解析目录 XPath tqdm 解析 二.获取小说章节结构 请求代码 解析章节 代 ...

  4. 2021年scrapy一分钟内爬取笔趣阁整本小说存为txt|解决章节排序问题

    本人是一个小说迷,喜欢用电纸书看小说,但苦于难以寻找网络小说的txt版本,加之最近学习了一下怎么用scrapy爬取网页数据,所以想到去使用scrapy框架来爬取笔趣阁小说存为txt文件,在爬取过程中对 ...

  5. 爬取笔趣阁小说网站上的所有小说(二)

    爬取笔趣阁小说网站上的所有小说(二) 网址为:https://www.biqukan.cc/topallvisit/1.html 我们已经拿到了所有小说的地址爬取笔趣阁小说网站上的所有小说(一),现在 ...

  6. python爬取笔趣阁

    闲来无事,看到别人爬取笔趣阁,我也来试试. 首先打开笔趣阁网站 随便找本书看看 先查看网页源码,发现 这里显示的章节都可以从源码中找到 随便找个链接点进去发现是每一个章节.然后对章节查看源码,发现是静 ...

  7. python3+正则(re)增量爬虫爬取笔趣阁小说( 斗罗大陆IV终极斗罗)

    python3+re 爬虫爬取笔趣阁小说 斗罗大陆IV终极斗罗 爬取前准备 导入的模块 分析 正则的贪婪与非贪婪 附完整代码示例 爬取前准备 导入的模块 import redis #redis数据库 ...

  8. python爬取小说爬取_用python爬取笔趣阁小说

    原标题:用python爬取笔趣阁小说 首先打开笔趣阁网址,链接,搜索自己想要的小说. 在网站内单击右键,点击检查,会出现如下界面! 我们需要的章节信息就在我划的这块, 可以将每个标签点一下,它对应的内 ...

  9. java爬虫爬取笔趣阁小说

    java爬虫爬取笔趣阁小说 package novelCrawler;import org.jsoup.Connection; import org.jsoup.HttpStatusException ...

  10. Python爬虫之爬取笔趣阁小说下载到本地文件并且存储到数据库

    学习了python之后,接触到了爬虫,加上我又喜欢看小说,所以就做了一个爬虫的小程序,爬取笔趣阁小说. 程序中一共引入了以下几个库: import requests import mysql.conn ...

最新文章

  1. 每日一皮:啥一文理解TCP和UDP的区别!这张图才是最屌的!
  2. maven update项目报错
  3. IOS UIView 放大缩小
  4. 抢红包概率是随机的吗_顺丰发5亿红包给员工:管理学的随机奖励还能这么玩...
  5. python名片管理系统2.0_Python:名片管理系统2.0(增加登录功能)
  6. ERROR: Cannot uninstall ‘wrapt‘. It is a distutils installed project and thus we cannot accurately
  7. JavaWeb开发通过Socket编程实现网页访问(附源代码)
  8. java编程思想读后感
  9. 计算机考试怎样删除美式键盘,Win10怎么把美式键盘删除_Win10彻底删除eng美式键盘?-192路由网...
  10. sqli-labs 前五关
  11. 线段树--暴力修改专题浅谈
  12. 海南大学计算机科学与技术知乎,海南大学计算机科学与技术怎么样
  13. SpringBoot中出现 No qualifying bean of type ‘com.tanhua.server.mapper.UserInfoMapper‘ available: expect
  14. vue + vuex 实现评论和回复
  15. Linux分区磁盘空间扩展、扩容、合并
  16. 计算机玩游戏怎么会突然有边框,电脑打游戏怎么设置全屏
  17. Maven Archetype使用教程与具体使用方法
  18. IntelliJ IDEA中class lombok.javac.apt.LombokProcessor (in unnamed module @0x7d968ec1) cannot access..
  19. VIRTINS Multi-Instrument虚拟示波器HANTEK6022插件说明
  20. 应急管理部启动低温雨雪冰冻天气应急响应

热门文章

  1. Filter过滤器:使用过滤器保护指定资源,只有登录用户才能访问。若访问内容时用户没有登录则跳转到登录页面。
  2. 绘制一张好看的散点图及pearson和spearman相关性分析的选择
  3. MBR和 GPT互转导致Windows无法开机,镜像备份找不到
  4. cad怎么画立体图形教学_cad怎么绘制三维图形,cad三维制图实例图文教程
  5. 09款苹果笔记本图片_苹果2009-2012款Macbook Pro 13寸笔记本更换硬盘教程
  6. 联想计算机usb启动怎么办,联想电脑没有u盘启动该如何解决?解决联想电脑没有u盘启动的方法...
  7. java正则表达式是什么6_进阶Java编程(6)正则表达式
  8. 小程序 怎样判断数据的类型
  9. css基础知识 -- 颜色渐变
  10. Hello CTP(一)——期货业务