字符串常用方法

  1. # 去掉左右空格
  2. 'hello world'.strip() # 'hello world'
  3. # 按指定字符切割
  4. 'hello world'.split(' ') # ['hello','world']
  5. # 替换指定字符串
  6. 'hello world'.replace(' ','#') # 'hello#world'

csv模块

作用:将爬取的数据存放到本地的csv文件中

使用流程

  1. 导入模块
  2. 打开csv文件
  3. 初始化写入对象
  4. 写入数据(参数为列表)
  1. import csv
  2.  
  3. with open('test.csv','w') as f:
  4.  
  5. writer = csv.writer(f) # 初始化写入对象
  6. # 写一行
  7. writer.writerow(['超哥哥',20])
  8. writer.writerow(['步惊云',22])
  9.  
  10. with open('test.csv','a') as f:
  11. writer = csv.writer(f)
  12. # 写多行
  13. data_list = [('聂风',23),('秦霜',30)]
  14. 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、编写程序框架,完善程序

  1. 打印程序执行时间
  2. 随机的User-Agent,(确保每次发请求使用随机)
  3. 数据爬下来后做处理(字符串),定义成字典
  4. 一条龙: 获取 -> 调用解析 -> 数据处理
  5. 猫眼电影数据存入本地 maoyanfilm.csv 文件
  1. from urllib import request
  2. import time
  3. import re
  4. import csv
  5. import random
  6.  
  7. class MaoyanSpider(object):
  8. def __init__(self):
  9. self.page = 1 # 用于记录页数
  10. self.url = 'https://maoyan.com/board/4?offset={}'
  11. self.agent = [
  12. 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 \
  13. Safari/535.1',
  14. 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0',
  15. 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; \
  16. .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)',
  17. 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1']
  18.  
  19. # 请求
  20. def get_page(self, url):
  21. headers = {'User-Agent': random.choice(self.agent)} # 每次使用随机的user-agent
  22. req = request.Request(url=url, headers=headers) # 创建请求对象
  23. res = request.urlopen(req) # 发起请求
  24. html = res.read().decode('utf-8') # 获取请求内容
  25. self.parse_page(html) # 直接调用解析函数
  26.  
  27. # 解析
  28. def parse_page(self, html):
  29. pattren = re.compile(
  30. '<div class="movie-item-info">.*?title="(.*?)".*?class="star">(.*?)</p>.*?releasetime">(.*?)</p>', re.S)
  31. r_list = pattren.findall(html)
  32. # rlist: [('霸王别姬', '\n 主演:张国荣,张丰毅,巩俐\n ', '上映时间:1993-01-01'),(...),(...)]
  33. self.write_page(r_list) # 写入csv文件
  34.  
  35. # # 保存,打印输出
  36. # def write_page(self,r_list):
  37. # one_film_dict = {}
  38. # for rt in r_list:
  39. # one_film_dict['name'] = rt[0].strip()
  40. # one_film_dict['star'] = rt[1].strip()
  41. # one_film_dict['time'] = rt[2].strip()[5:15]
  42. #
  43. # print(one_film_dict)
  44.  
  45. # 保存到csv文件(writerows) -- 推荐使用此方法
  46. def write_page(self, r_list):
  47. # 空列表,最终writerows()的参数: [(),(),()]
  48. film_list = []
  49. with open('maoyan.csv', 'a',newline="") as f:
  50. writer = csv.writer(f)
  51. for rt in r_list:
  52. # 把处理过的数据定义成元组
  53. t = (rt[0], rt[1].strip(), rt[2].strip()[5:15])
  54. film_list.append(t)
  55.  
  56. writer.writerows(film_list)
  57.  
  58. def main(self):
  59. for offset in range(0, 31, 10):
  60. url = self.url.format(offset)
  61. self.get_page(url)
  62. time.sleep(random.randint(1, 3))
  63. print('第%d页爬取完成' % self.page)
  64. self.page += 1
  65.  
  66. if __name__ == '__main__':
  67. start = time.time()
  68. spider = MaoyanSpider()
  69. spider.main()
  70. end = time.time()
  71. print('执行时间: %.2f' % (end - start))

