1 功能及版本说明

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

版本:v1.1

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

2 开发环境

开发环境:Python3和PyCharm;

3 网站介绍及分析

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

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

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

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

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

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

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

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

4 编码思路

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

2) 爬取目录页面信息;

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

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

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

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

5 代码实现

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

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

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

完整代码如下:

crawl_v1.1.py

# 爬取小说 v1.1 import requests from bs4 import BeautifulSoup import time import random import proxy_ip url = "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.text author = 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_url chapter_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

# 爬取代理IP import requests from bs4 import BeautifulSoup import random url = "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].text td_3 = td[2].text td_6 = td[5].text ip = td_6 "://" td_2 ":" td_3 ip_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

代码运行效果如下:

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

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

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

,