本節將使用簡單的requests庫和正則表達式來獲取貓眼電影網站TOP100的電影相關數據。
1. 目標
爬取貓眼電影TOP100的電影相關數據如電影名稱、演員、評分等(https://maoyan.com/board/4),並保存到文件中。
2. 分析
分析結果:
- 請求url:https://maoyan.com/board/4
- 請求方式:GET
- 請求頭:詳見Request Headers
當我們點擊頁面最下方的第二頁的時候,發現頁面的請求url變爲https://maoyan.com/board/4?offset=10,並且返回的是第二頁的TOP電影,因此當我們請求其他的頁面的時候只需將首頁url參數進行相關變化即可。
3. 抓取首頁
import requests
def get_one_page(url):
# 根據源碼分析,構造請求頭
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/52.0.2743.116 Safari/537.36'
}
response = requests.get(url, headers = headers)
if response.status_code == 200:
return response.text
return None
url = 'http://maoyan.com/board/4'
html = get_one_page(url)
print(html)
這樣運行後,就可以成功獲取貓眼電影網站首頁的的所有html代碼,下面就需要根據我們所需要的數據,來解析html源代碼
4. 解析源碼
在pycharm裏面新建一個html文件,將首頁的html結果貼進去,方便查看html結構。
正則匹配:
import re
# 解析源碼
def parse_one_page(html):
pattern1 = re.compile('<dd>.*?board-index.*?>(.*?)</i>.*?<img data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>'
'.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>', re.S)
items = re.findall(pattern1, html)
for item in items:
yield {
'index' : item[0],
'image' : item[1],
'title' : item[2].strip(),
'actor' : item[3].strip()[3:] if len(item[3]) > 3 else '',
'time' : item[4].strip()[5:] if len(item[4]) > 5 else '',
'score' : item[5].strip() + item[6].strip()
}
5. 寫入文件
import json
def write_to_file(content):
with open('result.txt', 'a', encoding='utf-8') as f:
print(type(json.dumps(content)))
f.write(json.dumps(content, ensure_ascii=False) + '\n')
整體代碼如下:
# -*- coding: utf-8 -*-
# @Time : 2019-07-10 21:29
# @Author : xudong
# @email : [email protected]
# @Site :
# @File : requestsTest.py
# @Software: PyCharm
import requests
import re
import json
def get_one_page(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/52.0.2743.116 Safari/537.36'
}
response = requests.get(url, headers = headers)
if response.status_code == 200:
return response.text
return None
def get_top_movie(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)
def parse_one_page(html):
pattern1 = re.compile('<dd>.*?board-index.*?>(.*?)</i>.*?<img data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>'
'.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>', re.S)
items = re.findall(pattern1, html)
for item in items:
yield {
'index' : item[0],
'image' : item[1],
'title' : item[2].strip(),
'actor' : item[3].strip()[3:] if len(item[3]) > 3 else '',
'time' : item[4].strip()[5:] if len(item[4]) > 5 else '',
'score' : item[5].strip() + item[6].strip()
}
def write_to_file(content):
with open('result.txt', 'a', encoding='utf-8') as f:
print(type(json.dumps(content)))
f.write(json.dumps(content, ensure_ascii=False) + '\n')
if __name__ == '__main__':
for i in range(10):
get_top_movie(i * 10)
項目的目錄下生成result.txt文件,打開查看數據是否存在,如果存在,則目標達成。