数据持久化存储(MySQL数据库)

让我们来回顾一下pymysql模块的基本使用

  1. import pymysql
  2.  
  3. db = pymysql.connect('localhost', 'root', '', 'maoyandb', charset='utf8')
  4. cursor = db.cursor() # 创建游标对象
  5. # execute()方法第二个参数为列表传参补位
  6. cursor.execute('insert into film values(%s,%s,%s)', ['霸王别姬', '张国荣', ''])
  7. db.commit() # 提交到数据库执行
  8. cursor.close() # 关闭
  9. db.close()

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

  1. import pymysql
  2.  
  3. # 数据库连接对象
  4. db = pymysql.connect('localhost', 'root', '', charset='utf8')
  5. cursor = db.cursor() # 游标对象
  6. ins_list = [] # 存放所有数据的大列表
  7. for i in range(2):
  8. name = input('请输入第%d个学生姓名:' % (i + 1))
  9. age = input('请输入第%d个学生年龄:' % (i + 1))
  10. ins_list.append([name, age])
  11.  
  12. ins = 'insert into t3 values(%s,%s)' # 定义插入语句
  13. cursor.executemany(ins, ins_list) # 一次数据库的IO操作可插入多条语句,提升性能
  14.  
  15. db.commit() # 提交到数据库执行
  16. cursor.close() # 关闭游标
  17. db.close() # 关闭数据库
  18.  
  19. ins = 'insert into maoyanfilm values(%s,%s,%s)'
  20. cursor.execute(['霸王', '国荣', ''])
  21. cursor.executemany([
  22. ['月光宝盒', '周星驰', ''],
  23. ['大圣娶亲', '周星驰', '']])

练习:把猫眼电影案例中电影信息存入MySQL数据库中(尽量使用executemany方法)

  1. from urllib import request
  2. import time
  3. import re
  4. import pymysql
  5. import random
  6.  
  7. class MaoyanSpider(object):
  8. def __init__(self):
  9. self.page = 1 # 用于记录页数
  10. self.url = 'https://maoyan.com/board/4?offset={}'
  11. self.ua_list = [
  12. 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) \
  13. Chrome/14.0.835.163 Safari/535.1',
  14. 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0',
  15. 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; \
  16. .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)']
  17. # 创建数据库连接对象和游标对象
  18. self.db = pymysql.connect('localhost', 'root', '', 'maoyandb', charset='utf8')
  19. self.cursor = self.db.cursor()
  20.  
  21. # 获取
  22. def get_page(self, url):
  23. # 每次使用随机的user-agent
  24. headers = {'User-Agent': random.choice(self.ua_list)}
  25. req = request.Request(url=url, headers=headers)
  26. res = request.urlopen(req)
  27. html = res.read().decode('utf-8')
  28. self.parse_page(html) # 直接调用解析函数
  29.  
  30. # 解析
  31. def parse_page(self, html):
  32. pattren = re.compile(
  33. '<div class="movie-item-info">.*?title="(.*?)".*?class="star">(.*?)</p>.*?releasetime">(.*?)</p>', re.S)
  34. # rlist: [('霸王别姬','张国荣','1993'),(),()]
  35. r_list = pattren.findall(html)
  36. print(r_list)
  37. self.write_page(r_list)
  38.  
  39. # 存入mysql数据库(executemany([ [],[],[] ]))
  40. def write_page(self, r_list):
  41. film_list = []
  42. ins = 'insert into filmtab values(%s,%s,%s)' # 定义插入语句
  43. # 处理数据,放到大列表film_list中
  44. for rt in r_list:
  45. one_film = [rt[0], rt[1].strip(), rt[2].strip()[5:15]]
  46. # 添加到大列表中
  47. film_list.append(one_film)
  48. # 一次数据库IO把1页数据存入
  49. self.cursor.executemany(ins, film_list)
  50. # 提交到数据库执行
  51. self.db.commit()
  52.  
  53. def main(self):
  54. for offset in range(0, 31, 10):
  55. url = self.url.format(offset)
  56. self.get_page(url)
  57. time.sleep(random.randint(1, 3))
  58. print('第%d页爬取完成' % self.page)
  59. self.page += 1
  60.  
  61. # 断开数据库(所有页爬完之后)
  62. self.cursor.close()
  63. self.db.close()
  64.  
  65. if __name__ == '__main__':
  66. start = time.time()
  67. spider = MaoyanSpider()
  68. spider.main()
  69. end = time.time()
  70. 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数据库

  1. import pymongo
  2.  
  3. # 1.连接对象
  4. conn = pymongo.MongoClient(host='127.0.0.1', port=27017)
  5. db = conn['maoyandb'] # 2.库对象
  6. myset = db['filmtab'] # 3.集合对象
  7. myset.insert_one({'name': '赵敏'}) # 4.插入数据库

