爬取猫眼电影网站电影排行榜TOP100数据 --存入csv
流程
- 确认页面是动态还是静态:在源码搜索关键字看是否能找到
- 查看排行榜页面查询字符串中翻页的规律:规律为:offset=(page-1)*10
- 进入页面源码:右键点击查看元素,复制下需求数据的标签块,如下
<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>
- 写出re:想要的数据为:电影名&朱颜&上映时间
- 爬虫代码
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))