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

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

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

    推荐阅读
  • 香港公司一般要交多少税(香港公司需要缴纳哪些税)

    而非来源于香港的利润,如货款汇入香港则无须征税。而入息是否于香港或得自香港,决定于受雇工作的地点。而法团在香港若出租物业从事商业用途,则会被视为在香港经营业务,须就其物业收入缴纳利得税。

  • 海钓竿怎么安装鱼线(海钓竿怎么鱼线方法)

    海钓竿怎么安装鱼线?首先将准备的鱼线一头对折;接着将对折后的鱼线线头再向回折,这样形成一个线圈;,现在小编就来说说关于海钓竿怎么安装鱼线?下面内容希望能帮助到你,我们来一起看看吧!

  • 牛筋肉怎么做好吃又简单(快来看看吧)

    牛筋肉怎么做好吃又简单?黄焖牛筋肉的做法:先将牛筋肉洗净并切成条状(块状),冷水入锅,锅内放入大葱半根、姜两块(拍碎)?一匙料酒(去腥),焯水5分钟,捞出再用冷水冲洗干净。冷锅冷油放入花椒,小火煸至5分钟,煸至花椒油,待花椒出味快糊掉之前,关火,锅离开炉灶,把花椒粒拣出并扔掉!放入牛筋肉加白糖、酱油、老抽、料酒后煸炒五分钟,加入适量白开水。

  • 罪恶都市怎么设置成最大的分辨率(win10罪恶都市怎么改分辨率)

    侠盗飞车罪恶都市刚下载好游戏时,第一次打开游戏基本分辨率是最低的,这时就需要玩家自己去设置适合自己的分辨率了,那么又该如何去设置呢?下面会一一讲解。打开游戏之后,选择中间的进去。进入选项界面时,再点击打开第三个选项。点击屏幕分辨率后就点击箭头键右箭头翻动分辨率。这时就可以看见分辨率有16位的,还有就是32位的。

  • 承德兴隆山景区五一游览须知(承德兴隆山一日游)

    承德兴隆山景区游览须知1.所有入园游客需正确佩戴口罩,出示河北省健康码、通信大数据行程码,游览时自觉与他人保持1米以上安全距离。景区职工已完成全员接种、全员核酸,每天检测体温,均佩戴口罩等防护器具,请广大游客放心游览。

  • 概括主要内容题口诀(概括主要内容题怎么写)

    段意归并法把每段的段意连来,就是文章的主要内容先把全文读一遍,对课文有个大致的了解;再一段一段认真的读,读懂每个段,弄懂每个自然段的段落大意,只要把每个段落大意合理地连接起来,就抓住了课文的主要内容,我来为大家讲解一下关于概括主要内容题口诀?跟着小编一起来看一看吧!把每段的段意连来,就是文章的主要内容。综合归纳法,如写事的文章。记叙文一般包含有时间、地点、人物和事件四要素。

  • oppo手机上的hd有什么作用(oppo手机上面显示hd)

    在通话的时候,正常拨号配合流量,达到更高清的音质。

  • 公积金还款年冲和月冲有什么区别(公积金还款年冲)

    委托人可自主选择逐月还贷或逐年还贷,但同一笔贷款只能选择一种委托还贷方式。在整个还贷期间,一笔贷款可申请变更一次委托还贷方式。

  • 干锅手撕包菜的做法 干锅手撕包菜的做法大全

    说起干锅手撕包菜,尝到过的人不由自主就会流出口水,这道菜是潇湘风味菜,脆嫩鲜美,微微点酸味,口感香脆,是一道极美味的家常菜。干锅手撕包菜的做法1、准备基本材料包菜要选比较鲜嫩的,蒜切成片,小葱切段,准备茶油,还酱油、醋,高汤,还味精。这道干锅手撕包菜的做法比较适合居家来做,如果在酒店中要这道菜,那么做法就很复杂了。