练习:把猫眼电影案例中电影信息存入MongDB数据库中

  1. from urllib import request
  2. import re
  3. import time
  4. import random
  5. import pymongo
  6.  
  7. class MaoyanSpider(object):
  8. def __init__(self):
  9. self.url = 'https://maoyan.com/board/4?offset={}'
  10. # 计数
  11. self.num = 0
  12. # 创建3个对象
  13. self.conn = pymongo.MongoClient('localhost', 27017)
  14. self.db = self.conn['maoyandb']
  15. self.myset = self.db['filmset']
  16. self.ua_list = [
  17. 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1',
  18. 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0',
  19. 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET \
  20. CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)', ]
  21.  
  22. def get_html(self, url):
  23. headers = {
  24. 'User-Agent': random.choice(self.ua_list)
  25. }
  26. req = request.Request(url=url, headers=headers)
  27. res = request.urlopen(req)
  28. html = res.read().decode('utf-8')
  29. # 直接调用解析函数
  30. self.parse_html(html)
  31.  
  32. def parse_html(self, html):
  33. re_bds = r'<div class="movie-item-info">.*?title="(.*?)".*?class="star">(.*?)</p>.*?releasetime">(.*?)</p>'
  34. pattern = re.compile(re_bds, re.S)
  35. # film_list: [('霸王别姬','张国荣','1993'),()]
  36. film_list = pattern.findall(html)
  37. # 直接调用写入函数
  38. self.write_html(film_list)
  39.  
  40. # mongodb数据库
  41. def write_html(self, film_list):
  42. for film in film_list:
  43. film_dict = {
  44. 'name': film[0].strip(),
  45. 'star': film[1].strip(),
  46. 'time': film[2].strip()[5:15]
  47. }
  48. # 插入mongodb数据库
  49. self.myset.insert_one(film_dict)
  50.  
  51. def main(self):
  52. for offset in range(0, 31, 10):
  53. url = self.url.format(offset)
  54. self.get_html(url)
  55. time.sleep(random.randint(1, 2))
  56.  
  57. if __name__ == '__main__':
  58. start = time.time()
  59. spider = MaoyanSpider()
  60. spider.main()
  61. end = time.time()
  62. print('执行时间:%.2f' % (end - start))

电影天堂案例(二级页面抓取)

1、查看是否为静态页面,是否为动态加载

  右键 - 查看网页源代码

2、确定URL地址

  百度搜索 :电影天堂 - 2019年新片 - 更多

3、目标

*********一级页面***********
       1、电影名称
       2、电影链接
       
*********二级页面***********
       1、下载链接

4、步骤

  1. 找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. 写正则表达式

1、一级页面正则表达式(电影名称、电影详情链接)

<table width="100%".*?<td height="26">.*?<a href="(.*?)".*?>(.*?)</a>

2、二级页面正则表达式

<td style="WORD-WRAP.*?>.*?>(.*?)</a>

  1. 代码实现

# decode('gbk','ignore') 注意ignore参数

