今天我們來抓取不思得其姐的動態(tài)圖以及進入全書網(wǎng)下載全部小說名及內(nèi)容并保存到本地html文件當(dāng)中扼劈,接下來我們直接上案例(具體注釋在代碼中已經(jīng)標明)
案例一:爬取不思姐的動態(tài)圖
源碼效果圖分析:
經(jīng)過觀察源代碼,我們可以編寫請求方式和正則表達式了:
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" }
#爬取不思姐的動態(tài)圖
def req_busijie_gif(page):
url = "http://www.budejie.com/video/"+ str(page)#拼接請求鏈接
html = requests.get(url, headers=headers)#請求網(wǎng)頁源碼
html.encoding = "utf-8" #設(shè)置編碼
response = html.text #轉(zhuǎn)換成文本
#編寫獲取gif格式的整整則表達式
# . 除了換行符和制表符以外的其他任何單個字符
# * 前面的表達式出現(xiàn)任意次
# ? 非貪婪模式
# () 建立索引:取出來就家小括號
reg = r'<img .*? data-original="(http://[^\s)";]+\.(gif))"' #.*? 匹配除了換行符和制表符以外的其他任意多個字符
gif_list = re.compile(reg, re.S).findall(response)#獲取動態(tài)圖鏈接
x = 1 #用于標記寫入了第幾張圖片
for gif in gif_list:
print("正在下載第 "+ str(page) +" 頁的第 "+str(x)+" 張動態(tài)圖...")
urllib.request.urlretrieve(gif[0],'video/%s' %gif[0].split('/')[-1])#寫入本地,如果是mp4也是一樣的操作
x += 1
#調(diào)用
for i in range(1, 7):
req_busijie_gif(i)
執(zhí)行完之后效果圖如下:
其實上面這個例子和前面爬取靜態(tài)圖片的方式是一模一樣的暇咆,這里要注意一下嫁审,如果是 mp4 的話也是一樣的特笋,嘿嘿则剃,接下來我們就寫一個比較深入一點的案例,爬取全書網(wǎng)的小說章節(jié):
首先觀察軍事類全書網(wǎng)的分類列表效果圖:
找到規(guī)律之后我們接下來先獲取 小說名 和 對應(yīng)的鏈接:
#定義抓取分類列表函數(shù)
def request_type_list():
url = "http://www.quanshuwang.com/list/7_1.html" #如果全部爬取的話可以拼接 url
response = requests.get(url, headers=headers)#請求
response.encoding = "GBK" #設(shè)置編碼
html = response.text #轉(zhuǎn)換成文本格式
#編寫正則表達式獲取標題和鏈接
reg = r'<a target="_blank" title="(.*?)" href="(.*?)" class="clearfix stitle">'
return re.compile(reg, re.S).findall(html) #編譯獲取并以列表的形式返回
接下來我們點擊任意小說的鏈接來到介紹界面虚循,效果圖如下:
點擊“開始閱讀”按鈕來到章節(jié)列表頁面由桌,效果圖如下:
通過觀察以上的兩個效果圖,我們可以定義我們的函數(shù)和編寫我們的正則表達式了:
#根據(jù)分類列表獲取“開始閱讀”鏈接邮丰,再獲取章節(jié)標題和鏈接
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>' #獲取章節(jié)標題和對應(yīng)的內(nèi)容鏈接
data2 = re.compile(reg, re.S).findall(html)
return data2
然后我們在觀察下各章節(jié)的內(nèi)容頁面效果圖:
根據(jù)效果圖編寫獲取章節(jié)內(nèi)容的函數(shù)和正則:
#獲取章節(jié)內(nèi)容
def request_content(url):
response = requests.get(url, headers=headers)#獲取源代碼
response.encoding = "GBK" #設(shè)置編碼
html = response.text #轉(zhuǎn)換成文本
reg = r'<script type="text/javascript">style5\(\);</script>(.*?)<script type="text/javascript">style6' #獲取章節(jié)內(nèi)容正則表達式
return re.compile(reg, re.S).findall(html)
函數(shù)都定義好了冠摄,最后我們可以調(diào)用他們了:
#函數(shù)調(diào)用
for name, url in request_type_list():
path = os.path.join("novel", name) #拼接
if not os.path.exists(path): #判斷文件是否存在
os.mkdir(path) #創(chuàng)建文件夾
print('創(chuàng)建文件夾成功')
else:
print("文件夾已經(jīng)存在译秦,跳過。。耸黑。")
continue
for href, title in request_beginurl_zhangjie_list(url):
t = title.split('吁系,')[0]
print(t, href)
content = request_content(href)
#print(content)
#將內(nèi)容寫入本地的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#去掉退出的話就爬取整個分類列表中的小說
最后的效果圖如下:
好了煤惩,經(jīng)過那么那么多案例的講解,相信同學(xué)們也掌握了爬取靜態(tài)網(wǎng)頁中的數(shù)據(jù)了笛质,至于動態(tài)的網(wǎng)頁數(shù)據(jù)以及如何入庫會在接下來整理 Scrapy 框架的時候會寫到,請同學(xué)們多多給建議哦捞蚂,嘿嘿妇押!
最后編輯于 :2018.04.30 22:48:26
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者