今天我们来抓取不思得其姐的动态图以及进入全书网下载全部小说名及内容并保存到本地html文件当中,接下来我们直接上案例(具体注释在代码中已经标明)
案例一:爬取不思姐的动态图
源码效果图分析:

8.png
经过观察源代码,我们可以编写请求方式和正则表达式了:
import requests
import re
import urllib.request
import os
#模拟成浏览器
headers = { "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36" }
#爬取不思姐的动态图
def req_busijie_gif(page):
url = "http://www.budejie.com/video/"+ str(page)#拼接请求链接
html = requests.get(url, headers=headers)#请求网页源码
html.encoding = "utf-8" #设置编码
response = html.text #转换成文本
#编写获取gif格式的整整则表达式
# . 除了换行符和制表符以外的其他任何单个字符
# * 前面的表达式出现任意次
# ? 非贪婪模式
# () 建立索引:取出来就家小括号
reg = r'<img .*? data-original="(http://[^\s)";]+\.(gif))"' #.*? 匹配除了换行符和制表符以外的其他任意多个字符
gif_list = re.compile(reg, re.S).findall(response)#获取动态图链接
x = 1 #用于标记写入了第几张图片
for gif in gif_list:
print("正在下载第 "+ str(page) +" 页的第 "+str(x)+" 张动态图...")
urllib.request.urlretrieve(gif[0],'video/%s' %gif[0].split('/')[-1])#写入本地,如果是mp4也是一样的操作
x += 1
#调用
for i in range(1, 7):
req_busijie_gif(i)
执行完之后效果图如下:

9.png
其实上面这个例子和前面爬取静态图片的方式是一模一样的,这里要注意一下,如果是 mp4 的话也是一样的,嘿嘿,接下来我们就写一个比较深入一点的案例,爬取全书网的小说章节:
首先观察军事类全书网的分类列表效果图:

10.png
找到规律之后我们接下来先获取 小说名 和 对应的链接:
#定义抓取分类列表函数
def request_type_list():
url = "http://www.quanshuwang.com/list/7_1.html" #如果全部爬取的话可以拼接 url
response = requests.get(url, headers=headers)#请求
response.encoding = "GBK" #设置编码
html = response.text #转换成文本格式
#编写正则表达式获取标题和链接
reg = r'<a target="_blank" title="(.*?)" href="(.*?)" class="clearfix stitle">'
return re.compile(reg, re.S).findall(html) #编译获取并以列表的形式返回
接下来我们点击任意小说的链接来到介绍界面,效果图如下:

11.png
点击“开始阅读”按钮来到章节列表页面,效果图如下:

12.png
通过观察以上的两个效果图,我们可以定义我们的函数和编写我们的正则表达式了:
#根据分类列表获取“开始阅读”链接,再获取章节标题和链接
def request_beginurl_zhangjie_list(url):
response = requests.get(url, headers=headers)
response.encoding = "GBK"
html = response.text
reg = r'<div class="b-oper".*?<a href="(.*?)" class="reader"' #获取“开始阅读”按钮链接
data1 = re.compile(reg, re.S).findall(html)[0]
response = requests.get(data1, headers=headers) #请求"开始阅读"链接
response.encoding = "GBK"
html = response.text
reg = r'<li><a href="(.*?)" title="(.*?)">.*?</a></li>' #获取章节标题和对应的内容链接
data2 = re.compile(reg, re.S).findall(html)
return data2
然后我们在观察下各章节的内容页面效果图:

13.png
根据效果图编写获取章节内容的函数和正则:
#获取章节内容
def request_content(url):
response = requests.get(url, headers=headers)#获取源代码
response.encoding = "GBK" #设置编码
html = response.text #转换成文本
reg = r'<script type="text/javascript">style5\(\);</script>(.*?)<script type="text/javascript">style6' #获取章节内容正则表达式
return re.compile(reg, re.S).findall(html)
函数都定义好了,最后我们可以调用他们了:
#函数调用
for name, url in request_type_list():
path = os.path.join("novel", name) #拼接
if not os.path.exists(path): #判断文件是否存在
os.mkdir(path) #创建文件夹
print('创建文件夹成功')
else:
print("文件夹已经存在,跳过。。。")
continue
for href, title in request_beginurl_zhangjie_list(url):
t = title.split(',')[0]
print(t, href)
content = request_content(href)
#print(content)
#将内容写入本地的html文件中
try:
with open(os.path.join(path, t +".html"), "w") as f:
f.write(content[0])
except requests.exceptions.ConnectionError as e:
print(e)
except Exception as e:
print(e)
break#去掉退出的话就爬取整个分类列表中的小说
最后的效果图如下:

14.png
好了,经过那么那么多案例的讲解,相信同学们也掌握了爬取静态网页中的数据了,至于动态的网页数据以及如何入库会在接下来整理 Scrapy 框架的时候会写到,请同学们多多给建议哦,嘿嘿!
网友评论