Python:網頁的抓取、過濾和保存

Python:網頁的抓取、過濾和保存

環境:Python 2.7.3,win10

一、抓取

目的地是ZOL笑話大全 地址:http://xiaohua.zol.com.cn/new/2.html 網址的組成要靈活點,這個網站的地址後面是可變的,比如3.html、4.html 所以這樣搞:url=」http://xiaohua.zol.com.cn/new/%d.html」%(page) page是動態賦值的

導包:import urllib Python的urllib和urllib2模組都是做請求URL相關操作的。 它們最顯著的差異為: urllib2可以接受一個Request對象,並以此可以來設置一個URL的headers,但是urllib只接收一個URL。 urllib模組可以提供進行urlencode的方法,該方法用於GET查詢字元串的生成,urllib2的不具有這樣的功能. python 2.7.x提供了urllib與urllib2,鑒於上述異同兩個庫通常搭配使用。

抓取:urllib.urlopen(url).read() 因為這個網站不需要什麼東西就可以爬取,所以就這麼簡單一句話,複雜點的請參考這個:http://blog.csdn.net/u013632854/article/details/52970775

urllib.urlopen(url)是打開一個url的方法,返回一個文件對象,然後可以進行類似文件對象的操作,通過read()方法讀取內容

二、過濾 過濾就離不開正則表達式,這是一個誰也繞不開的惡夢 參考這個:http://www.ziqiangxuetang.com/python/python-reg-expressions.html

這裡分為兩部分

先import re re是負責正則表達式的

1、過濾

list=re.findall(r'<div class="summary-text">(.*?)</div>',html,re.I|re.M|re.S)

這個方法是查找字元串內所有匹配的內容,並以列表的形式返回 findall(正則表達式,要處理的字元串,可選內容)

描述 如下: re.I 使匹配對大小寫不敏感 re.L 做本地化識別(locale-aware)匹配 re.M 多行匹配,影響 ^ 和 $ re.S 使 . 匹配包括換行在內的所有字元 re.U 根據Unicode字符集解析字元。這個標誌影響 w, W, b, B. re.X 該標誌通過給予你更靈活的格式以便你將正則表達式寫得更.decode

正則處理的方法二:

    #過濾      #reg=r'<div class="summary-text">(.*?)</div>'      #方法1,需要轉換編碼      #re是python自帶的處理正則表達式的包      #獲取pattern對象來處理字元串      #pattern=re.compile(reg)      #這個是查找此字元串中所有符合條件的內容並返回一個列表      #list=pattern.findall(html)      #for item in list:      #網頁是gbk的,查找到之後的內容也是gbk的,要解碼      #   print item.decode('gbk')      #返回的內容為空,應該是匹配不成功,可以看下頁面返回的是否與你匹配的一致      #return pattern.findall(html)      #轉碼的方式      #print unicode(item,'gbk')      #print pattern.findall(html.decode('gbk').encode('utf-8'))

2、替換

list[index]=re.sub(r'<p>(.*?)</p>',"",list[index])

因為技術關係,沒能一次性過濾或者替換掉所有目標內容,唯有對數據進行多次處理,汗 此方法是替換掉匹配的內容,sub(正則表達式,要替換成什麼內容,待處理的字元串) 要替換成什麼內容這個我填的是空字元串

list=re.findall(r'<div class="summary-text">(.*?)</div>',html,re.I|re.M|re.S)          #過濾          for index in range(len(list)):              list[index]=re.sub(r'<p>(.*?)</p>',"",list[index])              list[index]=re.sub(r'<p>',"",list[index])              list[index]=re.sub(r'</p>',"",list[index])              list[index]=re.sub(r's*',"",list[index])+'r'              print list[index]          return list

三、保存 也就兩句話,打開一個文件,寫進去

txtFile=open('PaChongFile.txt','w')  txtFile.writelines(list)

參考這個http://www.ziqiangxuetang.com/python/python-files-io.html

總體程式碼如下:

_author_='iamzhuwh'  #coding=utf-8    import urllib  import re    class PaChong:        #初始化      def __init__(self,tagetUrl):          global txtFile          self.tagetUrl=tagetUrl          txtFile=open('PaChongFile.txt','w')        #輸入網址,返回內容列表      def getHtmlContent(self,html):          #爬取頁面的指定內容          list=re.findall(r'<div class="summary-text">(.*?)</div>',html,re.I|re.M|re.S)          #過濾          for index in range(len(list)):              list[index]=re.sub(r'<p>(.*?)</p>',"",list[index])              list[index]=re.sub(r'<p>',"",list[index])              list[index]=re.sub(r'</p>',"",list[index])              list[index]=re.sub(r's*',"",list[index])+'r'              print list[index]          return list        #獲取      def getHtml(self,url):          return urllib.urlopen(url).read()        #獲取url      def getHtmlUrl(self,html):          reg='<div.*?class="summary-text">.*?</div>'          reg_sub=r'<p></p>'          reg_sub2=r'<p>.*?</p>'          list=re.findall(reg,html,re.I|re.M|re.S)          print ""        def saveToFile(self,list):          try:              txtFile.writelines(list)          except IOError as err:              print('Error:'+str(err))          #finally:          #   txtFile.close()        #url遞歸      def urlRecursion(self,url):          print '待續'        def start(self,pageCount):          page=0          for index in range(pageCount):              if index==0:continue              page=index              url="http://xiaohua.zol.com.cn/new/%d.html"%(page)              self.saveToFile(self.getHtmlContent(self.getHtml(url)))    spider=PaChong(None)  spider.start(50)