1.概述
這是博主接觸的第一個爬蟲實例,利用python的request庫和正則表達式對貓眼網站的Top100電影進行爬取,將結果打印出來並保存成txt文件。關鍵的部分有以下三點:
- python中request庫的簡單使用。
- 利用re模塊來解析request到的頁面。
- json格式文件存儲和讀取方法。
2.詳細代碼以及註釋如下:
# -*-coding:utf-8 -*-
import json
import requests
from requests.exceptions import RequestException
import re
import time
def get_one_page(url):
try:
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
return response.text
return None
except RequestException:
return None
def parse_one_page(html):
#re.S使得匹配包括換行符在內的所有字符。
pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a'
+ '.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>'
+ '.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>', re.S)
items = re.findall(pattern, html)
for item in items:
yield {
'index': item[0],
'image': item[1],
'title': item[2],
'actor': item[3].strip()[3:],
'time': item[4].strip()[5:],
'score': item[5] + item[6]
}#yield執行後並沒有退出,每次遇到關鍵字後返回相應結果,保留函數當前的執行狀態。直到函數執行完。
#理解爲播放和暫停更佳。
'''
def func():
for i in range(0,3):
yield i
f=func()
f.next()
f.next()
def func(n):
for i in range(0,n):
val = yield i
print val
f = func(10)
f.next()
#f.send(None)
f.send(2)
f.send(10)
print f.next()
'''
def write_to_file(content):
with open('result.txt', 'a', encoding='utf-8') as f:
f.write(json.dumps(content, ensure_ascii=False) + '\n')#inorder to output the chinese
def main(offset):
url = 'http://maoyan.com/board/4?offset=' + str(offset)
html = get_one_page(url)
for item in parse_one_page(html):
print(item)
write_to_file(item)
if __name__ == '__main__':
for i in range(10):
main(offset=i * 10)
time.sleep(1)
需要注意的以下幾點:
- 貓眼電影網站爬取時,需要加入User-Agent字段,具體的內容可以通過瀏覽器的開發工具來查看,使用Chrome瀏覽器採用如下的方式:進入瀏覽器後右鍵單擊,點擊檢查,然後輸入貓眼網址,在獲得請求中尋找NetWork選項,選中左邊的任意一條請求,便可看到如下顯示的內容,其中就有我們需要的User-Agent,添加後再進行後續的操作。
2.關於正則表達式的匹配,很長的一串字符看起來讓人很難理解,可以一點點拆開來看。
如上圖所示,還是進入瀏覽器的開發工具,按上述步驟來選定Top100中排行第一的電影,霸王別姬,我們要爬取所有的電影時候,首先就需要掌握單個電影的全部信息,然後採用遍歷的方式便可以獲取到所有的電影。選中霸王別姬後,第一眼看到就是<dd>節點,我們將這個節點下所有的子節點全部打開,對應着parse_one_page中的正則表達式來看,就可以看得很清楚,這種匹配方式結合re的非貪婪方式,將單個電影的有效信息全部匹配,並在後續yield操作中將信息羅列開來,顯示清楚。
3.關於json格式文件的存儲
json全稱爲JavaScript Object Notation,JavaScript標記對象,通過對象和數組的組合來表示數據,是一種輕量級的數據交換格式。常用的數據處理方式有兩種:Json的loads方法將JSON文本字符串轉位JSON對象,dumps方法將JSON對象轉位文本字符串,這裏使用的是後者。
總體來說,代碼很簡單,很容易理解,多敲幾遍就沒有什麼大問題。