热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python爬虫猫眼电影和电影天堂数据csv和mysql存储过程解析

这篇文章主要介绍了python爬虫猫眼电影和电影天堂数据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、正则表达式

.*?title="(.*?)".*?class="star">(.*?)

.*?releasetime">(.*?)

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(
   '
.*?title="(.*?)".*?class="star">(.*?)

.*?releasetime">(.*?)

', 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', '123456', 'maoyandb', charset='utf8')
cursor = db.cursor() # 创建游标对象
# execute()方法第二个参数为列表传参补位
cursor.execute('insert into film values(%s,%s,%s)', ['霸王别姬', '张国荣', '1993'])
db.commit() # 提交到数据库执行
cursor.close() # 关闭
db.close()

让我们来回顾一下pymysql中executemany()的用法

import pymysql

# 数据库连接对象
db = pymysql.connect('localhost', 'root', '123456', 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(['霸王', '国荣', '1991'])
cursor.executemany([
  ['月光宝盒', '周星驰', '1993'],
  ['大圣娶亲', '周星驰', '1993']])

练习:把猫眼电影案例中电影信息存入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', '123456', '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(
   '
.*?title="(.*?)".*?class="star">(.*?)

.*?releasetime">(.*?)

', 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&#63;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'
.*&#63;title="(.*&#63;)".*&#63;class="star">(.*&#63;)

.*&#63;releasetime">(.*&#63;)

' 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、一级页面正则表达式(电影名称、电影详情链接)

.*&#63;(.*&#63;)

2、二级页面正则表达式

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', '123456', '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('.*&#63;(.*&#63;)', 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('

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 文章目录简介HTTP请求过程HTTP状态码含义HTTP头部信息Cookie状态管理HTTP请求方式简介HTTP协议(超文本传输协议)是用于从WWW服务 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文整理了常用的CSS属性及用法,包括背景属性、边框属性、尺寸属性、可伸缩框属性、字体属性和文本属性等,方便开发者查阅和使用。 ... [详细]
  • css元素可拖动,如何使用CSS禁止元素拖拽?
    一、用户行为三剑客以下3个CSS属性:user-select属性可以设置是否允许用户选择页面中的图文内容;user-modify属性可以设置是否允许输入 ... [详细]
  • pyecharts 介绍
    一、pyecharts介绍ECharts,一个使用JavaScript实现的开源可视化库,可以流畅的运行在PC和移动设备上,兼容当前绝大部 ... [详细]
  • 最近在学Python,看了不少资料、视频,对爬虫比较感兴趣,爬过了网页文字、图片、视频。文字就不说了直接从网页上去根据标签分离出来就好了。图片和视频则需要在获取到相应的链接之后取做下载。以下是图片和视 ... [详细]
  • 前端提高篇(七十):SVG基本使用、基本样式、路径path
    SVG是使用XML来描述二维图形和绘图程序的语言。SVG遵循的是xml的规范,与html5的使用有所区别SVG绘制出来的是矢量图,放大之后不会失真官方文 ... [详细]
  • Scrapy 爬取图片
    1.创建Scrapy项目scrapystartprojectCrawlMeiziTuscrapygenspiderMeiziTuSpiderhttps:movie.douban.c ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • CSS|网格-行-结束属性原文:https://www.gee ... [详细]
  • FIN7后门工具伪装成白帽工具进行传播
    fin7,后门,工具,伪装,成,白, ... [详细]
  • mac os Spotlight使用技巧:直接在谷歌搜索
    一、背景想直接借助spotlight进行google。当然现在有现成的第三方可以做到,不想安装第三方二、方法唤起Spotlight,输入想要goo ... [详细]
  • 2021年最详细的Android屏幕适配方案汇总
    1Android屏幕适配的度量单位和相关概念建议在阅读本文章之前,可以先阅读快乐李同学写的文章《Android屏幕适配的度量单位和相关概念》,这篇文章 ... [详细]
  • css,背景,位置,y,background, ... [详细]
author-avatar
文布得
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有