• python爬取豆瓣电影top250


    1、分析网页

    当我们去爬取网页时,首先要做的就是先分析网页结构,然后就会发现相应的规律,如下所示:
    在这里插入图片描述
    生成链接:从网页链接的规律中可得写一个for循环即可生成它的链接,其中它的间隔为25,程序如下:

    for page in range (0,226,25):
        url ="https://movie.douban.com/top250?start=%s&filter="%page
        print (url)
    

    得到的结果如下:
    在这里插入图片描述

    2、请求服务器

    在爬取网页之前,我们要向服务器发出请求

    2.1导入包

    没有安装requests包的要先进行安装,步骤为:1.win+R运行——2.cmd回车——3.输入命令pip install requests

    2.2设置浏览器代理

    在这里插入图片描述
    设置浏览器代理的代码如下:

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

    2.3请求服务器格式

    请求源代码,向服务器发出请求,如果在后面加上.text表示输出文本内容,代码如下图所示:

    requests.get(url = test_url, headers = headers)
    
    

    2.4请求服务器代码汇总

    import requests
    #pip安转 pip install requests————>win+r,运行————>cmd,回车,————>pip
    test_url = 'https://movie.douban.com/top250?start=0&filter=' #''格式化,为字符串
    
    #设置浏览器代理,它是一个字典
    headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
    }
    
    #请求源代码,向服务器发出请求,200代表成功
    reponse = requests.get(url = test_url, headers = headers).text
    # 快捷键运行,Ctrl+Enter
    

    3.xpath提取信息

    3.1获取xpath节点的方法

    在这里插入图片描述

    3.2xpath提取内容

    from lxml import etree #导入解析库
    html_etree = etree.HTML(reponse) # 看成一个筛子,树状
    

    3.2.1提取文本

    当我们在提取标签内的文本时,要在复制的xpath后面加上/text()
    如《霸王别姬》:

    <span class="title">霸王别姬</span>
    

    xpath为:

    //*[@id="content"]/div/div[1]/ol/li[1]/div/div[2]/div[1]/a/span[1]
    

    提取文字:

    name = html_etree.xpath('//*[@id="content"]/div/div[1]/ol/li[1]/div/div[2]/div[1]/a/span[1]/text()')
    print ("这是数组形式:",name)
    print ("这是字符串形式:",name[0])
    

    3.2.2提取链接

    我们在提取链接时,需要在复制到的xpath后面加上/@href , 指定提取链接,

    movie_url = html_etree.xpath('//*[@id="content"]/div/div[1]/ol/li[1]/div/div[2]/div[1]/a/@href')
    print ("这是数组形式:",movie_url)
    print ("这是字符串形式:",movie_url[0])
    

    结果如下:
    在这里插入图片描述

    3.2.3提取标签元素

    提取标签元素和提取链接的方法一样,不过要在后面加上 /@class 就可以了,

    rating = html_etree.xpath('//*[@id="content"]/div/div[1]/ol/li[1]/div/div[2]/div[2]/div/span[1]/@class')
    print ("这是数组形式:",rating)
    print ("这是字符串形式:",rating[0])
    

    结果如下:
    在这里插入图片描述

    4.正则表达式

    4.1提取固定位置的信息

    正则表达式中用(.*?)来提取我们想要的信息,在使用正则表达式时,通常要先导入re这个包,举例如下:

    import re
    test = "我是js"
    text = re.findall("我是.*?",test)
    print (text)
    

    结果如下:
    在这里插入图片描述

    4.2匹配出数字

    比如说我们要匹配出有多少人评价这部电影,我们可以这样写:

    import re 
    data = "1059232人评价"
    num = re.sub(r'D', "", data)
    print("这里的数字是:", num)
    

    结果如下:
    在这里插入图片描述

    5、提取一页中的所有信息

    比如说我们这里提取最后一页的电影名称,如下:

    li = html_etree.xpath('//*[@id="content"]/div/div[1]/ol/li')
    for item in li:
        name = item.xpath('./div/div[2]/div[1]/a/span[1]/text()')[0]
        print (name)
    

    结果如下:
    在这里插入图片描述
    按照这种方法,我们可以把所有的都爬取下来。

    6、把内容写入文本csv

    代码如下:

    import csv
    # 创建文件夹并打开
    fp = open("./豆瓣top250.csv", 'a', newline='', encoding = 'utf-8-sig')
    writer = csv.writer(fp) #我要写入
    
    # 写入内容
    writer.writerow(('排名', '名称', '链接', '星级', '评分', '评价人数'))
    
    #关闭文件
    fp.close()
    
    

    7、把所有代码汇总

    import requests, csv, re
    from lxml import etree
    
    #设置浏览器代理,它是一个字典
    headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
    }
    
    # 创建文件夹并打开
    fp = open("./豆瓣top250.csv", 'a', newline='', encoding = 'utf-8-sig')
    writer = csv.writer(fp) #我要写入
    # 写入内容
    writer.writerow(('排名', '名称', '链接', '星级', '评分', '评价人数'))
    
    for page in range(0, 226, 25): #226
        print ("正在获取第%s页"%page)
        url = 'https://movie.douban.com/top250?start=%s&filter='%page
        
        #请求源代码,向服务器发出请求,200代表成功,回退对其,Ctrl+]
        reponse = requests.get(url = url, headers = headers).text
        # 快捷键运行,Ctrl+Enter
        html_etree = etree.HTML(reponse) # 看成一个筛子,树状
        # 过滤
        li = html_etree.xpath('//*[@id="content"]/div/div[1]/ol/li')
        for item in li:
            #排名
            rank = item.xpath('./div/div[1]/em/text()')[0]
            #电影名称
            name = item.xpath('./div/div[2]/div[1]/a/span[1]/text()')[0]
            #链接
            dy_url = item.xpath('./div/div[2]/div[1]/a/@href')[0]
            #评分
            rating = item.xpath('./div/div[2]/div[2]/div/span[1]/@class')[0]
            rating = re.findall('rating(.*?)-t', rating)[0]
            if len(rating) == 2:
                star = int(rating) / 10  #int()转化为数字
            else:
                star = rating
        #     注释ctrl+?
    
            rating_num = item.xpath('./div/div[2]/div[2]/div/span[2]/text()')[0]
            content = item.xpath('./div/div[2]/div[2]/div/span[4]/text()')[0]
            content = re.sub(r'D', "", content)
    #         print (rank, name, dy_url, star, rating_num, content)
            # 写入内容
            writer.writerow((rank, name, dy_url, star, rating_num, content))
    fp.close()
    
    

    结果如下:
    在这里插入图片描述
    csv文件中的结果:
    在这里插入图片描述
    最后爬取结束。

  • 相关阅读:
    Internet Explorer 加载项资源库
    Nexus one (Android 2.1升级Android2.2)
    QQ 2011 Beta 抢先体验,很给力啊!
    HttpWebRequest 下载网页Html代码 POST方式(站内使用了form方式) System.Net.WebException (417) Expectation failed
    WIndows 7 安装.net framework 4.0 失败,错误HRESULT 0xc8000222解决办法
    HttpWebRequest 下载网页Html代码 下载文件(Remote和FTP)Get方式
    CS0016: 未能写入(A compilation error has occurred.HttpCompileException: error CS0016: Could not write to output file 拒绝访问)
    如何只保留一个应用程序实例
    用excel打开从系统导出的csv文件时未分列
    Unhandled Error in Silverlight Application 无法下载 Silverlight 应用程序。请查看 Web 服务器设置
  • 原文地址:https://www.cnblogs.com/jyd0124/p/doub.html
Copyright © 2020-2023  润新知