使用多线程爬取笔趣阁
今日目标:新笔趣阁的全部小说目录
爬取分析:暂无任何严重反爬
爬取思路:
- 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()
使用多线程爬取笔趣阁相关推荐
- python爬取小说写入txt_Python BeautifulSoup 爬取笔趣阁所有的小说
这是一个练习作品.用python脚本爬取笔趣阁上面的免费小说. 环境:python3 类库:BeautifulSoup 数据源:http://www.biqukan.cc 原理就是伪装正常http请求 ...
- spider_使用随机User-Agent库, 爬取笔趣阁万古天帝章节目录_(fake_useragent)
"""使用随机User-Agent库,爬取笔趣阁万古天帝章节目录 """ import requestsfrom fake_useragen ...
- python爬取笔趣阁小说(附源码)
python爬取笔趣阁小说 文章目录 python爬取笔趣阁小说 前言 一.获取小说目录结构 获取目录连接 请求代码 解析目录 XPath tqdm 解析 二.获取小说章节结构 请求代码 解析章节 代 ...
- 2021年scrapy一分钟内爬取笔趣阁整本小说存为txt|解决章节排序问题
本人是一个小说迷,喜欢用电纸书看小说,但苦于难以寻找网络小说的txt版本,加之最近学习了一下怎么用scrapy爬取网页数据,所以想到去使用scrapy框架来爬取笔趣阁小说存为txt文件,在爬取过程中对 ...
- 爬取笔趣阁小说网站上的所有小说(二)
爬取笔趣阁小说网站上的所有小说(二) 网址为:https://www.biqukan.cc/topallvisit/1.html 我们已经拿到了所有小说的地址爬取笔趣阁小说网站上的所有小说(一),现在 ...
- python爬取笔趣阁
闲来无事,看到别人爬取笔趣阁,我也来试试. 首先打开笔趣阁网站 随便找本书看看 先查看网页源码,发现 这里显示的章节都可以从源码中找到 随便找个链接点进去发现是每一个章节.然后对章节查看源码,发现是静 ...
- python3+正则(re)增量爬虫爬取笔趣阁小说( 斗罗大陆IV终极斗罗)
python3+re 爬虫爬取笔趣阁小说 斗罗大陆IV终极斗罗 爬取前准备 导入的模块 分析 正则的贪婪与非贪婪 附完整代码示例 爬取前准备 导入的模块 import redis #redis数据库 ...
- python爬取小说爬取_用python爬取笔趣阁小说
原标题:用python爬取笔趣阁小说 首先打开笔趣阁网址,链接,搜索自己想要的小说. 在网站内单击右键,点击检查,会出现如下界面! 我们需要的章节信息就在我划的这块, 可以将每个标签点一下,它对应的内 ...
- java爬虫爬取笔趣阁小说
java爬虫爬取笔趣阁小说 package novelCrawler;import org.jsoup.Connection; import org.jsoup.HttpStatusException ...
- Python爬虫之爬取笔趣阁小说下载到本地文件并且存储到数据库
学习了python之后,接触到了爬虫,加上我又喜欢看小说,所以就做了一个爬虫的小程序,爬取笔趣阁小说. 程序中一共引入了以下几个库: import requests import mysql.conn ...
最新文章
- 每日一皮:啥一文理解TCP和UDP的区别!这张图才是最屌的!
- maven update项目报错
- IOS UIView 放大缩小
- 抢红包概率是随机的吗_顺丰发5亿红包给员工:管理学的随机奖励还能这么玩...
- python名片管理系统2.0_Python:名片管理系统2.0(增加登录功能)
- ERROR: Cannot uninstall ‘wrapt‘. It is a distutils installed project and thus we cannot accurately
- JavaWeb开发通过Socket编程实现网页访问(附源代码)
- java编程思想读后感
- 计算机考试怎样删除美式键盘,Win10怎么把美式键盘删除_Win10彻底删除eng美式键盘?-192路由网...
- sqli-labs 前五关
- 线段树--暴力修改专题浅谈
- 海南大学计算机科学与技术知乎,海南大学计算机科学与技术怎么样
- SpringBoot中出现 No qualifying bean of type ‘com.tanhua.server.mapper.UserInfoMapper‘ available: expect
- vue + vuex 实现评论和回复
- Linux分区磁盘空间扩展、扩容、合并
- 计算机玩游戏怎么会突然有边框,电脑打游戏怎么设置全屏
- Maven Archetype使用教程与具体使用方法
- IntelliJ IDEA中class lombok.javac.apt.LombokProcessor (in unnamed module @0x7d968ec1) cannot access..
- VIRTINS Multi-Instrument虚拟示波器HANTEK6022插件说明
- 应急管理部启动低温雨雪冰冻天气应急响应
热门文章
- Filter过滤器:使用过滤器保护指定资源,只有登录用户才能访问。若访问内容时用户没有登录则跳转到登录页面。
- 绘制一张好看的散点图及pearson和spearman相关性分析的选择
- MBR和 GPT互转导致Windows无法开机,镜像备份找不到
- cad怎么画立体图形教学_cad怎么绘制三维图形,cad三维制图实例图文教程
- 09款苹果笔记本图片_苹果2009-2012款Macbook Pro 13寸笔记本更换硬盘教程
- 联想计算机usb启动怎么办,联想电脑没有u盘启动该如何解决?解决联想电脑没有u盘启动的方法...
- java正则表达式是什么6_进阶Java编程(6)正则表达式
- 小程序 怎样判断数据的类型
- css基础知识 -- 颜色渐变
- Hello CTP(一)——期货业务