天天看点

爬取猫眼电影排行榜TOP100数据 --存入mysql

爬取猫眼电影网站电影排行榜TOP100数据 --存入csv

        • 流程

流程

  1. 确认页面是动态还是静态:在源码搜索关键字看是否能找到
  2. 查看排行榜页面查询字符串中翻页的规律:规律为:offset=(page-1)*10
  3. 进入页面源码:右键点击查看元素,复制下需求数据的标签块,如下
<p class="name"><a href="/films/1228" title="天空之城" data-act="boarditem-click" data-val="{movieId:1228}">天空之城<
</a></p>
        <p class="star">
                主演:寺田农,鹫尾真知子,龟山助清
        </p>
<p class="releasetime">上映时间:1992-05-01</p>
           
  1. 写出re:想要的数据为:电影名&朱颜&上映时间
  1. 爬虫代码
from urllib import request
from fake_useragent import UserAgent
from time import sleep
import re
import pymysql

class MaoyanSpider(object):
	#定义常用变量
	def __init__(self):
 		self.url = 'https://maoyan.com/board/4?offset={}'
 		#计数加了多少条数据
  		self.i = 0
  	
  		#连接mysql
  		self.db = pymsql.connect(
  					'localhsot','root','password','数据表名',
  					charset='utf8'
  					)
  		#建立游标
  		self.cursor = self.db.cursor()
  		#定义列表,用来存放所有电影的元组
  		self.all_list = []

 	#发请求,url得从run()中传进来
 	def get_html(self,url):
 		#包装请求头
  		headers = {'User-Agent':UserAgent().random}
		req = request.Request(url=url,headers=headers)
  		#发请求
		resp = request.urlopen(req)
  		#读取数据
		html = resp.read().decode(utf-8)
  		return html

	#解析函数,用正则解析提取到的页面数据
 	def parse_html(self,html):
		#创建编译对象
  		re_bds = '<p class="name">.*?title="(.*?)".*?<p class="star">(.*?)</p>.*?<p class="releasetime">(.*?)</p>'
 		pattern = re.compile(re_bds,re.S)
  		#用编译对象进行正则匹配
		r_list = pattern.findall(html)
    		print(r_list)

	#处理每一页的电影信息,最终格式为[(),(),(),...]
 	def save_html(self,r_list):
 		for film in r_list:
 			#将每个电影的信息做成一个元组
 			s = (film[0],film[1].strip(),film[2].strip()[5:15])  
 			# 放入all_list,最终格式为:[(),(),(),...]
 			self.all_list.append(s)

 			#计数
			self.i += 1		
				

		#入口函数
 		def run(self):
			#编码
 	 		#此案例无需编码

			begin = int(input('请输入起始页:'))
  			end = int(input('请输入终止页:'))

			for page in range(begin,end+1):
   				#拼接url
   				url = self.url.format((page-1)*10)

				#用实例调用发送请求的函数,并传入url,接收每一页的html数据
   				html = self.get_html(url)

				#数据处理,用实例对象调用解析函数解析爬到的数据,并传入原数据,得到每页的最终数据
				r_list = self.parse_html(html)
   				# r_list 数据格式:
				#[('名称',' xx主演xx ','上映时间:1993-01-01'),('名称','xx主演xx ','上映时间:1993-01-01'),...]
				
				#将每页数据全都放到 all_list 中
				self.save_html(r_list)
				
				#设置读取的间隔时间
   				time.sleep(random.uniform(0,1))
   				
   			#定义插入数据表 filmtab 的插入语句
   			ins = 'insert into filmtab value(%s,%s,%s)'
   			#将 all_list 一次性放入数据表中,减少IO
   			# cursor.executemany(ins,[(),(),(),...]),每个元组为一个单位填入ins
   			self.cursor.executemany(ins,self.all_list)
   			self.db.commit()
   			self.cursor.close()
   			self.db.close()
   			
			print('数据数量:',self.i)
			#最终写入格式:音乐之声 主演:朱莉·安德鲁斯,克里斯托弗·普卢默,埃琳诺·帕克 1965-03-02  。。。

if __name__ == '__main__':
 	#计算爬取用时
	start =time.time()

	spider = MaoyanSpider()
 	spider.run()

	end = time.time()
	print('执行时间:%.2f' % (end-start))