孤荷凌寒自學python第八十二天學習爬取圖片2html
(完整學習過程屏幕記錄視頻地址在文末)python
今天在昨天基本嘗試成功的基礎上,繼續完善了文字和圖片的同時爬取並存放在word文檔中。web
1、我準備爬取一個有文字也有圖片的博客頁面編程
https://www.cnblogs.com/forever-snow/p/8506746.html服務器
2、具體代碼cookie
```網絡
import requestsapp
from bs4 import BeautifulSoupcurl
import re編程語言
import datetime
import pymongo
import os
from contextlib import closing
from docx.shared import RGBColor #將三個數值生成色彩對象
import _mty
import _mf
import _mbs4
import _mmongo
import _mre
import _mdb
import _mword
import _mrequests
intc=0
def msgbox(info,titletext='孤荷凌寒的DB模塊對話框QQ578652607',style=0,isShowErrMsg=False):
return _mty.msgboxGhlh(info,titletext,style,isShowErrMsg)
#定義一個讀取完成單個博客園頁面的函數
def getapage(strurl,strsavepath,strsavefile):
os.makedirs(strsavepath, exist_ok=True)
doc=_mword.newDocX(strsavepath + strsavefile)
doc.add_paragraph(strurl)
header={
'accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'accept-encoding':'gzip, deflate, br',
'accept-language':'zh-CN,zh;q=0.9',
'cache-control':'max-age=0',
'cookie':'__gads=ID=40b6d57596e7429a:T=1538208840:S=ALNI_MbWvfR21-XDCnnRMC6w1ipz5pL1hw; _ga=GA1.2.1676220267.1545396991; UM_distinctid=16813a77ccd322-03ef758a8d4e-3c604504-144000-16813a77cce8fa; CNZZDATA1256907=cnzz_eid%3D1198885933-1546517969-%26ntime%3D1546518138; CNZZDATA1257640778=1118534197-1547552369-https%253A%252F%252Fwww.baidu.com%252F%7C1547607403; _gid=GA1.2.1292942896.1547814253',
'referer':'https://www.baidu.com/link?url=qbb-FNVuosS5gMXV4E6kyu5UdwHX8ywZFIRl0iHiHm-yiTe8Lr5quxi7vcCXAS1yonIvrk58Sagt0tNVIsZDeK&wd=&eqid=c2293eaa0002eede000000055c42f402',
'upgrade-insecure-requests':'1',
'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
}
r=requests.get(strurl,headers=header)
r.raise_for_status() #raise異常自動拋出,若是讀取的Url服務器端返回400或500及後的錯誤,那麼,則會拋出異常後,再也不向後執行
r.encoding='utf-8'
bs=BeautifulSoup(r.text,'lxml')
htmldiv=bs.select('#cnblogs_post_body')[0]
#htmldiv=htmldiv.parent
#msgbox(str(type(htmldiv)))
for m,i in enumerate(list(htmldiv.find_all(['p','div']))):
strcontent=i.get_text()
_mword.addPToDocx(doc,strcontent)
imgs=i.find_all('img')
for k,j in enumerate(list(imgs)):
strpicurl=j['src']
lsttemp=strpicurl.split('.')
strhouzui='.' + lsttemp[-1]
strpicfilenm=strsavepath + '%d03' %m + '%d03' %k + strhouzui
try:
_mrequests.downloadPicGhlhStream(strpicurl,header,strpicfilenm)
doc.add_picture(strpicfilenm)
except:
pass
doc.save(strsavepath + strsavefile)
#downloadpicfirst()
getapage('https://www.cnblogs.com/forever-snow/p/8506746.html','I:\\MAKEAPP\\python\\Python365\\邊學習邊測試文件夾\\自學PYTHON部分\\0082第八十二天同時將圖片和文字爬取下來2\\docs\\','001.docx')
```
3、對昨天處理圖片的方法進行了封裝:
【_mrequest.py】
```
import requests
from bs4 import BeautifulSoup
import re
import datetime
from contextlib import closing
import _mty
import _mf
import _mbs4
import _mre
mrequestsErrString='' #供其它模塊使用的全局變量了,實時保存了各函數執行時的錯誤信息
def msgbox(info,titletext='孤荷凌寒的requests模塊對話框QQ578652607',style=0,isShowErrMsg=False):
return _mty.msgboxGhlh(info,titletext,style,isShowErrMsg)
#使用content的寫法,速度要慢得多
def downLoadPicGhlhContent(strpicurl,header,strsavefile,isShowMsg=False):
try:
r=requests.get(strpicurl,headers=header)
r.raise_for_status() #raise異常自動拋出,若是讀取的Url服務器端返回400或500及後的錯誤,那麼,則會拋出異常後,再也不向後執行
#下一句指定了讀取網頁時要使用的編碼格式
r.encoding=r.apparent_encoding #requests的返回結果對象裏有個apparent_encoding函數, apparent_encoding經過調用chardet.detect()來識別文本編碼. 可是須要注意的是,這有些消耗計算資源.
#r.encoding='utf-8'
with open(strsavefile,'wb') as f:
f.write(r.content) #content屬性與text屬性不一樣
#---------------------------------------------
except Exception as e:
mrequestsErrString='經過讀取圖片content方式寫入本地下載圖片時出錯:' + str(e) + '\n此函數由【孤荷凌寒】建立,QQ578652607'
if isShowMsg==True:
msgbox(mrequestsErrString)
return None
else:
pass
finally:
pass
#使用流模式的寫法,速度快得多
def downloadPicGhlhStream(strpicurl,header,strsavefile,isShowMsg=False):
try:
r=requests.get(strpicurl,headers=header,stream=True)
r.raise_for_status() #raise異常自動拋出,若是讀取的Url服務器端返回400或500及後的錯誤,那麼,則會拋出異常後,再也不向後執行
#流模式不須要指定編碼格式
#下一行用意在於,在寫完流以後,自動關閉流
with closing(requests.get(strpicurl,headers=header,stream=True)) as r:
with open(strsavefile,'wb') as f:
#將流分紅n個部分寫入,每一個部分分紅128字節
for chunk in r.iter_content(128): #這一句vscode報錯,可是假的報錯
f.write(chunk)
except Exception as e:
mrequestsErrString='經過讀取圖片 數據流 方式寫入本地下載圖片時出錯:' + str(e) + '\n此函數由【孤荷凌寒】建立,QQ578652607'
if isShowMsg==True:
msgbox(mrequestsErrString)
return None
else:
pass
finally:
pass
```
4、一些發現
html標籤對象的children屬性並不能返回全部子級對象,還得使用find_all方法才行。
最開始我使用:
htmldiv.children
沒有成功,後來改成:
htmldiv.find_all(['p','div'])
——————————
今天整理的學習筆記完成,最後例行說明下個人自學思路:
根據過去多年我自學各類編程語言的經歷,認爲只有真正體驗式,解決實際問題式的學習纔會有真正的效果,即讓學習實際發生。在2004年的時候我開始在一個鄉村小學自學電腦 並學習vb6編程語言,沒有學習同伴,也沒有高師在上,甚至電腦都是孤島(鄉村那時尚未網絡),有的只是一本舊書,在痛苦的自學摸索中,我找到適應本身零基礎的學習方法:首先是每讀書的一小節就做相應的手寫筆記,第二步就是上機測試每個筆記內容是否實現,其中會發現書中講的其實有出入或錯誤,第三步就是在上機測試以後,將筆記改成電子版,造成最終的修訂好的正確無誤的學習筆記 。
經過反覆嘗試錯誤,在那個沒有分享與交流的黑暗時期我摸黑學會了VB6,爾後接觸了其它語言,也曾聽過付費視頻課程,結果發現也許本身學歷果真過低,就算是零基礎的入門課程,其實也難以跟上進度,講師的教學多數出現對初學者的實際狀況並不瞭解的狀況,何況學習者的個體也存在差別呢?固然更可怕的是收費課程的價格每每是本身難以承受的。
因而個人全部編程學習都改成了自學,繼續本身的三步學習筆記法的學習之路。
固然自學的最大問題是會走那麼多的彎路,沒有導師直接輸入式的教學來得直接,好在網絡給咱們帶來無限搜索的機會,你們在網絡上的學習日誌帶給咱們共享交流的機會,而QQ羣等交流平臺、網絡社區的成立,咱們能夠一塊兒自學,互相批評交流,也能夠得到更有效,更自主的自學成果。
因而我以人生已過半的年齡,決定繼續個人編程自學之路,開始學習python,只但願與你們共同交流,一我的的獨行是可怕的,只有一羣人的共同前進纔是有但願的。
誠摯期待您的交流分享批評指點!歡迎聯繫我加入從零開始的自學聯盟。
這個時代互聯網成爲了一種基礎設施的存在,因而原本在孤獨學習之路上的咱們變得再也不孤獨,由於網絡就是一個新的客廳,咱們時刻均可以進行沙龍活動。
很是樂意能與你們一塊兒交流本身自學心得和發現,更但願你們可以對我學習過程當中的錯誤給予指點——是的,這樣我就能有許多免費的高師了——這也是分享時代,社區時代帶來的好福利,我相信你們會的,是吧!
根據徹底共享的精神,開源互助的理念,個人我的自學錄製過程是所有按4K高清視頻錄製的,從手寫筆記到驗證手寫筆記的上機操做過程全程錄製,但由於4K高清文件太大均超過5G以上,因此沒法上傳至網絡,若有須要可聯繫我QQ578652607對傳,樂意分享。上傳分享到百度網盤的只是壓縮後的720P的視頻。
個人學習過程錄像百度盤地址分享以下:(清晰度:1280x720)
連接:https://pan.baidu.com/s/1yC6d_VJ8dbSD1mwsRmCvcQ
提取碼:1s5m
Bilibili:
https://www.bilibili.com/video/av41236139/
喜馬拉雅語音筆記: