公司法
当前位置: 首页 法律大全

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

时间:2023-07-28 作者: 小编 阅读量: 1 栏目名: 法律大全

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章时代码运行停止了,没有给出错误原因,需要进一步优化。

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

    推荐阅读
  • 合肥徽宴楼罍街店怎么样(合肥狮城徽宴楼)

    据此,合肥高新区法院一审判决,合肥佳源徽宴楼餐饮有限公司立即停止侵害安徽狮城徽宴楼饮食管理有限公司相关商标专用权的行为,并赔偿狮城徽宴楼经济损失3万元。佳源徽宴楼不服一审判决,提起上诉。近日,合肥中院二审驳回上诉,维持原判。

  • 打着火怠速下多少转最好(打着火怠速下100转最好)

    我们一起去了解并探讨一下这个问题吧!打着火怠速下多少转最好1000转最好。车辆在冷车时启动。发动机为了尽快进入状态,会在高转速下运行,俗称热车~如果说你车一启动就在1000转以下,这个你要等待下。转速还再下降,说明你车辆的怠速过低,需要提高一点~如果始终保持不变的转速,说明你车在启动之前,状态很好,不需要热车。

  • 植物大战僵尸搞笑动画植物是反派(青春守沪)

    青春守沪青年报·青春上海记者范彦萍“有一天,小草正在散步,突然病毒老大冲了过来小草很害怕,撒腿就跑,眼看病毒老大就要追上来了,忽然,西瓜和辣椒跑了过来,与病毒老大发起了战斗……”最近,上海理工大学附属小学教育。

  • 波比认猪猪侠老大(超人特工队强势回归)

    《超人特工队2》的焦点在妈妈海伦身上,她骑着重型机车阻止各种悲剧,屡创功劳。续集《超人特工队2》时隔14年强势回归。《超2》延续首集的内容,由于超人身份引起疑虑,有心人士希望让超人重新在社会获得重视,但事情并非想象的简单,正义感与超能力毫无用武之地,可以想象巴鲍勃的无力感。除了妈妈与小儿子,片中的酷冰侠、小飞、小倩、巴鲍勃,以及其他英雄例如“砖头”与“空间女侠”等,都各有特色,贡献了很多笑点。

  • 猜成语一个太阳和一个星星(众多星星围绕月亮)

    大家好,看图猜成语,你最棒!昨天答案分别是:背道而驰,一鸣惊人,空中楼阁,如虎添翼,拔刀相助成语释义:背道而驰:朝着相反的方向跑。比喻行动方向和所要达到的目标完全相反。比喻增添力量,使强大的更加强大,或使凶恶的更加凶恶。每天进步一点点,离成功更进一步,加油!

  • 湖南端午节有哪些风俗拨龙舟(端午佳节看龙舟飞渡)

    沅江和溆水泛舟是江口的魅力所在。溆浦的传统龙舟一般头高尾翘,成梭子形,全长大约在26至28米之间,尾部翘起呈燕尾状,尾高达2.8米,可载70余人。两艘龙舟共108人,意取梁山泊108将。凡成年男子不管身处何地均必须赶回参加,或组织或自发,供四面八方慕名而来的客人亲友观赏。铜湾镇今年将有30多艘龙舟下水,场面非常热闹。全长约28米,28节,可坐人24节,计48人。黄溪口龙舟比赛没有号令,没有起跑线,观众是裁判。

  • 红米note5a手机一直重复重启该怎么办(这5种办法都可供选择)

    红米note5a手机一直重复重启该怎么办?红米note5a手机一直重复重启该怎么办首先遇到这个情况,先查看一下手机的是否还有电量,如果没有足够的电量的话,红米Note就会出现这个问题,解决这个问题的方法很简单,那就是为手机充电。另外,红米Note无限自动重启的也有可能是因为安装了root之后,把系统的自带的软件卸载掉,从而导致红米Note无限重启。

  • 饭后多久运动(饭后多久运动合适及原因)

    吃完饭多长时间可以运动,主要看采取运动强度是怎么样的如果是轻度运动,比如太极拳或者散步,如果不是太饱的情况之下,饭后10分钟左右就可以进行但是如果是一些高强度的体育锻炼,需要2个小时后甚至更长时间,比如长跑、打篮球、拳击、健身等建议饭后2小时以上,甚至更久再活动,我来为大家科普一下关于饭后多久运动?如果是轻度运动,比如太极拳或者散步,如果不是太饱的情况之下,饭后10分钟左右就可以进行。

  • 鳜鱼养殖周期,育苗培育、鱼种培育及成鱼养殖3个阶段

    鳜鱼养殖周期主要分为鱼苗培育阶段、鱼种培育阶段及成鱼养殖阶段。在放进鳜鱼苗之前,鱼池都要进行消毒,然后还可以放一些培育水质用来培育饵料鱼。