# 注意结构和代码可读性(一个函数不要太冗余)

  1. from urllib import request
  2. import re
  3. import time
  4. import random
  5. from useragents import *
  6. import pymysql
  7.  
  8. class FilmSky(object):
  9. def __init__(self):
  10. self.url = 'https://www.dytt8.net/html/gndy/dyzz/list_23_{}.html'
  11. # 定义两个对象
  12. self.db = pymysql.connect('127.0.0.1', 'root', '', 'maoyandb', charset='utf8')
  13. self.cursor = self.db.cursor()
  14.  
  15. # 获取html函数(因为两个页面都需要发请求)
  16. def get_page(self, url):
  17. req = request.Request(url=url, headers={'User-Agent': random.choice(ua_list)})
  18. res = request.urlopen(req)
  19. # ignore参数,实在处理不了的编码错误忽略
  20. # 查看网页源码,发现网页编码为 gb2312,不是 utf-8
  21. html = res.read().decode('gbk', 'ignore')
  22. return html
  23.  
  24. # 解析提取数据(把名称和下载链接一次性拿到)
  25. # html为一级页面响应内容
  26. def parse_page(self, html):
  27. # 1. 先解析一级页面(电影名称 和 详情链接)
  28. pattern = re.compile('<table width="100%".*?<td height="26">.*?<a href="(.*?)".*?>(.*?)</a>', re.S)
  29. # film_list: [('详情链接','名称'),()]
  30. film_list = pattern.findall(html)
  31. # [('/html/gndy/dyzz/20190806/58956.html', '019年惊悚动作《报仇雪恨/血债血偿》BD中英双字幕'),(),()]
  32. ins = 'insert into filmsky values(%s,%s)'
  33. for film in film_list:
  34. film_name = film[1]
  35. film_link = 'https://www.dytt8.net' + film[0]
  36. # 2. 拿到详情链接后,再去获取详情链接html,提取下载链接
  37. download_link = self.parse_two_html(film_link)
  38.  
  39. self.cursor.execute(ins, [film_name, film_link])
  40. self.db.commit()
  41.  
  42. # 打印测试
  43. d = {'电影名称': film_name, '下载链接': download_link}
  44. print(d)
  45.  
  46. # {'电影名称': '019年惊悚动作《报仇雪恨/血债血偿》BD中英双字幕', '下载链接': 'ftp://ygdy8:ygdy8@yg90.dydytt.net:8590/阳光电影www.ygdy8.com.报仇雪恨.BD.720p.中英双字幕.mkv'}
  47.  
  48. # 解析二级页面,获取下载链接
  49. def parse_two_html(self, film_link):
  50. two_html = self.get_page(film_link)
  51. pattern = re.compile('<td style="WORD-WRAP.*?>.*?>(.*?)</a>', re.S)
  52. download_link = pattern.findall(two_html)[0]
  53. return download_link
  54.  
  55. # 主函数
  56. def main(self):
  57. for page in range(1, 11):
  58. url = self.url.format(page)
  59. html = self.get_page(url)
  60. self.parse_page(html)
  61. time.sleep(random.randint(1, 3))
  62. print('第%d页完成' % page)
  63.  
  64. if __name__ == '__main__':
  65. start = time.time()
  66. spider = FilmSky()
  67. spider.main()
  68. end = time.time()
  69. print('执行时间:%.2f' % (end - start))

