爬取豆瓣https://movie.douban.com/top250,翻页,图片

如何爬取豆瓣https://movie.douban.com/top250

操作步骤加思考:
①所需要的模块

import requests
from lxml import etree
# pandas用来保存为csv的
import pandas as pd
# os所需的文件夹的下载
import os
# 获取其页面代码

②获取页面代码,因为豆瓣有反爬虫,加上headers

def get_html(url):
    headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'}

    try:
        html=requests.get(url,headers=headers)
        # 这是判断可否爬取的成功,等于200既成功
        html.encoding=html.apparent_encoding
        if html.status_code ==  200:
            print("成功获取源代码")
    # 将获取源代码的错误的找出,并提示
    except Exception as e:
        print("获取源代码失败:%s"%e)
    # 返回输出其内容
    return html.text

③将页面的内容获取

def parse_html(html):
    # 将imgurl,movie装一个列表中,时其完整
    imgurls=[]
    movies=[]
    # etree的一种方法
    html=etree.HTML(html)
    lis=html.xpath("//ol[@class='grid_view']/li")
    for li in lis:
        # .//a的意思是选择a上下节点
        name=li.xpath(".//a/span[@class='title']/text()")[0]
        director_actor=li.xpath(".//div[@class='bd']/p/text()")[0].strip()
        info=li.xpath(".//div[@class='bd']/p/text()")[1].strip()
        rating_score=li.xpath(".//div[@class='star']/span[2]/text()")[0]
        rating_num=li.xpath(".//div[@class='star']/span[4]/text()")[0]
        introduce=li.xpath(".//p[@class='quote']/span/text()")[0]
        imgurl=li.xpath(".//img/@src")[0]
        movie={'name':name,'director_actor':director_actor,'info':info,'rating_score':rating_score,'rating_num':rating_num,'introduce':introduce}
        movies.append(movie)
        imgurls.append(imgurl)
    # 返回将内容带回if__name__中
    return movies,imgurls
    

④将图片下载在一个文件夹里

def downloadimg(url,movie):
    #if为有这个目录就在直接到movieposter文件夹下
    if 'movieposter' in os.listdir(r"D:\univesity\sophomore holiday 2020\web crawl\first\duoban"):
        pass
    #否则的话,os.mkdir新建一个文件夹
    else:
        os.mkdir(r"D:\univesity\sophomore holiday 2020\web crawl\first\duoban\movieposter")
    # os.chdir直接移动到这个文件夹下,可加可不加,因为前面有if了
    os.chdir(r"D:\univesity\sophomore holiday 2020\web crawl\first\duoban\movieposter")
    # 请求图片的链接
    img = requests.get(url).content
    # 保存为movie的名字,因为前面是movies[i],所以为一个,保存类型为wb
    with open(movie['name']+".jpg",'wb')as f:
        print("正在下载:%s"%movie["name"])
        f.write(img)

⑤引用并将数据保存到CSV中

if __name__=="__main__":
    page=0
    # 将movie[i]传入列表moviedata,只有一个中括号,才能pd.DataFrame
    moviedata=[]
    for page in range(0,10):
        page_url=page*25
        print(page_url)
        url="https://movie.douban.com/top250?start="+str(page_url)+"&filter="
        html=get_html(url)
        # 获取parse_html中的内容
        movies = parse_html(html)[0]
        imgurls = parse_html(html)[1]
        for i in range(len(imgurls)):
            # 将其imgurls[i],movie[i]传入download中的url,movie
            downloadimg(imgurls[i],movies[i])
            # 其内容只留一个中括号
            moviedata.append(movies[i])
    # 变成序列模式,才能传入csv中
    moviesdata=pd.DataFrame(moviedata)
    print(moviesdata)
        # 后将电影的内容保存在其目录下
    moviesdata.to_csv("D:/univesity/sophomore holiday 2020/web crawl/first/duoban/movie.csv")
    print("电影保存成功")

注意:在写代码是要注意边学边运行一下,找出错误,及时解决

不懂可参考: https://www.bilibili.com/video/av42518759?from=search&seid=9371901369372312675

扩展:①#改进:在图片上加上序号,将csv中的序号去掉,或者从1开始
②#深入:对其第二链接的爬取
新知识:①关于import os 对文件夹的操作
② 使用这个方法来判断一开始爬取的页面是否成功

try:
        html=requests.get(url,headers=headers)
        # 这是判断可否爬取的成功,等于200既成功
        html.encoding=html.apparent_encoding
        if html.status_code ==  200:
            print("成功获取源代码")
    # 将获取源代码的错误的找出,并提示
    except Exception as e:
        print("获取源代码失败:%s"%e)
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值