python3 爬取豆瓣8.0以上的信息

爬取 豆瓣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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值