Python3爬蟲入門第二課
阿新 • • 發佈:2018-11-09
前面用的一直是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']