猫眼电影和电影天堂数据csv和mysql存储
字符串常用方法
- # 去掉左右空格
- 'hello world'.strip() # 'hello world'
- # 按指定字符切割
- 'hello world'.split(' ') # ['hello','world']
- # 替换指定字符串
- 'hello world'.replace(' ','#') # 'hello#world'
csv模块
作用:将爬取的数据存放到本地的csv文件中
使用流程
- 导入模块
- 打开csv文件
- 初始化写入对象
- 写入数据(参数为列表)
- import csv
- with open('test.csv','w') as f:
- writer = csv.writer(f) # 初始化写入对象
- # 写一行
- writer.writerow(['超哥哥',20])
- writer.writerow(['步惊云',22])
- with open('test.csv','a') as f:
- writer = csv.writer(f)
- # 写多行
- data_list = [('聂风',23),('秦霜',30)]
- writer.writerows(data_list)
Windows中使用csv模块默认会在每行后面添加一个空行,使用newline=''可解决
with open('xxx.csv','w',newline='') as f:
猫眼电影top100抓取案例
确定URL网址
猫眼电影 - 榜单 - top100榜 目标
电影名称、主演、上映时间 操作步骤
1、查看是否为动态加载
右键 - 查看网页源代码 - 搜索爬取关键字(查看在源代码中是否存在)
2、找URL规律
第1页:https://maoyan.com/board/4?offset=0
第2页:https://maoyan.com/board/4?offset=10
第n页:offset=(n-1)*10
3、正则表达式
<div class="movie-item-info">.*?title="(.*?)".*?class="star">(.*?)</p>.*?releasetime">(.*?)</p>
4、编写程序框架,完善程序
- 打印程序执行时间
- 随机的User-Agent,(确保每次发请求使用随机)
- 数据爬下来后做处理(字符串),定义成字典
- 一条龙: 获取 -> 调用解析 -> 数据处理
- 猫眼电影数据存入本地 maoyanfilm.csv 文件
- from urllib import request
- import time
- import re
- import csv
- import random
- class MaoyanSpider(object):
- def __init__(self):
- self.page = 1 # 用于记录页数
- self.url = 'https://maoyan.com/board/4?offset={}'
- self.agent = [
- 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 \
- Safari/535.1',
- 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0',
- 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; \
- .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)',
- 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1']
- # 请求
- def get_page(self, url):
- headers = {'User-Agent': random.choice(self.agent)} # 每次使用随机的user-agent
- req = request.Request(url=url, headers=headers) # 创建请求对象
- res = request.urlopen(req) # 发起请求
- html = res.read().decode('utf-8') # 获取请求内容
- self.parse_page(html) # 直接调用解析函数
- # 解析
- def parse_page(self, html):
- pattren = re.compile(
- '<div class="movie-item-info">.*?title="(.*?)".*?class="star">(.*?)</p>.*?releasetime">(.*?)</p>', re.S)
- r_list = pattren.findall(html)
- # rlist: [('霸王别姬', '\n 主演:张国荣,张丰毅,巩俐\n ', '上映时间:1993-01-01'),(...),(...)]
- self.write_page(r_list) # 写入csv文件
- # # 保存,打印输出
- # def write_page(self,r_list):
- # one_film_dict = {}
- # for rt in r_list:
- # one_film_dict['name'] = rt[0].strip()
- # one_film_dict['star'] = rt[1].strip()
- # one_film_dict['time'] = rt[2].strip()[5:15]
- #
- # print(one_film_dict)
- # 保存到csv文件(writerows) -- 推荐使用此方法
- def write_page(self, r_list):
- # 空列表,最终writerows()的参数: [(),(),()]
- film_list = []
- with open('maoyan.csv', 'a',newline="") as f:
- writer = csv.writer(f)
- for rt in r_list:
- # 把处理过的数据定义成元组
- t = (rt[0], rt[1].strip(), rt[2].strip()[5:15])
- film_list.append(t)
- writer.writerows(film_list)
- def main(self):
- for offset in range(0, 31, 10):
- url = self.url.format(offset)
- self.get_page(url)
- time.sleep(random.randint(1, 3))
- print('第%d页爬取完成' % self.page)
- self.page += 1
- if __name__ == '__main__':
- start = time.time()
- spider = MaoyanSpider()
- spider.main()
- end = time.time()
- print('执行时间: %.2f' % (end - start))
数据持久化存储(MySQL数据库)
让我们来回顾一下pymysql模块的基本使用
- import pymysql
- db = pymysql.connect('localhost', 'root', '', 'maoyandb', charset='utf8')
- cursor = db.cursor() # 创建游标对象
- # execute()方法第二个参数为列表传参补位
- cursor.execute('insert into film values(%s,%s,%s)', ['霸王别姬', '张国荣', ''])
- db.commit() # 提交到数据库执行
- cursor.close() # 关闭
- db.close()
让我们来回顾一下pymysql中executemany()的用法
- import pymysql
- # 数据库连接对象
- db = pymysql.connect('localhost', 'root', '', charset='utf8')
- cursor = db.cursor() # 游标对象
- ins_list = [] # 存放所有数据的大列表
- for i in range(2):
- name = input('请输入第%d个学生姓名:' % (i + 1))
- age = input('请输入第%d个学生年龄:' % (i + 1))
- ins_list.append([name, age])
- ins = 'insert into t3 values(%s,%s)' # 定义插入语句
- cursor.executemany(ins, ins_list) # 一次数据库的IO操作可插入多条语句,提升性能
- db.commit() # 提交到数据库执行
- cursor.close() # 关闭游标
- db.close() # 关闭数据库
- ins = 'insert into maoyanfilm values(%s,%s,%s)'
- cursor.execute(['霸王', '国荣', ''])
- cursor.executemany([
- ['月光宝盒', '周星驰', ''],
- ['大圣娶亲', '周星驰', '']])
练习:把猫眼电影案例中电影信息存入MySQL数据库中(尽量使用executemany方法)
- from urllib import request
- import time
- import re
- import pymysql
- import random
- class MaoyanSpider(object):
- def __init__(self):
- self.page = 1 # 用于记录页数
- self.url = 'https://maoyan.com/board/4?offset={}'
- self.ua_list = [
- 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) \
- Chrome/14.0.835.163 Safari/535.1',
- 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0',
- 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; \
- .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)']
- # 创建数据库连接对象和游标对象
- self.db = pymysql.connect('localhost', 'root', '', 'maoyandb', charset='utf8')
- self.cursor = self.db.cursor()
- # 获取
- def get_page(self, url):
- # 每次使用随机的user-agent
- headers = {'User-Agent': random.choice(self.ua_list)}
- req = request.Request(url=url, headers=headers)
- res = request.urlopen(req)
- html = res.read().decode('utf-8')
- self.parse_page(html) # 直接调用解析函数
- # 解析
- def parse_page(self, html):
- pattren = re.compile(
- '<div class="movie-item-info">.*?title="(.*?)".*?class="star">(.*?)</p>.*?releasetime">(.*?)</p>', re.S)
- # rlist: [('霸王别姬','张国荣','1993'),(),()]
- r_list = pattren.findall(html)
- print(r_list)
- self.write_page(r_list)
- # 存入mysql数据库(executemany([ [],[],[] ]))
- def write_page(self, r_list):
- film_list = []
- ins = 'insert into filmtab values(%s,%s,%s)' # 定义插入语句
- # 处理数据,放到大列表film_list中
- for rt in r_list:
- one_film = [rt[0], rt[1].strip(), rt[2].strip()[5:15]]
- # 添加到大列表中
- film_list.append(one_film)
- # 一次数据库IO把1页数据存入
- self.cursor.executemany(ins, film_list)
- # 提交到数据库执行
- self.db.commit()
- def main(self):
- for offset in range(0, 31, 10):
- url = self.url.format(offset)
- self.get_page(url)
- time.sleep(random.randint(1, 3))
- print('第%d页爬取完成' % self.page)
- self.page += 1
- # 断开数据库(所有页爬完之后)
- self.cursor.close()
- self.db.close()
- if __name__ == '__main__':
- start = time.time()
- spider = MaoyanSpider()
- spider.main()
- end = time.time()
- print('执行时间: %.2f' % (end - start))
让我们来做个SQL命令查询
1、查询20年以前的电影的名字和上映时间
select name,time from filmtab where time<(now()-interval 20 year);
2、查询1990-2000年的电影名字和上映时间
select name,time from filmtab where time>='1990-01-01' and time<='2000-12-31';
让我们来复习一下mongdb数据库
- import pymongo
- # 1.连接对象
- conn = pymongo.MongoClient(host='127.0.0.1', port=27017)
- db = conn['maoyandb'] # 2.库对象
- myset = db['filmtab'] # 3.集合对象
- myset.insert_one({'name': '赵敏'}) # 4.插入数据库
练习:把猫眼电影案例中电影信息存入MongDB数据库中
- from urllib import request
- import re
- import time
- import random
- import pymongo
- class MaoyanSpider(object):
- def __init__(self):
- self.url = 'https://maoyan.com/board/4?offset={}'
- # 计数
- self.num = 0
- # 创建3个对象
- self.conn = pymongo.MongoClient('localhost', 27017)
- self.db = self.conn['maoyandb']
- self.myset = self.db['filmset']
- self.ua_list = [
- 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1',
- 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0',
- 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET \
- CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)', ]
- def get_html(self, url):
- headers = {
- 'User-Agent': random.choice(self.ua_list)
- }
- req = request.Request(url=url, headers=headers)
- res = request.urlopen(req)
- html = res.read().decode('utf-8')
- # 直接调用解析函数
- self.parse_html(html)
- def parse_html(self, html):
- re_bds = r'<div class="movie-item-info">.*?title="(.*?)".*?class="star">(.*?)</p>.*?releasetime">(.*?)</p>'
- pattern = re.compile(re_bds, re.S)
- # film_list: [('霸王别姬','张国荣','1993'),()]
- film_list = pattern.findall(html)
- # 直接调用写入函数
- self.write_html(film_list)
- # mongodb数据库
- def write_html(self, film_list):
- for film in film_list:
- film_dict = {
- 'name': film[0].strip(),
- 'star': film[1].strip(),
- 'time': film[2].strip()[5:15]
- }
- # 插入mongodb数据库
- self.myset.insert_one(film_dict)
- def main(self):
- for offset in range(0, 31, 10):
- url = self.url.format(offset)
- self.get_html(url)
- time.sleep(random.randint(1, 2))
- if __name__ == '__main__':
- start = time.time()
- spider = MaoyanSpider()
- spider.main()
- end = time.time()
- print('执行时间:%.2f' % (end - start))
电影天堂案例(二级页面抓取)
1、查看是否为静态页面,是否为动态加载
右键 - 查看网页源代码
2、确定URL地址
百度搜索 :电影天堂 - 2019年新片 - 更多
3、目标
*********一级页面***********
1、电影名称
2、电影链接
*********二级页面***********
1、下载链接
4、步骤
找URL规律
第1页 :https://www.dytt8.net/html/gndy/dyzz/list_23_1.html
第2页 :https://www.dytt8.net/html/gndy/dyzz/list_23_2.html
第n页 :https://www.dytt8.net/html/gndy/dyzz/list_23_n.html
写正则表达式
1、一级页面正则表达式(电影名称、电影详情链接)
<table width="100%".*?<td height="26">.*?<a href="(.*?)".*?>(.*?)</a>
2、二级页面正则表达式
<td style="WORD-WRAP.*?>.*?>(.*?)</a>
代码实现
# decode('gbk','ignore') 注意ignore参数
# 注意结构和代码可读性(一个函数不要太冗余)
- from urllib import request
- import re
- import time
- import random
- from useragents import *
- import pymysql
- class FilmSky(object):
- def __init__(self):
- self.url = 'https://www.dytt8.net/html/gndy/dyzz/list_23_{}.html'
- # 定义两个对象
- self.db = pymysql.connect('127.0.0.1', 'root', '', 'maoyandb', charset='utf8')
- self.cursor = self.db.cursor()
- # 获取html函数(因为两个页面都需要发请求)
- def get_page(self, url):
- req = request.Request(url=url, headers={'User-Agent': random.choice(ua_list)})
- res = request.urlopen(req)
- # ignore参数,实在处理不了的编码错误忽略
- # 查看网页源码,发现网页编码为 gb2312,不是 utf-8
- html = res.read().decode('gbk', 'ignore')
- return html
- # 解析提取数据(把名称和下载链接一次性拿到)
- # html为一级页面响应内容
- def parse_page(self, html):
- # 1. 先解析一级页面(电影名称 和 详情链接)
- pattern = re.compile('<table width="100%".*?<td height="26">.*?<a href="(.*?)".*?>(.*?)</a>', re.S)
- # film_list: [('详情链接','名称'),()]
- film_list = pattern.findall(html)
- # [('/html/gndy/dyzz/20190806/58956.html', '019年惊悚动作《报仇雪恨/血债血偿》BD中英双字幕'),(),()]
- ins = 'insert into filmsky values(%s,%s)'
- for film in film_list:
- film_name = film[1]
- film_link = 'https://www.dytt8.net' + film[0]
- # 2. 拿到详情链接后,再去获取详情链接html,提取下载链接
- download_link = self.parse_two_html(film_link)
- self.cursor.execute(ins, [film_name, film_link])
- self.db.commit()
- # 打印测试
- d = {'电影名称': film_name, '下载链接': download_link}
- print(d)
- # {'电影名称': '019年惊悚动作《报仇雪恨/血债血偿》BD中英双字幕', '下载链接': 'ftp://ygdy8:ygdy8@yg90.dydytt.net:8590/阳光电影www.ygdy8.com.报仇雪恨.BD.720p.中英双字幕.mkv'}
- # 解析二级页面,获取下载链接
- def parse_two_html(self, film_link):
- two_html = self.get_page(film_link)
- pattern = re.compile('<td style="WORD-WRAP.*?>.*?>(.*?)</a>', re.S)
- download_link = pattern.findall(two_html)[0]
- return download_link
- # 主函数
- def main(self):
- for page in range(1, 11):
- url = self.url.format(page)
- html = self.get_page(url)
- self.parse_page(html)
- time.sleep(random.randint(1, 3))
- print('第%d页完成' % page)
- if __name__ == '__main__':
- start = time.time()
- spider = FilmSky()
- spider.main()
- end = time.time()
- print('执行时间:%.2f' % (end - start))
猫眼电影和电影天堂数据csv和mysql存储的更多相关文章
- 使用Beautiful Soup爬取猫眼TOP100的电影信息
使用Beautiful Soup爬取猫眼TOP100的电影信息,将排名.图片.电影名称.演员.时间.评分等信息,提取的结果以文件形式保存下来. import time import json impo ...
- windows环境下nutch2.x 在eclipse中实现抓取数据存进mysql详细步骤
nutch2.x 在eclipse中实现抓取数据存进mysql步骤 最近在研究nutch,花了几天时间,也遇到很多问题,最终结果还是成功了,在此记录,并给其他有兴趣的人提供参考,共同进步. 对nutc ...
- Oracle数据迁移至MySQL
ORACLE DB: 11.2.0.3.0 MYSQL DB: 5.5.14 因项目需求,需要将ORACLE生产中数据迁移至MYSQL数据库中作为初始数据,方法有如下几种: 1.ORACLE OGG ...
- 【PHP】将EXCEL表中的数据轻松导入Mysql数据表
在网络上有不较多的方法,在此介绍我已经验证的方法. 方法一.利用EXCEL表本身的功能生成SQL代码 ①.先在“phpmyadmin”中建立数据库与表(数据库:excel,数据表:excel01,字段 ...
- 使用命令行将Excel数据表导入Mysql中的方法小结
从Excel数据表导入MySQL,已经做过好几次了,但每次都会碰到各种问题:invalid utf8 character string, data too long, ...,浪费了不少时间 为了提高 ...
- 如何将MongoDB数据库的数据迁移到MySQL数据库中
FAQ v2.0终于上线了,断断续续忙了有2个多月.这个项目是我实践的第一个全栈的项目,从需求(后期有产品经理介入)到架构,再到设计(有征询设计师的意见).构建(前端.后台.数据库.服务器部署),也是 ...
- 利用workbench将excel数据导入到MySQL中
数据导入的方式(csv,txt之类) 在MySQL中,数据导入的方式有两种方式 通过第三方客户端导入(workbench) 通过mysql client 方式导入 通过mysql clinet的导入方 ...
- Python网络数据采集3-数据存到CSV以及MySql
Python网络数据采集3-数据存到CSV以及MySql 先热热身,下载某个页面的所有图片. import requests from bs4 import BeautifulSoup headers ...
- 大数据项目之_15_电信客服分析平台_01&02_项目背景+项目架构+项目实现+数据生产+数据采集/消费(存储)
一.项目背景二.项目架构三.项目实现3.1.数据生产3.1.1.数据结构3.1.2.编写代码3.1.3.打包测试3.2.数据采集/消费(存储)3.2.1.数据采集:采集实时产生的数据到 kafka 集 ...
随机推荐
- 深挖Openstack Nova - Scheduler调度策略
深挖Openstack Nova - Scheduler调度策略 一. Scheduler的作用就是在创建实例(instance)时,为实例选择出合适的主机(host).这个过程分两步:过滤(F ...
- css常用语法续集
1 设置字体 body{font-familly:“宋体”} 2 可以使用下面代码设置网页中文字的字号为12像素,并把字体颜色设置为#666(灰色): body{font-size:12px;c ...
- Find out "Who" and "Where"
Yesterday a friend of mine Kirby came to me with a smartphone and she wanted me to do her a favor. S ...
- plotly之set_credentials_file问题
相信了解可视化的同学们都听说过plotly,笔者也是第一次了解这个网站,然后兴冲冲地设置,但是没想到第一次进行在线账号初始化就出现了问题! python3报错为module 'plotly.tools ...
- spring-boot项目的docker集成化部署(一)
目录 spring-boot项目的docker集成化部署 前言 基本思路与方案 基本步骤 准备源码 服务器和基础环境 结语 1. 本文总结: 2. 后期优化: spring-boot项目的docker ...
- React-Native之打包发布(Android)
React-Native之打包发布(Android) 一,介绍与需求 移动端打包发布到应用市场 二,发布配置 注意:以下所有操作都在win10下进行,React Native版本0.59.5,andr ...
- DevOps实施历程-v1.0
有AF项目的成功案例(DevOps实施历程-半自动化),公司新项目全部依此为模板,实现了从代码到安装的自动化流水线,为此我输出了Jenkins自动化指南.AF项目指南等文档,方便大家查阅和参 ...
- 2、JAVA相关基础的学习和工具
个人感觉,各种语言的基础知识,例如标识符,运算符等在宏观上几乎是一样的,只是在某些方面上会有一点点差异,因为本人已经有了语言基础,所以对于标识符,关键字,运算符等方面的只是便不作赘述,敬请谅解,如果你 ...
- 对Java中HashCode方法的深入思考
前言 最近在学习 Go 语言,Go 语言中有指针对象,一个指针变量指向了一个值的内存地址.学习过 C 语言的猿友应该都知道指针的概念.Go 语言语法与 C 相近,可以说是类 C 的编程语言,所以 Go ...
- 如何使用dmidecode命令查看硬件信息
引言 当我们需要获取机器硬件信息时,可使用linux系统自带的dmidecode工具进行查询. dmidecode命令通过读取系统DMI表,显示服务器硬件和BIOS信息.除了可使用dmidecode查 ...