科百科
当前位置: 首页 范文大全

python爬虫爬取小说内容(Python爬虫自学笔记爬取小说)

时间:2023-07-28 作者: 小编 阅读量: 5 栏目名: 范文大全

1功能及版本说明功能:爬取小说目录和章节内容,并将章节内容下载到本地txt文件中。版本:v1.1增加代理IP,实现小说完整下载。2开发环境开发环境:Python3和PyCharm;3网站介绍及分析以免费小说全文阅读网站为例,爬取该网站上面的小说。通过快捷键F12,可以调出当前网页的源码信息,分析相关源码。首先看小说目录页面,通过点击蓝色边框内的箭头,再点击左侧页面中要了解的信息,在右侧就会出现相关的源码信息。

1 功能及版本说明

功能:爬取小说目录和章节内容,并将章节内容下载到本地txt文件中。

版本:v1.1

增加代理IP,实现小说完整下载。

2 开发环境

开发环境:Python3和PyCharm;

3 网站介绍及分析

以免费小说全文阅读网站(http://www.quanwenyuedu.io/)为例,爬取该网站上面的小说。通过快捷键F12,可以调出当前网页的源码信息,分析相关源码。

首先看小说目录页面,通过点击蓝色边框内的箭头,再点击左侧页面中要了解的信息,在右侧就会出现相关的源码信息。

小说名称"遮天"对应的源码为:<h1>遮天</h1>;

小说作者"作者:辰东"对应的源码为:<p>"作者:"<span>辰东</span></p>;

小说章节信息对应的源码为:<li><a href="1.html">第1章 星空中的青铜巨棺</a></li>;

下面看章节内容页面,发现小说具体章节内容在代码<div>......</div>中。

4 编码思路

1) 提供小说目录页的url;

2) 爬取目录页面信息;

3) 提取目录页面中小说的名称、作者、具体章节的名称和网址信息;

4) 根据提取到的章节网址(一般为相对路径网址),结合目录页网址进行分析,合成绝对路径的章节网址;

5) 爬取小说章节网页内的正文内容,判断网站是否访问成功,若访问不成功则随机选取代理IP,继续访问;若访问成功,则将正文内容保存到本地txt文件中;

6) 循环小说章节网址,依次爬取下载保存到本地。

5 代码实现

代码分两个py文件,crawl_v1.1.py为爬取小说并下载的代码,proxy_ip.py为爬取代理IP的代码,具体如下:

完整代码如下:

crawl_v1.1.py

# 爬取小说 v1.1import requestsfrom bs4 import BeautifulSoupimport timeimport randomimport proxy_ipurl = "http://www.quanwenyuedu.io/n/zhetian/xiaoshuo.html"# 爬取url网址内容def get_url(url,proxies):headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0","Accept":"text/html,application/xhtml xml,application/xml;q=0.9,image/webp,*/*;q=0.8","Accept-Encoding":"gzip, deflate, sdch","Accept-Language":"zh-CN,zh;q=0.8","Cache-Control":"max-age=0","Connection":"keep-alive"}r = requests.get(url,headers = headers,proxies = proxies)while r.status_code != 200:p = proxy_ip.get_random_ip()r = requests.get(url, headers=headers, proxies=p)return r# 获取小说名称和作者proxies_random = proxy_ip.get_random_ip()r = get_url(url,proxies_random)soup = BeautifulSoup(r.text,"html.parser")title = soup.h1.textauthor = soup.find_all("p")[1].text[3:]chapter_list = soup.find_all("li")for i in chapter_list:# 获取小说章节名称和网址i_url = i.a.get("href")chapter_url = url[:-13]i_urlchapter_name = i.text# 获取小说章节内容r = get_url(chapter_url,proxies_random)chapter_soup = BeautifulSoup(r.text,"html.parser")content = chapter_soup.find_all("p")# 将章节内容写入txt文件print(chapter_name"正在下载......")for c in content:with open(title"_"author".txt","a",encoding="utf-8") as f:f.write(c.text"\n")print(chapter_name"下载完成")

