使用正则猫眼电影top100抓取
(未能爬取成功,暂时无法避过安全验证,案例可移至day06豆瓣爬取)
需求:
百度搜索-猫眼电影-榜单-top100榜
抓取数据:电影名称、主演、上映时间
请求头:headers={‘User-Agent’:‘Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0’}
实现步骤:
1、查看所抓取数据在响应内容中是否存在
右键-查看网页源码-搜索所抓取数据关键字(可以定义为电影名称),需要存在
2、查找并分析URL规律
第一页:https://maoyan.com/board/4?offset=0
第二页:https://maoyan.com/board/4?offset=10
第n页:offset=(n-1)*10
3编写正则表达式:
HTML源码:
<div class="movie-item-info">
<p class="name"><a href="/films/416" title="盗梦空间" data-act="boarditem-click" data-val="{movieId:416}">盗梦空间</a></p>
<p class="star">
主演:莱昂纳多·迪卡普里奥,渡边谦,约瑟夫·高登-莱维特
</p>
<p class="releasetime">上映时间:2010-09-01</p> </div>
转化为正则表达式为:
<div class="movie-item-info">.*?title="(.*?)".*?<p class="star">(.*?)</p>.*?<p class="releasetime">(.*?)</p>'
4、定义程序结构
“”"
#实现代码
import urllib.request
import re
import time
import random
class MaoyanSpider:
#1、定义常量
def __init__(self):
self.url='http://www.maoyan.com/board/4?sVersion=1&offset={}'
self.headers={'User-Agent':'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E'}
#2、获取响应内容
def get_html(self,url):
req=urllib.request.Request(url=url,headers=self.headers)
res=urllib.request.urlopen(req,timeout=3)
html=res.read().decode()
print(html)
#直接调用解析函数
self.parse_html(html)
#3、解析提取数据函数
def parse_html(self,html):
regex = '<div class="movie-item-info">.*?title="(.*?)".*?<p class="star">(.*?)</p>.*?<p class="releasetime">(.*?)</p>'
pattern=re.compile(regex,re.S)
r_list=pattern.findall(html)
#直接调用数据处理函数
self.save_html(r_list)
#4、数据处理函数
def save_html(self,r_list):
item={}
for r in r_list:
item['name']=r[0].strip()
item['star']=r[1].strip()
item['time']=r[2].strip()
print(item)
#5、程序入口
def run(self):
#拼接url
for page in range(0,91,10):
url=self.url.format(page)
#发送响应请求
self.get_html(url)
#控制数据抓取的频率
time.sleep(random.randint(1,2))
if __name__=='__main__':
spider=MaoyanSpider()
spider.run()