猫眼电影和电影天堂数据csv和mysql存储的更多相关文章

  1. 使用Beautiful Soup爬取猫眼TOP100的电影信息

    使用Beautiful Soup爬取猫眼TOP100的电影信息,将排名.图片.电影名称.演员.时间.评分等信息,提取的结果以文件形式保存下来. import time import json impo ...

  2. windows环境下nutch2.x 在eclipse中实现抓取数据存进mysql详细步骤

    nutch2.x 在eclipse中实现抓取数据存进mysql步骤 最近在研究nutch,花了几天时间,也遇到很多问题,最终结果还是成功了,在此记录,并给其他有兴趣的人提供参考,共同进步. 对nutc ...

  3. Oracle数据迁移至MySQL

    ORACLE DB: 11.2.0.3.0 MYSQL DB: 5.5.14 因项目需求,需要将ORACLE生产中数据迁移至MYSQL数据库中作为初始数据,方法有如下几种: 1.ORACLE OGG ...

  4. 【PHP】将EXCEL表中的数据轻松导入Mysql数据表

    在网络上有不较多的方法,在此介绍我已经验证的方法. 方法一.利用EXCEL表本身的功能生成SQL代码 ①.先在“phpmyadmin”中建立数据库与表(数据库:excel,数据表:excel01,字段 ...

  5. 使用命令行将Excel数据表导入Mysql中的方法小结

    从Excel数据表导入MySQL,已经做过好几次了,但每次都会碰到各种问题:invalid utf8 character string, data too long, ...,浪费了不少时间 为了提高 ...

  6. 如何将MongoDB数据库的数据迁移到MySQL数据库中

    FAQ v2.0终于上线了,断断续续忙了有2个多月.这个项目是我实践的第一个全栈的项目,从需求(后期有产品经理介入)到架构,再到设计(有征询设计师的意见).构建(前端.后台.数据库.服务器部署),也是 ...

  7. 利用workbench将excel数据导入到MySQL中

    数据导入的方式(csv,txt之类) 在MySQL中,数据导入的方式有两种方式 通过第三方客户端导入(workbench) 通过mysql client 方式导入 通过mysql clinet的导入方 ...

  8. Python网络数据采集3-数据存到CSV以及MySql

    Python网络数据采集3-数据存到CSV以及MySql 先热热身,下载某个页面的所有图片. import requests from bs4 import BeautifulSoup headers ...

  9. 大数据项目之_15_电信客服分析平台_01&02_项目背景+项目架构+项目实现+数据生产+数据采集/消费(存储)

    一.项目背景二.项目架构三.项目实现3.1.数据生产3.1.1.数据结构3.1.2.编写代码3.1.3.打包测试3.2.数据采集/消费(存储)3.2.1.数据采集:采集实时产生的数据到 kafka 集 ...

随机推荐

  1. 深挖Openstack Nova - Scheduler调度策略

    深挖Openstack Nova - Scheduler调度策略   一.  Scheduler的作用就是在创建实例(instance)时,为实例选择出合适的主机(host).这个过程分两步:过滤(F ...

  2. css常用语法续集

    1   设置字体  body{font-familly:“宋体”} 2 可以使用下面代码设置网页中文字的字号为12像素,并把字体颜色设置为#666(灰色): body{font-size:12px;c ...

  3. 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 ...

  4. plotly之set_credentials_file问题

    相信了解可视化的同学们都听说过plotly,笔者也是第一次了解这个网站,然后兴冲冲地设置,但是没想到第一次进行在线账号初始化就出现了问题! python3报错为module 'plotly.tools ...

  5. spring-boot项目的docker集成化部署(一)

    目录 spring-boot项目的docker集成化部署 前言 基本思路与方案 基本步骤 准备源码 服务器和基础环境 结语 1. 本文总结: 2. 后期优化: spring-boot项目的docker ...

  6. React-Native之打包发布(Android)

    React-Native之打包发布(Android) 一,介绍与需求 移动端打包发布到应用市场 二,发布配置 注意:以下所有操作都在win10下进行,React Native版本0.59.5,andr ...

  7. DevOps实施历程-v1.0

    ​    有AF项目的成功案例(DevOps实施历程-半自动化),公司新项目全部依此为模板,实现了从代码到安装的自动化流水线,为此我输出了Jenkins自动化指南.AF项目指南等文档,方便大家查阅和参 ...

  8. 2、JAVA相关基础的学习和工具

    个人感觉,各种语言的基础知识,例如标识符,运算符等在宏观上几乎是一样的,只是在某些方面上会有一点点差异,因为本人已经有了语言基础,所以对于标识符,关键字,运算符等方面的只是便不作赘述,敬请谅解,如果你 ...

  9. 对Java中HashCode方法的深入思考

    前言 最近在学习 Go 语言,Go 语言中有指针对象,一个指针变量指向了一个值的内存地址.学习过 C 语言的猿友应该都知道指针的概念.Go 语言语法与 C 相近,可以说是类 C 的编程语言,所以 Go ...

  10. 如何使用dmidecode命令查看硬件信息

    引言 当我们需要获取机器硬件信息时,可使用linux系统自带的dmidecode工具进行查询. dmidecode命令通过读取系统DMI表,显示服务器硬件和BIOS信息.除了可使用dmidecode查 ...