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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python csdn博客_利用Python抓取CSDN博客

發布時間:2024/8/1 python 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python csdn博客_利用Python抓取CSDN博客 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這兩天發現了一篇好文章,陳皓寫的makefile的教程,具體地址在這里《跟我一起寫makefile》

這篇文章一共分成了14個部分,我看東西又習慣在kindle上面看,感覺一篇一篇地復制成txt文本太弱了,索性就用python寫了一個小爬蟲,把這些文章全部都下載下來。

這個程序主要可以分成這么幾塊內容,獲取,分析,轉換。

程序的整體結構如下圖所示:

get_html.py程序的功能就是實現獲取功能,將下載到的原始的html文件都存放到ori_html文件夾中。ana_html.py程序實現了上面的分析和轉換兩個功能,通過分析原始html文件,將包含正文的div塊提取出來,存放到div_html文件夾的html文件中,再利用lynx函數將這些html文本轉換成txt文本,存放到text文件夾中。

第一,獲取。

這一步做的事情就是把這幾篇文章的html文件全部都下載下來。這個就是構造一個http請求,然后請求回來一個html頁面就好了。需要注意的就是這幾篇文章存放路徑的編號。比如第一篇文章,它的鏈接是這個:http://blog.csdn.net/haoel/article/details/2886,最后編號是2886。第二篇文章的鏈接是這個:http://blog.csdn.net/haoel/article/details/2887。最后編號是2887。至于最后一篇文章,第14篇文章的鏈接是這個:http://blog.csdn.net/haoel/article/details/2899,最后的編號是2899。相信從這里大家可以看出規律來了吧,從第一篇文章到最后一篇文章,存放路徑的編號依次就是從2886到2899遞增。那我下載html頁面的時候,其實就是只要把這個編號不斷遞增,就可以把所有14篇文章都給下載下來了。具體代碼如下:

1 #!/usr/bin/env python

2 #-* - coding: UTF-8 -* -

3

4 importhttplib5 from time importsleep6

7 defwriteFile(html,list_num):8 filename = "./ori_html/htmlfile%d.html" %list_num9 file_obj = open(filename,"w")10 file_obj.write(html)11 file_obj.close()12 print "%s文件已經寫入" %filename13 defgetHTML(list_num):14 print '準備獲取%d號HTML文檔成功' %list_num15 url = "http://blog.csdn.net/haoel/article/details/%d" %list_num16 conn = httplib.HTTPConnection("blog.csdn.net")17 conn.request(method="GET",url=url)18 response =conn.getresponse()19 res=response.read()20 print '獲取%d號HTML文檔成功' %list_num21 writeFile(res,list_num)22 defgetHTMLs():23 for num in range(2886,2900):24 sleep(1)25 getHTML(num)26

27 getHTMLs()

主函數getHTMLs通過調用getHTML來下載多個頁面。每下載完一個頁面,就暫停一秒鐘,這是為了防止訪問速度過快,讓服務器認定這是攻擊行為,把本機IP給屏蔽掉了。getHTML函數就是根據不同的編號,下載不同的頁面,然后將下載到的頁面存放到ori_html文件夾中,意思就是原始的html文件(original html)。

第二,分析

上面把所有的html文件都給下載好了,但是并不是這個頁面的所有的內容都是我們想要的,我們只想要中間的正文部分,如下圖所示:

在這個頁面中我們只想要那個畫紅線的部分。

這個要具體怎么做呢,就是通過chrome分析原界面,可以看到中間的正文部分是通過一個id為article_content的div來表示的,如下圖所示,

我們只要把這個div給獲取出來了,那么就能得到正文內容了。

獲取了這個div之后,再把它存放到一個html文件中,然后再來通過lynx命令,就能把這個篇文章下載到本地了,具體代碼如下:

1 #!/usr/bin/env python

2 #-* - coding: UTF-8 -* -

3

4 from bs4 importBeautifulSoup5 importos6

7 defreadFile(filename):8 print "read the %s" %filename9 file_obj = open(filename,"r")10 html =file_obj.read()11 file_obj.close()12 returnhtml13

14 defwriteFile(html,list_num):15 filename = "./div_html/div_html_%d.html" %list_num16 ifos.path.exists(filename):17 print "%s 已經存在" %filename18 return -1

19 file_obj = open(filename,"w")20 print >>file_obj,html21 print "%s已經寫入" %filename22

23 defformFile(list_num):24 outnum = list_num - 2886 + 1

25 filename = "./div_html/div_html_%d.html" %list_num26 outname = "text/makefile_%d.txt" %outnum27 cmd = "lynx --dump %s > %s" %(filename,outname)28 os.system(cmd)29 print "%s已經寫入" %outname30

31 defmain():32 for num in range(2886,2900):33 filename = "./ori_html/htmlfile%d.html" %num34 if notos.path.exists(filename):35 print "%s donn't exist" %filename36 continue

37 html_doc =readFile(filename)38 soup =BeautifulSoup(html_doc)39 div_html = soup.find_all("div",id="article_content")40 writeFile(div_html[0],num)41 formFile(num)42

43 main()

在主函數中通過for循環依次遍歷每個文件,readFile函數的功能就是讀取html文件內的html代碼存放到html_doc里面。然后再通過bs4的find_all方法,找到id為article_content的div節點。這里返回的結果是一個tag元素列表,所以底下給writeFile函數傳遞的參數為div_html[0],將這個tag元素傳遞進去。

在writeFile函數中,將傳遞進來的tag元素的所有內容都寫入到div_html文件夾的文件中。然后再在formFile(格式化文件,format file)函數中,利用lynx命令,將這個包含正文的div轉換成txt文本,寫入到text文件夾的文本文件中去。

這里需要注意的一點就是writeFile函數中,將print函數打印的內容寫入文件的方法直接就是print >> 文件對象名,print的參數,這樣相當于做了一個數據流重定向,將本應打印到屏幕上的東西打印到文件中去了。

最后下載下來的文檔如下所示:

OK,就是這么多了。這個程序寫的比較倉促,感覺程序中還有許多冗余的地方,歡迎各位指正!

總結

以上是生活随笔為你收集整理的python csdn博客_利用Python抓取CSDN博客的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。