解读:Python大佬精选教材,一步一步教你从零开始学会采集小说
优采云 发布时间: 2020-08-31 12:48从Python大师中精选的教科书,逐步教您从头学习采摘小说
履带式实战01--小说02-2,开始页面处理02-3,页面处理03,其他内容分析: 03-3,其他04,完整代码05,结论:
01. 运行环境
您可以通过私人消息小编01获得Python学习材料
# 操作系统:win10 专业版
pycharm professional 2019.1
python 3.8
beautifulsoup4 == 4.9.0
requests == 2.23.0
random # 内置的
1234567
02,开始抓取02-1,分析点
对于其他两点,请先获取页面,然后获取页面内部的内容
02-1-1. 页面间处理: 找到采集器的第一页以找到上一页和下一页的规则,或者如何跳转到下一页以找到最后一页</p
p通常来说: 确定开始条件和结束条件,然后找到跳转到下一页的规则! (有一个开始,就有一个过程)02-1-2,提取页面内容以查找数据内容,(标题,内容...)(着重于查找内容的共性,易于提取)提取标签,然后提取文本以保存提取的数据02-2,开始页面处理02-2-1,文章目录链接地址:/p
ppre class="syl-page-code hljs less"codebrspan class="hljs-attribute"http/span:span class="hljs-comment"//www.quanben5.com/n/chuimianbuhanyangliufeng/xiaoshuo.html/spanbrspan class="hljs-comment"12/span/code/pre/p
p此地址是我们要检索的小说的目录页面的地址. 该页*敏*感*词*有我们要爬网的所有页面的链接地址,因此方便我们进行首页和末页以及页面之间的地址法./p
p02-2-2,第一页链接地址:/p
ppre class="syl-page-code hljs apache"codespan class="hljs-comment"# 第一个页面链接地址/spanbrspan class="hljs-comment"http://www.quanben5.com/n/chuimianbuhanyangliufeng/17482.html/spanbrspan class="hljs-comment"12/span/code/pre/p
p02-2-3,第2-5页链接地址:/p
ppre class="syl-page-code hljs shell"codespan class="hljs-meta"#/spanspan class="bash" 第二个页面链接地址:/spanbrspan class="bash"http://www.quanben5.com/n/chuimianbuhanyangliufeng/17483.html/spanbrspan class="bash"span class="hljs-comment"# 第三个页面链接地址:/span/spanbrspan class="bash"span class="hljs-comment"http://www.quanben5.com/n/chuimianbuhanyangliufeng/17484.html/span/spanbrspan class="bash"span class="hljs-comment"# 第四个页面链接地址:/span/spanbrspan class="bash"span class="hljs-comment"http://www.quanben5.com/n/chuimianbuhanyangliufeng/17485.html/span/spanbrspan class="bash"span class="hljs-comment"# 第五个页面链接地址:/span/spanbrspan class="bash"span class="hljs-comment"http://www.quanben5.com/n/chuimianbuhanyangliufeng/17486.html/span/spanbrspan class="bash"span class="hljs-comment"12345678/span/span/code/pre/p
pimg src='https://p6-tt.byteimg.com/origin/pgc-image/c69a70ccbe854505822464c15308383c?from=pc' alt='Python大佬精选教材,一步一步教你从零开始学会采集小说'//p
p02-2-4,最后一页的链接地址:/p
ppre class="syl-page-code hljs apache"codespan class="hljs-comment"# 最后一个页面链接地址:/spanbrspan class="hljs-comment"http://www.quanben5.com/n/chuimianbuhanyangliufeng/17649.html/spanbrspan class="hljs-comment"12/span/code/pre/p
pimg src='https://p3-tt.byteimg.com/origin/pgc-image/f547f9cc75e747f9aaa0818cdd8aff5a?from=pc' alt='Python大佬精选教材,一步一步教你从零开始学会采集小说'//p
p02-2-5. 分析结果/p
p从上面的链接地址中,我们可以看到这本小说的所有网页地址都是/p
p到/p
p结束了,我们可以将其与上一个进行比较/p
p*****. html都是一样的,只有最后五个值不同,并且每一页都有+1的变化规律,因此我们就知道了所有页面的规律起始条件和结束条件./p
p02-2-6. 获取所有页面的代码/p
ppre class="syl-page-code hljs ini"codespan class="hljs-attr"urllist/span = [span class="hljs-string"'http://www.quanben5.com/n/chuimianbuhanyangliufeng/{}.html'/span.format(page) for page in range(span class="hljs-number"17644/span,span class="hljs-number"17650/span)]br/code/pre/p
p此列表理解功能将所有页面保存在urllist列表中./p
p02-3,页面处理02-3-1,页面分析1/p
p打开文章,右键单击以检查!/p
pimg src='https://p1-tt.byteimg.com/origin/pgc-image/f5163b6ff6aa477a9818c62bfd941491?from=pc' alt='Python大佬精选教材,一步一步教你从零开始学会采集小说'//p
p了解标签的内容所在的标签,单击代码左上角的小箭头,然后选择要在网页中查看内容的区域,然后在找到后进行分析//p
pimg src='https://p6-tt.byteimg.com/origin/pgc-image/34d521279aff407fa5bc7263b8ee7c58?from=pc' alt='Python大佬精选教材,一步一步教你从零开始学会采集小说'//p
p02-3-2,文章标题分析:/p
pimg src='https://p3-tt.byteimg.com/origin/pgc-image/ce25ad97ba7342968abbe8e8cb6d863f?from=pc' alt='Python大佬精选教材,一步一步教你从零开始学会采集小说'//p
p经过分析,标题是页面中唯一的标签,并且class ='title',我们通过标题的这两个特征获得标题,然后获取标题的内容. (获取标题,该标题是内容所必需的,并且还可以用作保存文件的文件名)/p
p02-3-3. 获取标题代码实现:/p
ppre class="syl-page-code hljs go"code response = requests.get(url=pageurl,headers=headers,params=params)br reshtml = response.content.decode()brbr soup = BeautifulSoup(reshtml,span class="hljs-string"'lxml'/span)br br # 获取页面的标题所在标签,用到了***层级选择器****br titlelist = soup.span class="hljs-keyword"select/span(span class="hljs-string"'.content h1'/span)br br # 获取标签里面的标题内容,因为标签是保存的一个列表里面,要先取出来,br # 然后用span class="hljs-string"`.get_text()`/span获取到其中的内容br title_text = titlelist[span class="hljs-number"0/span].get_text()br br # 替换到标题里面的一些特殊符号,后面保存为文件名的时候,不允许,br # 这一个是后面代码运行之中出的错误,后面加上的。br title_text =title_text.replace(span class="hljs-string"'*'/span,span class="hljs-string"''/span)/code/pre/p
p02-3-4. 获得内容分析:/p
pimg src='https://p3-tt.byteimg.com/origin/pgc-image/122b722a5b8f4514871b2239c5907cb3?from=pc' alt='Python大佬精选教材,一步一步教你从零开始学会采集小说'//p
p通过分析,(见图),我们发现了以下几点:/p
p1. 小说的所有内容都在p标签中/p
p2. 此内容的p标签位于div标签中,其ID为“ content”./p
p基于以上两点,我们可以唯一地获取所有内容的p标签,然后将其获取到内部./p
p02-3-5,内容获取代码说明/p
ppre class="syl-page-code hljs cs"code response = requests.span class="hljs-keyword"get/span(url=pageurl,headers=headers,span class="hljs-keyword"params/span=span class="hljs-keyword"params/span)br reshtml = response.content.decode()brbr soup = BeautifulSoup(reshtml,span class="hljs-string"'lxml'/span)br span class="hljs-meta"# 获取到全部存在内容的标签,返回的是一个列表/spanbrspan class="hljs-meta" # 用到了***层级选择器***/spanbrspan class="hljs-meta" restextlist = soup.select('#content p')/spanbrspan class="hljs-meta" # 用for循环可以取出全部的标签,然后用.get_text()取出全部内容。/spanbrspan class="hljs-meta" for article_text in restextlist:/spanbrspan class="hljs-meta" article_text.get_text()/span/code/pre/p
p03. 其他内容分析: 03-1,标头请求标头/p
p在网页中,/p
p右键单击进行检查/p
p-----单击上方的网络/p
p----->检查保留日志
----->然后刷新页面
----->查找以“名称”刷新的消息(概率为“是”)(这是此网页,可以找到它)
----->单击右侧的标题信息
----->转到底部的请求标头请求标头信息
----->在其中找到User-Agent信息,然后将其复制并粘贴到代码中. 这里存储了很多信息. 如果您不携带它,则很有可能无法请求该网页.
03-2. 使用参数代理池的原因:
如果您快速且频繁地从相同的IP地址请求网站,则网站会将其视为恶意请求,进行抓取等,然后受到IP禁令等的限制. 让您不要抓取信息.
解决方案
使用代理池,(这是一个正向代理. 反向代理使用Nginx自己了解它. 前者是浏览器的代理,后者是服务器的代理. )然后选择从代理池中随机获取IP地址用于访问时,每次请求的IP地址都不同. 在这种情况下,另一方无法检测到异常.
快速代理
此网站收录大量免费的高秘密代理,可以使用,而对方无法检测到该ip!
03-3,其他
如果上面仍然不能请求该页面,那么您将继续在“请求标头”请求标头中继续携带该信息. 让其他人认为您是浏览器.
04,完整代码
import requests
from bs4 import BeautifulSoup
import random
# 全部网页列表,后面进行循环取出页面,然后处理
urllist = ['http://www.quanben5.com/n/chuimianbuhanyangliufeng/{}.html'.format(page) for page in range(17482,17650)]
# 请求头
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36"
}
# 正向代理,代理池。
# 如果一个ip地址,快速,一直请求的话,会被网页认为是爬虫,然后把你的ip地址封禁了。。所以用正向代理。。然后在下面用random模块,随机取出一个ip地址进行请求!
paramslist = ['121.232.199.237:9000','125.108.67.254:9000','123.163.118.102:9999',
'125.108.67.254:9000','171.35.172.151:9999','123.101.231.234:9999',
'125.108.67.254:9000','123.163.118.102:9999','171.35.172.151:9999',
'123.101.231.234:9999','113.195.16.16:9999','175.44.109.145:9999',
'125.108.85.141:9000','175.43.32.21:9999','183.166.103.22:9999',
'125.110.96.80:9000','123.160.69.100:9999','112.111.217.69:9999',
'1.199.30.133:9999','123.55.102.150:9999','120.83.104.196:9999',
'180.118.128.138:9000','163.204.95.253:9999','113.195.18.89:9999',
'113.195.16.191:9999','175.42.129.76:9999','125.110.124.214:9000',
'125.110.102.54:9000','36.249.119.16:9999','125.110.89.240:9000',
'171.35.146.70:9999','124.93.201.59:42672','171.35.173.112:9999']
# 从代理池里面,随机取出一个ip地址,进行访问
httpindex = random.randint(0,len(paramslist)-1)
params = {
'HTTP': paramslist[httpindex]
}
# for循环每一个列表,进行处理
for pageurl in urllist:
# 下面的两行就是看一个下载进度提示,没有意义
index1 = urllist.index(pageurl)+1
print("第{}下载".format(index1))
# 发送请求,获取页面
response = requests.get(url=pageurl,headers=headers,params=params)
reshtml = response.content.decode()
# 用bs4解析页面
soup = BeautifulSoup(reshtml,'lxml')
# 获取小说全部内容的标签
restextlist = soup.select('#content p')
# 获取小说标题的标签
titlelist = soup.select('.content h1')
# 获取标题的文字,然后进行特殊符号的替换,以免很后面文章命名文件出错
title_text = titlelist[0].get_text()
title_text =title_text.replace('*','')
print("正在下载---{}---".format(title_text))
# 打开文件,进行写入文章的全部的小说,文件命名就是“标题.txt”,写的方式'w',编码方式是'utf-8'
with open("./08novel/{}.txt".format(title_text),'w',encoding='utf-8') as f:
f.write(title_text+"\n")
# for循环获取的article_text 是带有内容的p标签
for article_text in restextlist:
# article_text.get_text()这一个才是p标签,获取其中的内容。换行
f.write(article_text.get_text()+"\n")
print("下载完成---{}---".format(title_text))
print("全部下载完成!")
05. 结论:
个人记录,初学者,了解更多,欢迎大家讨论!