使用Requests+正则表达式爬取猫眼TOP100电影并保存到文件或MongoDB,并下载图片

需要着重学习的地方:
(1)爬取分页数据时,url链接的构建
(2)保存json格式数据到文件,中文显示问题
(3)线程池的使用
(4)正则表达式的写法
(5)根据图片url链接下载图片并保存
(6)MongoDB的初步使用


#!/usr/bin/env python
# -*- coding: utf-8 -*-


import
re import json import requests from requests.exceptions import RequestException from multiprocessing import Pool import pymongo import os from hashlib import md5 MONGO_URL = 'localhost' MONGO_DB = 'maoyan' MONGO_TABLE = 'maoyan' client = pymongo.MongoClient(MONGO_URL, connect=False) db = client[MONGO_DB] # 获取单页数据 def get_one_page(url): try: response = requests.get(url) if response.status_code == 200: return response.text return None except RequestException: return None # 解析单页数据,获取所需的数据 # '.*?board-index.*?>(\d+).*?' 获取顺序号 # '.*?data-src="(.*?)".*?' 获取图片链接 # '.*?name.*?title.*?>(.*?)</a>.*?' 获取电影名称 # '.*?star">(.*?)</p>.*?',re.S 获取演员名单(有换行,需要加上re.S,否则获取不到数据) # '.*?releasetime">(.*?)</p>.*?' 获取上映时间 # '.*?integer">(.*?)</i>.*?' 获取主分 # '.*?fraction">(.*?)</i>.*?'获取辅分 # 综合下来,加上最外层的dd def parse_one_page(html): pattern = re.compile( '<dd>.*?board-index.*?>(\d+).*?data-src="(.*?)".*?name.*?title.*?>(.*?)</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], 'img':item[1], 'name':item[2].strip(), # 去除前后空格换行符等 'star':item[3].strip()[3:], # 去除前后空格换行符等,切片截取指定的范围 'releasetime':item[4][5:], 'score':item[5] + item[6] # 评分相加 } # 保存至文件 def save_to_file(content): # 注意:把json数据保存到文件中显示出中文 with open('movies.text','a',encoding='utf-8') as f: f.write(json.dumps(content,ensure_ascii=False) + '\n') # 保存到数据库中 def save_to_mongo(result): if db[MONGO_TABLE].insert(result): print('Successfully Saved to Mongo', result) return True return False # 请求图片url,获取图片二进制数据 def download_image(url): try: response = requests.get(url) if response.status_code == 200: save_image(response.content) # response.contenter二进制数据 response.text文本数据 return None except RequestException: print('请求图片出错') return None def save_image(content): file_path = '{0}/{1}.{2}'.format(os.getcwd(), md5(content).hexdigest(), 'jpg') if not os.path.exists(file_path): with open(file_path,'wb') as f: f.write(content) def main(offset): url = 'https://maoyan.com/board/4?offset=' + str(offset) # 针对分页 html = get_one_page(url) for item in parse_one_page(html): # print(item) # save_to_file(item) # 保存至文件 # save_to_mongo(item) # 保存到数据库 download_image(item['img']) # 下载图片保存到当前目录 if __name__ == '__main__': # for i in range(0, 100): # main(str(i*10)) # 开启多线程 pool = Pool() pool.map(main,[i*10 for i in range(10)])

 

 
posted @ 2018-12-27 15:44  哈喽哈喽111111  阅读(545)  评论(0编辑  收藏  举报