美文网首页程序员
【python】爬虫代码的封装,以豆瓣新片榜爬取为例

【python】爬虫代码的封装,以豆瓣新片榜爬取为例

作者: 山竹山竹px | 来源:发表于2020-07-23 13:59 被阅读0次

    目的

    如图

    封装前

    url = "https://movie.douban.com/chart"
    header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'}
    res = requests.get(url,headers=header)
    if res.status_code == 200:
        html = BeautifulSoup(res.text,"html.parser")
        datas = html.find_all("div", class_="pl2")
        for data in datas:
            name = data.find('a').text.replace(" ", "").replace("\n", "")
            score = data.find('span',class_="rating_nums").text
            num = data.find('span',class_="pl").text
            print(name+'【'+score+num+'】')
    else:
        print(res.status_code)
    

    返回

    汉密尔顿/汉密尔顿音乐剧【9.5(29446人评价)】
    灰猎犬号/怒海战舰(台)/雷霆战舰:猎犬号(港)【8.3(35428人评价)】
    永生守卫/不死军团(港/台)/老卫兵【6.3(11672人评价)】
    好久不见,武汉/LongTimeNoSee,Wuhan【8.3(14613人评价)】
    猎谎者/LiarHunter【6.8(8434人评价)】
    侵入者/恶‧回家(港)/诡妹(台)【6.5(16341人评价)】
    咱们裸熊:电影版/咱们裸熊大电影/熊熊遇见你电影版【7.5(5218人评价)】
    翻译疑云/叛译同谋(港)/TheTranslators【7.3(12496人评价)】
    前哨/72小时前哨救援(台)/前哨基地【7.1(5127人评价)】
    想哭的我戴上了猫的面具/无限/想哭的我戴上了猫【6.4(13422人评价)】

    第一次封装代码(有几处问题,以下一个个解决)

    def movie_spider():
        url = "https://movie.douban.com/chart"
        header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'}
        res = requests.get(url,headers=header)
        if res.status_code == 200:
            html = BeautifulSoup(res.text,"html.parser")
            datas = html.find_all("div", class_="pl2")
            for data in datas:
                name = data.find('a').text.replace(" ", "").replace("\n", "")
                score = data.find('span',class_="rating_nums").text
                num = data.find('span',class_="pl").text
                return name,score,num
        else:
            print(res.status_code)
    
    movie_spider()
    

    第一个问题

    返回什么都没有

    解决:将 movie_spider() 进行赋值

    name,score,num = movie_spider()
    print(name+'【'+score+num+'】')
    

    其他代码不变,返回一条

    汉密尔顿/汉密尔顿音乐剧【9.5(29446人评价)】

    第二个问题

    只返回了一个。

    原因是return相当于函数的结束,它位于for循环体内,那么执行完第一个循环之后,就会碰到 return返回结果就是第一个循环的结果。

    所以首先确定,return 应该放在 for 循环的外面,跟def 是一体。

    那么只是把它放在外面,就可以了么?【思考:它会返回什么呢?

    答案贴在文末

    最终解决

    不能像循环那样,一条一条的输出/返回,需要先把循环得到的【打包】

    def movie_spider():
        url = "https://movie.douban.com/chart"
        header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'}
        res = requests.get(url,headers=header)
        html = BeautifulSoup(res.text,"html.parser")
        datas = html.find_all("div", class_="pl2")
        list = []
        for data in datas:
            name = data.find('a').text.replace(" ", "").replace("\n", "")
            score = data.find('span',class_="rating_nums").text
            num = data.find('span',class_="pl").text
            list.append(name+'【'+score+num+'】')
        return list
    
    list = movie_spider()
    print(list)
    

    返回列表

    ['汉密尔顿/汉密尔顿音乐剧【9.5(29454人评价)】', '灰猎犬号/怒海战舰(台)/雷霆战舰:猎犬号(港)【8.3(35451人评价)】', '永生守卫/不死军团(港/台)/老卫兵【6.3(11678人评价)】', '好久不见,武汉/LongTimeNoSee,Wuhan【8.3(14616人评价)】', '猎谎者/LiarHunter【6.8(8434人评价)】', '侵入者/恶‧回家(港)/诡妹(台)【6.5(16343人评价)】', '咱们裸熊:电影版/咱们裸熊大电影/熊熊遇见你电影版【7.5(5219人评价)】', '翻译疑云/叛译同谋(港)/TheTranslators【7.3(12502人评价)】', '前哨/72小时前哨救援(台)/前哨基地【7.1(5131人评价)】', '想哭的我戴上了猫的面具/无限/想哭的我戴上了猫【6.4(13422人评价)】']

    总结

    爬虫封装的时候,不是简单的把 print 改为 return

    因为print是在for循环内,而return是在def内。

    比如在爬取豆瓣新片榜的时候,应该将每次循环取到的数据,合成一个list,return list


    答案是 ”想哭的我戴上了猫的面具/无限/想哭的我戴上了猫【6.4(13422人评价)】“

    相关文章

      网友评论

        本文标题:【python】爬虫代码的封装,以豆瓣新片榜爬取为例

        本文链接:https://www.haomeiwen.com/subject/lsxhlktx.html