解读: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. 结论:

  个人记录,初学者,了解更多,欢迎大家讨论!

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线