• Python实战-爬取豆瓣top250评分高于指定值的电影信息


    思路

    1. 要获得怎么样的数据

    2. 找到数据来源

    3. 模拟浏览器发送请求获得数据

    4. 处理数据,保存数据

    第一步:

    在这里数据是豆瓣top250中高于指定分数的电影信息

    信息有:名称,评分,格言

    第二步:

    数据在网页html中,这里我使用xpath语法分析htm代码提取数据即可

    当然也有其它方法比如:找出页面请求的数据包,抓包分析,找出数据来源

     首页的url=https://movie.douban.com/top250

    第二页的url为=https://movie.douban.com/top250?start=25

    故猜测第k页的url只需start为25*(k-1)

    所以我们枚举url,提取有效的数据。

    第三步:

    获得网页源码是一般是发送get请求。故

    1. 制定请求头
    2. 找到url
    3. 模拟浏览器发送数据
    def GetHelpfulElement(Html,socre):#根据html代码获得希望的element列表
        Xpath=r'//div[@ class="item"]//div[@ class="star"]/span[2][text()>={}]/../../..'.format(socre)
        HtmlElement=etree.HTML(Html)
        return HtmlElement.xpath(Xpath)
    def GetHtml(url):#根据url获得html字符串
        Headers={
        "User - Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
        }
        resp=requests.get(url,headers=Headers)
        return resp.content.decode()

    最后一步就是代码了

    数据保存在date文件。

    mport  requests
    from lxml import etree
    from pprint import pprint
    import re
    '''
    目的:爬取豆瓣top250中 评分高于指定值的电影名字,导演,演员信息,评分。
    url="https://movie.douban.com/top250?start={}"25的增加,10次即可
    针对每个html字符串用xpath语法进行处理
    1.找出符合条件的element元素
    2.对element元素进行信息提取成字典形式
    3.把每一页的信息整理成一个列表追加即可
    '''
    def GetHelpfulElement(Html,socre):#根据html代码获得希望的element列表
        Xpath=r'//div[@ class="item"]//div[@ class="star"]/span[2][text()>={}]/../../..'.format(socre)
        HtmlElement=etree.HTML(Html)
        return HtmlElement.xpath(Xpath)
    def GetHtml(url):#根据url获得html字符串
        Headers={
        "User - Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
        }
        resp=requests.get(url,headers=Headers)
        return resp.content.decode()
    def HandleList(Mylist):#处理xpath的获得的列表 返回第一个,否则返回None
        return Mylist[0] if len(Mylist)!=0 else None
    def ElementToDict(Element):#一个elemengt信息转化为dict
        ret={}
        html=etree.tostring(Element,encoding="utf-8").decode()
        Element=etree.HTML(html)#不知道为什么只有这样,每次函数得到的信息才不同
        RatingXpath=r'//span[@class="rating_num"]/text()'
        TitleXpath=r'//a/span[@class="title"]/text()'
        QuoteXpath=r'//span[@class="inq"]/text()'
    
        ret['rating:num']=HandleList(Element.xpath(RatingXpath))
        ret['title'] = HandleList(Element.xpath(TitleXpath))
        ret['quote'] = HandleList(Element.xpath(QuoteXpath))
    
        return ret
    def ElementlistToDictlist(Elementlist):#element列表转化为有用的dict列表
        Mylist=[]
        for i in Elementlist:
            Mylist.append(ElementToDict(i))
        return Mylist
    def Save(Mydict):#保存一条信息
        Keylist = ['title', 'rating:num', 'quote']
        NameList = ['名称', '评分', '格言']
        with open('date.txt','a',encoding='utf-8') as fp:
            for i in range(len(Keylist)):
                fp.write(NameList[i])
                fp.write(' : ')
                fp.write(Mydict[Keylist[i]] if Mydict[Keylist[i]]!=None else " ")
                fp.write('
    ')
            fp.write('
    ')
    def run(score):#实现主要逻辑
        TempUrl = r"https://movie.douban.com/top250?start={}"
        Dictlist =[]
        for numbers in range(10):
            Url = TempUrl.format(numbers * 25)
            ElementList = GetHelpfulElement(GetHtml(Url), score)
            TempDictList= ElementlistToDictlist(ElementList)
    
            global total
            total+=len(TempDictList)
            for i in TempDictList:
                Save(i)
    if __name__ == '__main__':
        RatingNum=float(input("请输入最低评分:"))
        total=0
        print("请稍等...")
        run(RatingNum)
        print("共有:",total,"个结果。")
    
  • 相关阅读:
    输出流OutputStream简单理解
    IO流实现写入规定的acci码值
    事务的ACID属性&&五种状态
    java基础总结之Hashtable
    HBase
    oracle交换分区
    ArrayList 和 LinkedList 的区别(底层数据结构): 什么时候使用arrayList,什么时候使用LinkedList (一个小时)
    Mac中MariaDB数据库的安装步骤
    Mac OS X中MacPorts安装和使用(linux 的 yum)
    SFTP秘钥认证
  • 原文地址:https://www.cnblogs.com/dchnzlh/p/10427221.html
Copyright © 2020-2023  润新知