使用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)])
使用Requests+正则表达式爬取猫眼TOP100电影并保存到文件或MongoDB,并下载图片的更多相关文章
- PYTHON 爬虫笔记八:利用Requests+正则表达式爬取猫眼电影top100(实战项目一)
利用Requests+正则表达式爬取猫眼电影top100 目标站点分析 流程框架 爬虫实战 使用requests库获取top100首页: import requests def get_one_pag ...
- Requests+正则表达式爬取猫眼电影
目标 提取出猫眼电影TOP100的电影名称.时间.评分.图片等信息,提取站点的URL为http://maoyan.com/board/4,提取的结果以文本的形式保存下来. 准备工作 请安装好reque ...
- 整理requests和正则表达式爬取猫眼Top100中遇到的问题及解决方案
最近看崔庆才老师的爬虫课程,第一个实战课程是requests和正则表达式爬取猫眼电影Top100榜单.虽然理解崔老师每一步代码的实现过程,但自己敲代码的时候还是遇到了不少问题: 问题1:获取respo ...
- Python 爬取 猫眼 top100 电影例子
一个Python 爬取猫眼top100的小栗子 import json import requests import re from multiprocessing import Pool #//进程 ...
- 7.5爬取猫眼Top100电影名单
2018-7-5 20:22:57 还有有一丢丢成就感!以后可以爬取简单网站了!比如妹子图片,只是现在不知道咋下载! 正则还是刚看,要多去用正则!正则很强大的东西! #!/usr/bin/env py ...
- Requests+正则表达式爬取猫眼电影(TOP100榜)
猫眼电影网址:www.maoyan.com 前言:网上一些大神已经对猫眼电影进行过爬取,所用的方法也是各有其优,最终目的是把影片排名.图片.名称.主要演员.上映时间与评分提取出来并保存到文件或者数据库 ...
- python爬虫知识点总结(九)Requests+正则表达式爬取猫眼电影
一.爬取流程 二.代码演示 #-*- coding: UTF-8 -*- #_author:AlexCthon #mail:alexcthon@163.com #date:2018/8/3 impor ...
- Python爬虫实战之Requests+正则表达式爬取猫眼电影Top100
import requests from requests.exceptions import RequestException import re import json # from multip ...
- python爬虫从入门到放弃(九)之 Requests+正则表达式爬取猫眼电影TOP100
import requests from requests.exceptions import RequestException import re import json from multipro ...
随机推荐
- H - Can you answer these queries? ( POJ - 3264 )
H - Can you answer these queries? HDU - 4027 思路: 一眼思路:线段树区间修改,区间查询. 发现bug:区间的sqrt无法实现,所以还是相当于对区间的每 ...
- BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第12章节--SP 2013中远程Event Receivers 总结
BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第12章节--SP 2013中远程Event Receivers 总结 本章节向你介绍了SP平台上eve ...
- Selenium API 介绍
Selenium API 介绍 我们先前学习过元素定位,大家不知道学习得怎么样了,当你学会元素定位之后就能够跟着我的脚步学习本节Selenium 经常使用的API 介绍 Seleium 为什么能模拟人 ...
- Android4.0.4-在build.prop中添加属性的方法【转】
本文转载自:http://blog.csdn.net/imyfriend/article/details/8939964 1.在*.rc文件中用setprop添加,例如在源码android4.0\sy ...
- [转载]ROS_LOG保存方法
原文地址:ROS_LOG保存方法作者:东咚... 把Service中的WWW的IP设置为允许日志保存服务器访问的范围 System->Logging,点击 "Actions" ...
- V8 引擎是如何工作的?
V8 引擎是如何工作的? 本文翻译自:How the V8 engine works? V8是谷歌德国开发中心构建的一个JavaScript引擎.它是由C++编写的开源项目,同时被客户端(谷歌浏览 ...
- Nginx 配置埋点js日志采集
页面埋点&nginx日志采集 页面(web容器:httpd/nginx负载均衡 + apache server)<===> 日志采集服务器(nginx服务器) 通过某个页面跳转到我 ...
- SMTP协议详解
简单邮件传输协议 (Simple Mail Transfer Protocol, SMTP) 是在Internet传输email的事实标准. SMTP是一个相对简单的基于文本的协议.在其之上指定了一条 ...
- lua单链表实现
List = {} --创建一个节点 function List.new(val) return {pnext = nil, value = val} end --往一个节点后添加一个节点 funct ...
- 机器学习PAI为你自动写歌词,妈妈再也不用担心我的freestyle了(提供数据、代码)
背景 最近互联网上出现一个热词就是“freestyle”,源于一个比拼rap的综艺节目.在节目中需要大量考验选手的freestyle能力,freestyle指的是rapper即兴的根据一段主题讲一串r ...