proxy_ip.py

# 爬取代理IPimport requestsfrom bs4 import BeautifulSoupimport randomurl = "https://www.xicidaili.com/nn"headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0","Accept": "text/html,application/xhtml xml,application/xml;q=0.9,image/webp,*/*;q=0.8","Accept-Encoding": "gzip, deflate, sdch","Accept-Language": "zh-CN,zh;q=0.8","Cache-Control": "max-age=0","Connection": "keep-alive"}ip_list = []r = requests.get(url,headers = headers)soup = BeautifulSoup(r.text,"html.parser")# 提取ip相关的标签tr = soup.find_all("tr")tr = tr[1:]for i in tr:td = i.find_all("td")td_2 = td[1].texttd_3 = td[2].texttd_6 = td[5].textip = td_6"://"td_2":"td_3ip_list.append(ip)def get_random_ip():ip_random = random.choice(ip_list)i = ip_random.find(":")# 定位":",便于提取"http"或"https"proxy = {ip_random[:i]:ip_random}return proxy

代码运行效果如下:

6 代码问题汇总

1) 在代码调试阶段,出现如下错误:

UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position 7: illegal multibyte sequence

经查询分析,write()函数的默认编码不是utf-8,在write()中设置utf-8编码:write("","a",encoding="utf-8");

2) 下载速度过慢;

3) 代码运行,小说下载到990章时停住了,运行没有结束,也没有给出错误代码,只是不再继续运行下去了;

原因分析:怀疑是内存不足,或者写入函数write()内存限制。

7 相关学习知识点

1) 列表追加元素:list.append[];

2) 随机选取列表中的元素:需要引入random库,调用random.choice()函数;

3) 其他py文件中函数的调用:在要引入的文件中定义函数def get_random_ip();在本文件中import py文件,并调用get_random_ip()函数;

4) While循环语句,判断网站访问是否成功;

8 结束语

本次代码解决了反爬虫访问限制的问题,但下载速度很慢,且在进行到990章时代码运行停止了,没有给出错误原因,需要进一步优化。

