日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python 爬虫 博客园_Python爬虫爬取博客园作业

發(fā)布時間:2023/12/10 python 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 爬虫 博客园_Python爬虫爬取博客园作业 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

分析一下他們的代碼,我在瀏覽器中對應(yīng)位置右鍵,然后點(diǎn)擊檢查元素,可以找到對應(yīng)部分的代碼。但是,直接查看當(dāng)前網(wǎng)頁的源碼發(fā)現(xiàn),里面并沒有對應(yīng)的代碼。我猜測這里是根據(jù)服務(wù)器上的數(shù)據(jù)動態(tài)生成的這部分代碼,所以我們需要找到數(shù)據(jù)文件,以便向服務(wù)器申請,得到這部分資源。

在剛才查看元素的地方接著找數(shù)據(jù)文件,在Network里面的文件中很順利的就找到了,并在報文中拿到了URL和請求方法。

查看一下這個文件發(fā)現(xiàn)是JSON文件,那樣的話難度就又降低了,因?yàn)镻ython中有json庫,解析json的能力很強(qiáng)。可以直接將json轉(zhuǎn)換為字典和列表類型。

在這里我簡單介紹一下數(shù)據(jù)解析的過程吧。首先,我將爬取到的json文本轉(zhuǎn)換成某種數(shù)據(jù)類型,具體由數(shù)據(jù)決定,一般不是字典就是列表。查看類型發(fā)現(xiàn)是字典,且字典中有三個key值,而我們需要的key在一個叫data的key中。

而data中的數(shù)據(jù)是一個學(xué)生信息的列表類型,列表的每個元素都是一個字典,包括學(xué)生姓名,學(xué)號等信息。可以利用下標(biāo)獲取列表元素,并用key值得到你想拿到的信息。比如,利用Url得到網(wǎng)頁鏈接。

這時候我們爬取需要的信息的準(zhǔn)備工作可以說是結(jié)束了,我們拿到了數(shù)據(jù)的URL,并且知道了數(shù)據(jù)類型和數(shù)據(jù)結(jié)構(gòu)。于是,我們只需要用requests庫爬一下這個頁面,然后用json解析一下,并且篩選有用的信息就好了。

(沒用到BeautifulSoup和re庫有點(diǎn)小失落)

接下來就是創(chuàng)建文件,就沒有什么難度了。只是在為每個學(xué)生創(chuàng)建文件的時候注意一下,創(chuàng)建好以后及時的回到上層目錄,否則,可能會讓文件一層層的嵌套下去。

代碼

#-*- coding:utf-8 -*-

importrequestsimportjsonimportos#抓取頁面

url = 'https://edu.cnblogs.com/Homework/GetAnswers?homeworkId=2420&_=1542959851766'

try:

r= requests.get(url,timeout=20)

r.raise_for_status()

r.encoding=r.apparent_encodingexcept:print('網(wǎng)絡(luò)異常或頁面未找到,請重試')#利用json拿到數(shù)據(jù)列表,每個列表元素都是字典

datas = json.loads(r.text)['data']

result= ""

#數(shù)據(jù)處理

for data indatas:

result+= str(data['StudentNo'])+','+data['RealName']+','+data['DateAdded'].replace('T',' ')+','+data['Title']+','+data['Url']+'\n'

#寫入文件

with open('hwlist.csv','w') as f:

f.write(result)#創(chuàng)建文件夾hwFolder

os.mkdir('hwFolder')

os.chdir('hwFolder')#創(chuàng)建每個學(xué)生的作業(yè)文件

for data indatas:#創(chuàng)建目錄

os.mkdir(str(data['StudentNo']))

os.chdir(str(data['StudentNo']))#抓取頁面

try:

webmsg= requests.get(data['Url'],timeout=20)

webmsg.raise_for_status()

webmsg.encoding=webmsg.apparent_encodingexcept:print('網(wǎng)絡(luò)異常或頁面未找到,請重試')#保存抓到的頁面

with open(str(data['StudentNo'])+'.html','wb') as f:

f.write(webmsg.content)

os.chdir(os.path.pardir)

部分結(jié)果展示

上圖是hwlist.csv文件的部分結(jié)果(Excel下打開)

玩?zhèn)€稍復(fù)雜點(diǎn)的

像之前那樣爬取頁面的話,其實(shí)是有點(diǎn)問題的。首先,我們只是爬取了頁面的內(nèi)容,但是并沒有抓取到頁面的樣式,頁面顯示會不太正常,排版混亂。其次,頁面中還有圖片等元素都不會顯示出來。而且,如果遇到網(wǎng)絡(luò)問題代碼需要再次運(yùn)行的時候還會遇到一個問題,那就是目錄已經(jīng)存在了,我們在創(chuàng)建目錄就會失敗。除此之外還是有不少問題的,此處我先解決之前說到的幾個問題。即顯示問題和目錄問題。

如何解決我提到的這些問題呢,目錄問題我使用了一種比較容易實(shí)現(xiàn)的方案,那就是先判斷當(dāng)前目錄是否存在,如果不存在就創(chuàng)建目錄,否則就什么都不做。至于文件,暫定的方法是直接覆蓋。顯示問題也比較好解決,抓取網(wǎng)頁和抓取樣式或者網(wǎng)頁其實(shí)都一樣,就是用URL發(fā)送一個請求,來獲得這個資源,其實(shí)和抓取HTML相比,就是文件格式不太一致。

