python爬蟲學習(1)-抓取糗事百科笑話

lsq_008發表於2017-02-10
最近在學習python的爬蟲,參照了http://cuiqingcai.com/990.html的內容,寫了一個爬蟲,抓取流程:傳入引數起始url和輸出檔名稱,使用urllib2對頁面進行抓取,每次抓取一個頁面,迴圈抓取,直到最後一頁。使用正規表示式對抓取到的頁面內容進行提取,並儲存到檔案中。程式如下:

# -*- coding: utf-8

import urllib2
import urllib
import re,os
import time
class Joke:
    #初始化資料
    def __init__(self,start_url,out_put_file):
        self.start_url = start_url
        self.out_put_file = out_put_file
        self.page = 2
        self.user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
        self.headers = { 'User-Agent' : self.user_agent }


    #獲取頁面內容的方法
    def get_cotent(self,page):
        try:
            url = self.start_url + str(page) + '/?s=4955352'
            request = urllib2.Request(url,headers=self.headers)
            response = urllib2.urlopen(request)
            act_url = response.geturl()
            print 'init url=',url,'act url=',act_url
            if url == act_url:
                content = response.read()
                return content
            else:
                return None
        except urllib2.URLError, e:
            if hasattr(e,"reason"):
                print u"連線糗事百科失敗,錯誤原因",e.reason
                return None


    #傳入頁面程式碼,返回笑話內容
    def get_joke(self,page):
        joke_content = self.get_cotent(page)
        str = ''
        if not joke_content:
            print "抓取完畢"
            return None
        pattern = re.compile('<div class="author clearfix">.*?<h2>(.*?)</h2>.*?'
        +'<div class="content">.*?<span>(.*?)',re.S)
        items = re.findall(pattern,joke_content)
        for item in items:
            str = str + '釋出人:' + item[0] + '\n' + '釋出內容:' + '\n' + item[1] + '\n'+ '\n'
        return str


    #講抓取到的笑話儲存到檔案的方法
    def writeStr2File(self,out_put_file,str1,append = 'a'):
        # 去掉檔案,保留路徑。比如 'a/b/c/d.txt' 經過下面程式碼會變成 'a/b/c'
        subPath = out_put_file[:out_put_file.rfind('/')]
        # 如果給定的路徑中,資料夾不存在,則建立
        if not os.path.exists(subPath):
            os.makedirs(subPath)
        # 開啟檔案並將 str 內容寫入給定的檔案
        with open(out_put_file, append) as f:
            f.write(str1.strip()+'\n')


    #開始抓取頁面內容,每次抓取一個頁面,直到抓取完畢所有頁面
    def start_crawl(self):
        while True:
            joke_str = self.get_joke(self.page)
            if not  joke_str:
                break
            time.sleep(1)
            #print(joke_str)
            self.writeStr2File(self.out_put_file,joke_str)
            self.page+=1


spider = Joke('http://www.qiushibaike.com/hot/page/','d:/python/test/out.txt')
spider.start_crawl()




來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10972173/viewspace-2133368/,如需轉載,請註明出處,否則將追究法律責任。

相關文章