Python:網頁的抓取、過濾和保存
- 2020 年 1 月 8 日
- 筆記
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)