爬取 豆瓣8.0以上的电影信息
打开F12 开发着工具 会发现这个是加载的数据。所以不能普通请求。
这是我们打开network
会发现一个这样的链接
这里返回了我们想要的数据
我们发现tag属性就是类型 page_limit就是每页显示多少,page_start 是每页从哪开始。
所以我们只要请求这个网站获得 他的返回的json数据就可以了
根据json数据提取自己所需要的东西 就可以了
下面是代码
import requests
import json
import pymysql
import lxml
from urllib.parse import urlencode
from bs4 import BeautifulSoup
from requests.exceptions import RequestException
import re
def get_respons(url):
try :
respons = requests.get(url)
if respons.status_code == 200 and respons != None:
return respons
except:
print (url+"请求出错")
return None
def get_json_url(rtext):
js = json.loads(rtext)
sub = js["subjects"]
tit= []
for i in range(10):
a = []
a.append(sub[i]["title"])
a.append(sub[i]["rate"])
a.append(sub[i]["url"])
yield a
def write_sql(name): #把电影名 导演 图片地址 写入mysql
db = pymysql.connect(host="localhost",user="root",password="123456",db="myname",charset="utf8" )
cursor = db.cursor()
dir=""
for s in name[2] :
dir+=s+'/'
act=""
for s in name[3]:
act+=s+'/'
sql = "INSERT INTO HJ(MOVIE,RATE,DIRECT,ECT,ACTOR,LEN,IMG) \
VALUES ('%s',%f, '%s','%s','%s',%f,'%s')" % \
(name[5],float(name[6]),name[0],dir,act,float(name[4]),name[1])
#print (sql)
try:
#print (sql)
cursor.execute(sql)#数据库写入
db.commit()#提交数据
except:
print (1)
db.rollback()#撤回
db.close()#关闭数据库
print (name[1]+"写入成功")
def write_file(url,file):#写入图片
r = get_respons(url)
try:
with open(file,"wb") as fp:
fp.write(r.content)
except:
return False
def get_data(rtext):#获得电影名 导演 和 图片地址
soup = BeautifulSoup(rtext,'lxml')
all_img = soup.find_all('a',class_='nbgnbg')
h1 = soup.find("h1")
p1 = soup.find_all("span",class_="attrs")
ti = soup.find("span",attrs={"content":True,"property":"v:runtime"})
time=ti["content"]#片长
movie_name=h1.span.string #电影名
img_url=all_img[0].img.attrs['src']
l = len(str(img_url))
img_url = img_url[0:-4]+".jpg"
direct_name=p1[0].string #导演
ect=[]
actor=[]
for a in p1[1].find_all("a"):
ect.append(a.string) #编剧
for a in p1[2].find_all("a"):
actor.append(a.string)#主演
#print (actor)
name=[direct_name,movie_name+".jpg",ect,actor,time]
file="im/"+movie_name+".jpg"
#print (img_url)
write_file(img_url,file)
return name
def main():
for i in range(0,500,10):
url ="https://movie.douban.com/j/search_subjects?type=movie&tag=%E8%B1%86%E7%93%A3%E9%AB%98%E5%88%86&page_" \
"limit=10"+"&page_start="+str(i)
r = get_respons(url)
for tit in get_json_url(r.text):
ur = tit[2]
respons=get_respons(ur)
name = get_data(respons.text)
name.append(tit[0])
name.append(tit[1])
write_sql(name)
if __name__ =="__main__":
main()