爬取猫眼电影中经典电影里所有电影的电影名,图片以及评分
不多说,直接上代码:
由于爬取数量较多,所以电影图片就没有下载了,爬下来的是图片的网页连接,
可以看我博客里面有篇文章是讲文件的读写操作的,包括json和pickle方式。
import requests
import re
import random
import pymysql
import time
# ------连接数据库
db = pymysql.connect(host='localhost', port=3306,
user='root', passwd='a', db='python', charset='utf8')
cursor=db.cursor()
sql="insert into maoyan( fname,fpic,fscore ) values( %s,%s,%s )"
#proxies={ 'http':'http://61.138.33.20.808' } #使用代理包装一下自己
#浏览器头,同样的包装一下自己
headers={
'User-Agent':'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)'
}
files=[] #用来存储爬到的电影
timeTotal=0 #总耗时
#print(headers)
for type in range(67):
#循环拼接地址
r=requests.get('http://maoyan.com/films?showType=3&offset={type}'.format(type=type*30),proxies=proxies,headers=headers,verify=False)
#定义一个正则表达式获取需要的数据
filemsgPattern=re.compile( 'movie-poster.*?.*?"(.*?)".*?movie-item.*?/films/.*?>(.*?).*?orange">(.*?)
',re.S )
filemsg=re.findall(filemsgPattern,r.text)
print( "第 ",type,"页...,该页有电影:",len(filemsg) )
#得到的filemsg中对应的数据分别为:图片,名字以及评分
for msg in filemsg:
fpic=msg[0]
fname=msg[1]
#这里判断是否有评分
#由于电影中有些评分项是写的无评分的,如果其长度为4则说明该电影是无评分
if len(msg[2])!=4: #如果电影无评分,继续爬取得到该电影的评分
a=re.compile('>(.*?).*?>(.*?)<',re.S)
s=re.findall(a,msg[2])
for x,y in s:
fscore=x+y #x为小数点左边的数,y为小数点右边的数
else:
fscore=msg[2]
file=[fname,fpic,fscore]
files.append(file)
print(file)
#这里是每爬取到一百个电影做一次批量插入数据库,特点:快!减少数据库压力
if( len(files)%100==0 and len(files)!=0 ):
print('已爬电影:================',len(files))
try:
cursor.executemany(sql,files[-100:]) #批量插入:每爬取一百个电影信息再存入数据库
time.sleep(random.randint(1,2))
db.commit()
files.clear() #数据加入数据库之后清空files
except:
db.rollback()
#如持续爬取一个网页大量数量会被封ip的呢
times=random.randint(5, 10) #程序挂起一段时间,克制一下反爬虫机制
timeTotal+=times
print("第",type,"页结束,请等待:",times,"秒...")
time.sleep(times)
print("爬取完成,共费时:",timeTotal)
print( len(files) )
if len(files):
cursor.executemany(sql,files[:len(files)]) #怕最后没有一百个电影时没执行插入
time.sleep(random.randint(1,2))
db.commit()
cursor.close()
db.close()
下面是开始爬取到爬取完的截图
如果执行上面代码报错,可能是那个代理ip用不了了,在西刺代理或者快代理上重新找一个可用的就行了。我博客里面有一篇是关于爬取快代理的文章
谢谢您的阅读!