主要步骤有:
访问网站,获取页面源码
解析页面,得到想要的数据
循环爬取多个页面
把数据写入本地文件
分析需要爬取的页面结构
访问猫眼电影。观察页面,会看到首页上有排名前十的电影信息。
找到页面中的分页,点击不同的页码。对比不同页面url的差别,会发现不同的分页是以offset参数作为区分的。
因为每个页面都显示10条电影信息,所以offset是以10作为偏移量的。
标题抓取首页
import re,json
import requests
def write_to_json(infos):
with open('movie.json','w',encoding='utf-8') as fp :
json.dump(infos,fp)
#解析页面内容
def parse_page(html_str):
#测试页面内容是否能拿到
# print(html_str)
#正则筛选页面的原则:一步步缩小匹配范围。
dl_p = re.compile(r'<dl class="board-wrapper">(.*?)</dl>',re.S)
dl_content = dl_p.search(html_str).group()
dd_p = re.compile(r'<dd>(.*?)</dd>',re.S)
dd_list = dd_p.findall(dl_content)
# print(dd_list)
'''
电影名称
主演
上映时间
评分
详情url
'''
for dd in dd_list:
name_p = re.compile(r'" title="(.*?)" class="',re.S)###电影名称
name = name_p.search(dd).group(1)
# print(name)
actor_p = re.compile(r'<p class="star">(.*?)</p>',re.S)###主演
actor = actor_p.search(dd).group(1).strip()
# print(actor)
time_p = re.compile(r'<p class="releasetime">(.*?)</p>',re.S)###上映时间
time = time_p.search(dd).group(1).strip()
# print(time)
# score_p = re.compile(r'<p class="score"><i class="integer">(.*?).</i><i class="fraction">(.*?)</i></p>')
score_p = re.compile(r'.*?integer">(.*?)</i>')###评分
score = score_p.search(dd).group(1).strip()
url_p = re.compile(r'.*?data-src="(.*?)"')###详情url
url = url_p.search(dd).group(0)
#设置爬取数据
item = {}
item['name'] =name
item['actor'] = actor
item['time'] = time
item['score'] = score
item['url'] = url
print(item)
infos.append(item)
#保存到json文件
def main():
#确定基础url
base_url = 'https://maoyan.com/board/4?offset=%s'
headers= {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36',
}
for i in range(10):
# print(base_url %i*10)
response = requests.get(base_url %(i*10),headers=headers)
parse_page(response.text)
if __name__ == '__main__':
# infos = []
# main()#提取数据,将数据添加到infos中
#将数据写入文件
# write_to_json(infos)
#从movie.json文件中读出电影数据
infos = json.load(open('movie.json','r'))
for item in infos:
print(item)