将此次编码的过程及源码分享给大家,供大家参考。对于错误的地方,或有更好的建议,希望大家提出来,不胜感激!

    推荐阅读
  • 游戏id起名鬼才(游戏id名字大全)

    诠释悲伤时光流离,下面我们就来聊聊关于游戏id起名鬼才?游戏id起名鬼才诠释悲伤时光流离Memor情若寒浅末年华Gay丶King基王哥是ゝ拽男Soulmates灵魂伴侣大手一挥放倒一堆孤峰无伴Shouting甜蜜黑发尤物宁缺毋滥红颜多祸篈訫闭月羞花醉后余欢回眸最初Soul专情漫不经心黑白棋局挥洒永不褪色神坑卖队小手一抖一血送走Robert光辉和著名的一不小心半真半假半做梦愚人码头东京爱过如花似玉岁月如歌呆着看时间流淌forget旧事whitenight不眠之夜伱是硪的angelwhite云中谁忆Cry寂寞

  • steam上的二次元动作冒险游戏(合作冒险游戏玛丽和巴尤)

    steam上的二次元动作冒险游戏由SkinnyBandit开发的合作平台冒险游戏《玛丽和巴尤:回家之路》现已在Steam发售,现在购买享9折优惠,只需38.7元,支持中文。游戏预告优酷视频云游戏简介《玛丽和巴尤:回家之路》是一款2D合作冒险游戏,你将帮助陷入迷途的Mari回到家园,与她的哥哥Tom重聚。Bayu是Mari的好朋友,他必须鼓足勇气去找回被绑架的家人,并帮助Mari恢复自信,去找到回家的路。人类每个漫不经心的脚步,对昆虫而言都意味着一场生死攸关的冒险。

  • 冬天发动汽车小技巧(怎么启动汽车)

    接下来我们就一起去研究一下吧!冬天发动汽车小技巧将点火开关拧到第二档并不急于着车,此时电脑有自检功能,全车通电让汽油泵预热,约三秒钟后再启动马达。启动马达的目的并不是让它着车,而是让曲轴转2-3圈,目的是让机油泵将润滑油输送到配气机构。再次启动马达,此刻汽油泵和机油泵均已经激活,比较顺利的将汽油和润滑油输送到理想的预备地带,此时着车,发动机就避免干磨和不易启动。

  • 徐州窑湾景区恢复现场购票(徐州窑湾古镇景区内住宿)

    好消息,窑湾古镇景区恢复售票了!@所有人,你心心念念的景点可以进入了开放时间及购票方式:窑湾古镇景区八大景点将于5月10日正式开放,售票时间:9:00——16:00;疫情期间,景区实行实名制购票,可到景区游客服务中心购票;所有游客需持本人有效证件到检票口验证通行。六、疫情期间,游客要及时关注景区动态,理性选择游览,理性旅游、错峰旅游。

  • 生存种田类的小说有哪些(4本种田建设争霸类小说)

    主角被一个领主召唤到异界,但他觉得这个领主不靠谱决定逃跑。为了保命一边招募伙伴,一边建造基地。猪脚一是个非常有智谋的人,从想办法逃脱领主的控制,到变成了野怪,再逐渐的拥有了自己的势力,强大之后渐渐了解到世界的真相…全球玩家被困在网游《领主》世界,各种文明混战,全球争霸。游戏领主,召唤各朝名臣,在一次次的算计中崛起。

  • 描写声音的四字词语有哪些(描写声音的词有什么)

    跟着小编一起来看一看吧!描写声音的四字词语有哪些叽哇叽哇:形容乱嚷嚷的声音。形容巨大的声响。

  • 淘宝什么时候改名字(淘宝可以改名了)

    近日,有网友发现,淘宝支持修改账号名了。此前关于淘宝等购物软件能否修改账户名的问题,答案一直都是否定的,继微博可以改名后,很多人都在淘宝的微博留言,4月7日这个消息也是登上了微博的榜首。淘宝目前在进行灰测,预计4月下旬就可以全面推出,但即使是这样,也有300万人连夜改名,毕竟对于他们来说那简直是一段不堪回首的往事。甚至还有因为借给了闺蜜身份证结果被注册了淘宝,到现在没办法改的绝望。

  • 双酚a全球需求(欧洲提议大幅削减食品领域双酚A接触量)

    然而,此次建议限制BPA,风险评估人员更重视小型研究。这些研究表明,低水平BPA带来的微妙变化,可能导致健康问题。欧洲食品安全局的研究小组探讨了最低剂量BPA产生的生物效应。基于这一发现,专家小组建议将BPA的接触限值降低到原来的十万分之一,即降低至0.04纳克。欧洲食品安全局大幅降低BPA每日可耐受摄入量的提议,得到了环境和公共卫生倡导者的支持与赞赏。目前,欧洲食品安全局正在推动新标准制定,力争在今年12月前完成。

  • 返回键坏了用什么代替(可以用软件代替)

    手机按键坏了,可以下载一个etouch软件应该就像苹果的那个小白点一样的,之前键我们班有人用在应用宝里面搜索一下,它上面的软件比较丰富,应该可以找到下载的,我来为大家讲解一下关于返回键坏了用什么代替?跟着小编一起来看一看吧!在手机上打开应用宝,木有的话先在浏览器下载一个——打开——搜索软件下载就可以。也可以通过连接电脑的应用宝来下载,在电脑上打开它——连接好手机——进入手机应用里面就可以了!

  • 世界上最大的黄鳝有没有50斤(称之为黄鳝中的王中之王)

    新西兰渔民在2007年2月时在南极水域中捕获的巨型鱿鱼,这只鱿鱼长达十米,重450多千克,是迄今为止人类所捕获的最大且保存的最完好的鱿鱼。2011年9月,菲律宾发现了一条长达6.4米的咸水鳄,这条鳄鱼重达1075公斤,是迄今为止菲律宾捕获的最大的鳄鱼。