以抓取樣式表(CSS)為例,樣式的URL怎么獲取呢?有一些樣式是在一個叫做Link的標(biāo)簽的href屬性里,這里面就是外聯(lián)樣式存儲的位置。把它提取出來,請求這個樣式,并且修改原來的href屬性為抓到的文件在自己電腦上的保存位置即可。這樣的話即可保證抓到的CSS可以正常使用,確保排版正確。

當(dāng)然了,即使這樣,和原本的網(wǎng)頁也是有差別的,因?yàn)樽ト〉降馁Y源還是不夠,和瀏覽器中獲得的元素對比一下就會發(fā)現(xiàn)還差不少。鑒于本人能力有限,這里就補(bǔ)充一下爬取外聯(lián)CSS和圖片的內(nèi)容,感興趣的可以看一看。

Tips:這里解析HTML頁面借助了強(qiáng)大的BeautifulSoup4庫(解析標(biāo)簽和玩一樣)和re庫,使工作量減少了不少。(安裝bs4庫: pip install BeautifulSoup4)

#-*- coding:utf-8 -*-

importrequestsimportjsonimportosimportrefrom bs4 importBeautifulSoupdef getHtml(url,timeout=110):try:

res=requests.get(url,timeout)

res.raise_for_status()

res.encoding=res.apparent_encodingreturnresexcept:print('網(wǎng)絡(luò)異常,'+url+"爬取失敗")def saveFile(name,content,mode='w'):try:

with open(name,mode) as f:

f.write(content)except:print("文件"+name+"創(chuàng)建失敗")defgetSource(text):#抓取樣式

root_url = 'https://www.cnblogs.com'soup= BeautifulSoup(text,'html.parser')for i in soup('link'):

css_list= [css for css in i['href'].split('/') if 'css' incss]if css_list!=[]:

filename= re.search(r'.*css',css_list[0]).group(0)

r= requests.get(root_url+i['href'])

saveFile(filename,r.content,'wb')

text= text.replace(i['href'],'Source/'+filename)#抓取圖片 用戶自己插入的圖片和網(wǎng)站自己生成的圖片都抓

#用戶自己插的那些格式很亂……用戶自己搞的東西就是個坑

for i in soup('img'):try:

img_list= [img for img in i['src'].split('/') if 'gif' in img or 'png' in img or 'jpeg' inimg]except KeyError :#某用戶自己改了HTML代碼 得讓我單獨(dú)判斷一下

img_list =[]if img_list!=[]:

filename=img_list[0]try:

r= requests.get(root_url+i['src'])

r.raise_for_status()except:if not 'http' in i['src']:

r= requests.get("https:"+i['src'])else:#又是某用戶寫博客用了HTML編輯器,寫的還不對

r = requests.get(i['src'])

saveFile(filename,r.content,'wb')

text= text.replace(i['src'],'Source/'+filename)#text用于修改原始的頁面鏈接,保證本地可以正常查看頁面

returntext#############################主程序#############################抓取頁面 并得到數(shù)據(jù)

r = getHtml('https://edu.cnblogs.com/Homework/GetAnswers?homeworkId=2420&_=1542959851766')

datas= json.loads(r.text)['data']#處理數(shù)據(jù)并將數(shù)據(jù)寫入文件

result = ""

for data indatas:

result+= str(data['StudentNo'])+','+data['RealName']+','+data['DateAdded'].replace('T',' ')+','+data['Title']+','+data['Url']+'\n'saveFile('hwlist.csv',result,'w')#創(chuàng)建文件夾hwFolder

if not os.path.exists('hwFolder'):

os.mkdir('hwFolder')

os.chdir('hwFolder')#創(chuàng)建每個學(xué)生的作業(yè)文件

for data indatas:#創(chuàng)建目錄

if not os.path.exists(str(data['StudentNo'])):

os.mkdir(str(data['StudentNo']))

os.chdir(str(data['StudentNo']))#抓取頁面

webmsg = requests.get(data['Url'])print('當(dāng)前的URL:'+data['Url'])#等待的過程有字出來不會無聊

#頁面的一些資源

if not os.path.exists('Source'):

os.mkdir('Source')

os.chdir('Source')

webtext=getSource(webmsg.text)

os.chdir(os.path.pardir)

saveFile(str(data['StudentNo'])+'.html',webtext.encode(),'wb')

os.chdir(os.path.pardir)

如果你的網(wǎng)絡(luò)沒問題,講道理,應(yīng)該不會拋異常。接下來找個頁面看看效果吧:

排版抓出來了,挺炫的,當(dāng)然,圖片也抓了。

考慮到有人會HTML,我把被程序調(diào)整后的HTML代碼找一個給大家看看,箭頭指向的地方都是程序自己改過的地方:

其實(shí),雖然現(xiàn)在又和原頁面接近了不少,但是……我暫時沒有時間繼續(xù)完善了,以后還會繼續(xù)完善。給大家一個原博客的圖片,你會我先我還是少了些東西。暫時先這樣吧。

總結(jié)

以上是生活随笔為你收集整理的python 爬虫 博客园_Python爬虫爬取博客园作业的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。