1. 程式人生 > >Python3爬蟲入門第二課

Python3爬蟲入門第二課

前面用的一直是Python內建的urllib庫進行爬蟲實驗,後面發現原來用第三方庫requests更佳
下面這個是對糗事百科的段子爬取,程式碼更加規範,符合面向物件,而且特別是requests用起來更方便

在windows系統下只需要在命令列輸入命令 pip install requests 即可安裝。

# coding:utf-8
import re
import requests

class JOKE:

    # 魔法方法
    def __init__(self):
        self.user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
        self.header = {'User-Agent' : self.user_agent}

    def getPage(self):
        try:
            url = 'http://www.qiushibaike.com/hot/page/1'
            response = requests.get(url, headers = self.header, timeout = 30)
            
            pattern = re.compile('<div class="content">\s<span>(.*?)</span>.*?<div class="stats"', re.S)
            items = re.findall(pattern, response.text)
            if len(items) == 0:
                print("未抓取到資料!!!")
            #saveContent(response.text)
            for item in items:
                br = re.compile('<br/>')
                text = re.sub(br, '\n', item)
                print(text)

        except:
            return "產生異常"    


if __name__ == '__main__':
    joke = JOKE()
    joke.getPage()

程式碼說明:

多行匹配,那麼需要加上re.S
str = "a23b\na34b"
re.findall(r"a(\d+)b.+a(\d+)b", str)#輸出[]
#因為不能處理str中間有\n換行的情況
re.findall(r"a(\d+)b.+a(\d+)b", str, re.S)#s輸出[('23', '34')]

貪婪和非貪婪匹配
str = "a123b456b"
print re.findall(r"a(.+?)b", str)#輸出['123']#?控制只匹配0或1個,所以只會輸出和最近的b之間的匹配情況
print re.findall(r"a(.+)b", str)#輸出['123b456']
print re.findall(r"a(.*)b", str)#輸出['123b456']